Vad är en klass?

2012-09-07

Vad är egentligen en klass när vi pratar om programmering – vare sig det är Java, .Net, eller php…? Jag har under 20 års tid använt klasser till höger och vänster, men egentligen aldrig funderat på vad en klass EGENTLIGEN är. Googlar man frågan så finner man tusentals artiklar som handlar om HUR man använder klasser och vilka delar som utgör en klass, men ingenstans har jag funnit svaret på den mer övergripande (något abstrakta) frågeställningen: vad är egentligen en klass?

Därför tog jag ett steg tillbaka och funderade själv; när använder man klasser och varför? Programmerar du Java så kan du inte undvika att använda klasser – du kan inte ens starta ett Java-projekt utan ha en klass med en main() funktion i den. Jo, jag använder klasser för att samla ihop funktioner som hjälper mig att hantera en enskild uppgift. Visst kan en klass i princip utföra flera uppgifter, men läser man ”Clean Code – A Handbook of Agile Software Craftsmanship” av Robert C. Martin så skall ju varje klass endast utföra en endaste sak och göra det transparent (dvs det skall inte råda några tveksamheter om vad klassen gör).

Räcker det med att säga att en klass är samlad kod som innehåller en eller flera metoder som skickar data mellan sig med hjälp av lokala fält? Nej, jag tycker inte det. En klass är ju inte bara en samling funktioner – hela den här samlingen av fält och metoder representerar ju någonting annat. De representerar ju ett objekt, eller? Egentligen inte! Går vi vidare i abstraktionen av fält, metoder, klasser och objekt så landar jag i den här formuleringen:

En klass är en abstraktion av ett objekts strukturella uppbyggnad samt definition av hur den skall konstrueras.

Vad betyder då det här? Jo, att en klass är den abstrakta representationen av ett objekt. Det är först när du har instansierat en klass som det faktiskt blir ett objekt som du processar. Den abstrakta representationen definierar också hur du skall konstruera objektet och vilka externa beroenden som klassen har.

Det här betyder att klassen och objektet är två separata entiteter. Klassen är en mall, en slags ritning över hur objektet faktiskt skall se ut och fungera. Objektet lever sedan sitt liv inne i klassen och styrs av dess regelverk. Klassen definierar hur objektet får användas och vad objektet får göra. Klassen definierar vilka beroenden objektet har att rätta sig efter.

Än sen då?

Hur hjälper det här mig när jag programmerar? Behöver man verkligen förstå att klassen är abstraktion av ett objekt? Det kan det göra – det beror på hur du programmerar och angriper en uppgift. Det är väldigt lätt hänt att man börjar programmera och skriver en klass som gör det, och så bygger man ut den när man upptäcker att det behövs göras mer saker med objektet. Då blir koden väldigt snabbt dålig och svårhanterlig.

Om du då istället tänker på att klassen är en abstraktion så ”tvingar” denna insikt dig att först göra en abstraktion av objektet innan du faktiskt kodar din första rad. Detta kan spara dig mycket problem längre fram…

Vad är Din syn på saken?

Hur långt ifrån sanningen är jag, enligt dig? Skriv en kommentar och ge mig Din syn på saken.

Annonser