Vad är objektorienterad programmering?

8 minuter läsning
Illustration av objektorienterad programmering med klasser, objekt och deras relationer i ett modernt programmeringsspråk

Objektorienterad programmering (OOP) är en metod för att strukturera kod genom att gruppera data och funktioner i så kallade objekt.

Istället för att skriva linjära instruktioner skapar man mallar (klasser) som representerar verkliga entiteter, vilket gör koden mer logisk, återanvändbar och enklare att underhålla.

I den här artikeln går vi igenom grundstenarna i OOP – klasser, objekt, arv, polymorfism och inkapsling – och hur de används i praktiken i språk som Java och Python.

Grundläggande koncept inom objektorienterad programmering

När man börjar lära sig objektorienterad programmering är det viktigt att förstå de grundläggande koncepten, såsom objekt, klasser, arv, polymorfism och inkapsling.

Genom att förstå alla dessa fundamentala byggstenar kommer du senare att vara bättre rustad att tillämpa OOP-principer för att skapa mer återanvändbar och lättförståelig kod.

Objekt och klasser

I objektorienterad programmering (OOP) är objekt, eller "objects" på engelska, huvudkomponenterna som fungerar som byggklossar i dina program.

Ett objekt är en så kallad instans av en klass och representerar en specifik entitet. Dessa objekt har såkallade attribut (egenskaper) och metoder (funktioner).

Attributen beskriver objektets egenskaper, medan metoderna beskriver vad objektet kan göra, det vill säga dess funktioner.

Ett objekt hade exempelvis kunnat representera en bil. Attributen för bilen kan vara dess färg, märke och årsmodell, medan metoderna kan vara funktioner som starta, stanna och accelerera.

Klasser, eller "classes" på engelska, är en annan viktig del i OOP. En klass fungerar som en mall eller ritning för att skapa objekt och definierar vilka egenskaper och funktioner objektet ska ha.

När vi skapar ett objekt från en klass säger vi att vi instansierar klassen. Klasser möjliggör återanvändning av kod och bidrar till att minska upprepning i programmen.

Arv

Arv, eller "inheritance" på engelska, är en kraftfull funktion i OOP som låter en klass ärva egenskaper och funktioner från en annan klass.

Detta möjliggör kodåteranvändning och skapar en hierarki av klasser som blir enklare att förstå och underhålla. Den klass som ärver från en annan kallas en underklass eller "subclass", medan klassen som den ärver från kallas en överklass eller "superclass".

Arv hjälper oss att skapa mer generella klasser, vilket resulterar i mer flexibel och anpassningsbar kod.

Till exempel kan vi ha en grundläggande klass "Djur" med egenskaper som längd och vikt, och funktioner som äta och sova.

Sedan kan vi skapa flera underklasser som representerar olika djur, såsom "Hund", som ärver egenskaper och funktioner från "Djur"-klassen, men också lägger till hundspecifika egenskaper och funktioner som hundras och skälla.

På så sätt kommer vi att återanvända koden från "Djur"-klassen, och gör vår kod mer organiserad.

Polymorfism

Polymorfism, eller "polymorphism" på engelska, är en viktig del av OOP som gör att objekt från olika klasser kan hanteras som om de tillhör en gemensam klass.

Detta gör koden mer anpassningsbar och dynamisk. Det finns två huvudsakliga tekniker för att uppnå polymorfism: metodöverskuggning (method overriding) och metodöverlagring (method overloading).

  • Metodöverskuggning - Det innebär att en underklass skapar en ny version av en funktion som redan finns i överklassen. Detta gör att objekt från underklassen kan använda den nya funktionen istället för den gamla i överklassen. Ett exempel kan vara när du har en överklass "Djur" med en funktion "ljud" och en underklass "Hund" som överskuggar funktionen "ljud" för att istället skälla.
  • Metodöverlagring - Det innebär att en klass har flera funktioner med samma namn men olika indata. Vilken version av funktionen som används beror på indatan. På så sätt kan samma funktionsnamn användas för att göra olika saker beroende på vilka indata som ges. Ett exempel kan vara en "Räknare"-klass som har flera "addera"-funktioner för att hantera addition av heltal, decimaltal och bråk beroende på vilket format indatan du anger.

Genom att använda dessa tekniker kan vi skapa mer flexibel och dynamisk kod som är enklare att underhålla och anpassa till olika situationer.

Inkapsling

Inkapsling, eller "encapsulation" på engelska, är en teknik som gör det möjligt att begränsa åtkomsten till vissa delar av en klass, såsom egenskaper och funktioner. Vi gör detta för att skydda data och förhindra att andra delar av programmet modifierar informationen på oönskade sätt.

Inkapsling låter oss skapa getter- och setter-funktioner för att kontrollera åtkomsten till klassens egenskaper.

Detta görs ofta genom att använda nyckelord som "private" och "public" för att ange åtkomstnivåer. Med "private" blir en egenskap eller funktion endast tillgänglig inom klassen, medan "public" gör dem tillgängliga även utanför klassen.

Getter- och setter-metoder

Getter- och setter-funktioner är speciella funktioner som används för att hämta och ändra värdena på klassens egenskaper. Dessa funktioner kallas "getters" och "setters" på engelska.

Genom att använda dessa funktioner kan vi se till att egenskaperna bara ändras på rätt och säkert sätt. Detta hjälper till att undvika fel och skydda informationens säkerhet.

OOP i populära programmeringsspråk

Nu när vi har igenom de grundläggande koncepten inom objektorienterad programmering är det dags att titta på hur dessa principer tillämpas i två av de populäraste programmeringsspråken, Java och Python.

Vi kommer också ge exempel på hur dessa koncept kan implementeras i respektive språk.

Java

Java är ett kraftfullt och populärt programmeringsspråk som är helt objektorienterat.

I Java används klasser och objekt för att modellera och organisera kod, och alla metoder och variabler måste tillhöra en klass.

Java stöder arv, polymorfism och inkapsling, vilket gör det möjligt att skapa modulär, återanvändbar och välstrukturerad kod.

Här är ett enkelt exempel på OOP i Java:

// Definiera en klass "Person"
class Person {
  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

// Skapa ett objekt av klassen "Person"
Person person = new Person("Anna", 30);

Python

Python är ett annat populärt programmeringsspråk som stöder objektorienterad programmering. Python är mycket flexibelt och tillåter både OOP och funktionell programmering.

Python använder klasser, objekt, arv, polymorfism och inkapsling för att skapa välorganiserad och återanvändbar kod.

Här är ett enkelt exempel på OOP i Python:

# Definiera en klass "Person"
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        return self.name

    def set_name(self, name):
        self.name = name

    def get_age(self):
        return self.age

    def set_age(self, age):
        self.age = age

# Skapa ett objekt av klassen "Person"
person = Person("Anna", 30)

Andra OOP-språk

Utöver Java, Python och C++ finns det många andra programmeringsspråk som stöder objektorienterad programmering. Några exempel inkluderar C++, C#, Ruby, Swift, Kotlin och JavaScript.

Dessa språk kan variera i syntax och funktioner, men de delar alla grundläggande OOP-koncept som klasser, objekt, arv, polymorfism och inkapsling.

Att lära sig objektorienterad programmering i ett språk kan hjälpa dig att förstå och anpassa dig snabbare till andra OOP-språk.

Fördelar och nackdelar med objektorienterad programmering

Det finns både fördelar och nackdelar med objektorienterad programmering som är viktiga att överväga när du ska välja om denna metod passar ditt projekt.

I det här avsnittet går vi igenom några av de viktigaste för- och nackdelarna med objektorienterad programmering, så att du kan få en bättre förståelse för hur dessa aspekter kan påverka din kod.

Fördelar med objektorienterad programmering

  • Modularitet - En av de stora fördelarna med objektorienterad programmering är att den är modulär. Genom att dela upp programmet i mindre, oberoende delar (objekt och klasser) kan vi isolera funktioner och skapa enklare och mer lättförståelig kod. Det minskar också risken att ändringar i en del av programmet påverkar andra delar negativt.
  • Återanvändbarhet - Objektorienterad programmering uppmuntrar till att använda kod igen, vilket innebär att vi kan skapa en uppsättning gemensamma klasser och objekt som kan användas i flera olika program och projekt. Detta minskar tiden och arbetet som krävs för att utveckla nya program och hjälper till att ta bort onödig upprepning i koden.
  • Enkelhet och läsbarhet - OOP gör koden enklare att förstå och läsa eftersom den uppmuntrar en välstrukturerad och organiserad metod. Genom att använda objekt och klasser som representerar verkliga saker kan vi skapa kod som är mer intuitiv och lättare att följa. Detta gör det lättare för programmerare att snabbt förstå och anpassa sig till nya projekt.

Nackdelar med objektorienterad programmering

  • Ineffektivitet - En möjlig nackdel med objektorienterad programmering är att den kan bli mindre effektiv. Eftersom objekt och funktioner kan innebära extra bearbetning och indirekta anrop kan det resultera i sämre prestanda jämfört med mer direkt och linjär kod. Detta kan vara en avvägning mellan läsbarhet och prestanda som programmerare måste överväga.
  • Lärandekurva - För nybörjare kan objektorienterad programmering ha en brantare inlärningskurva än andra programmeringsmetoder. Att förstå och bemästra koncept som klasser, objekt, arv, polymorfism och inkapsling kan ta tid och ansträngning. Men när dessa koncept väl är förstådda kan objektorienterad programmering bli en mycket effektiv metod för att skapa bra kod.
  • Ökad komplexitet - Även om objektorienterad programmering kan leda till mer lättläst och strukturerad kod, kan det också öka komplexiteten i programmet. Att hantera många objekt, klasser och deras relationer kan bli komplicerat, särskilt i väldigt större projekt.

Objektorienterad programmering (OOP) är en kraftfull och populär programmeringsmetod som är viktig att bemästra för dagens utvecklare. Genom att använda OOP kan du skapa mer modulär, återanvändbar och lättförståelig kod.

Att lära sig OOP är också en investering i din programmeringskompetens och det kommer inte bara göra dig till en bättre och mer efterfrågad programmerare, utan också förbättra din förmåga att tänka logiskt och problemlösa inom många olika områden.