"Hej, Amigo! Idag ska jag öppna en ny och intressant värld för dig. Jag pratar om objektorienterad programmering (OOP). Du har redan lärt känna klasser och objekt. Idag ska du gå att lära sig mer om dem, mycket mer."

Vi börjar med de fyra pelarna i OOP. De är abstraktion, inkapsling, arv och polymorfism. (Det brukade vara tre, men abstraktion lades till senare)

1) Abstraktion.

Ett bra exempel på abstraktion i verkligheten är arbetsbeskrivningar på ett företag. En jobbtitel är en sak, men dess uppgifter är en helt annan sak.

Föreställ dig att du skapar organisationsdiagrammet för ditt framtida företag. Du kan dela upp uppgifterna som sekreterare och sprida dem på flera andra befattningar. Du kan dela upp VD:s jobb i flera separata positioner: finanschef, teknisk chef, marknadschef, personalchef. Eller så kan du kombinera tjänsterna som kontorschef och rekryterare till en.

Anta att du kommer på namn på befattningar på ditt företag, och sedan "disponerar" du ansvaret för dessa befattningar. Det är abstraktion - att dela upp något stort och monolitiskt i flera små delar.

OOP: grundläggande principer - 1

Ur en programmerares perspektiv är abstraktion korrekt indelning av ett program i objekt.

Ett stort program kan vanligtvis representeras som interagerande objekt på ett dussin olika sätt. Abstraktion låter dig välja ut ett objekts huvudsakliga egenskaper och utelämna allt mindre viktigt.

Abstraktion är som en militär strategi. Om du väljer fel strategi kommer ingen genialisk taktik att rädda dagen.

2) Inkapsling.

Inkapsling är tänkt att förbättra interaktionen mellan objekt genom att förenkla dem.

OOP: grundläggande principer - 2

Det bästa sättet att förenkla något är att dölja allt komplicerat för dem som inte behöver veta om det. Om du till exempel satte dig bakom styrreglagen på ett Boeing-jet, skulle det ta lång tid att förstå hur de fungerar:

OOP: grundläggande principer - 3

Å andra sidan ser allt enklare ut för passagerarna på planet: de köper en biljett och går ombord på planet, som sedan lyfter och landar. Du kan enkelt flyga från kontinent till kontinent och bara veta hur du "köper en biljett" och "stiger på ett flyg". Vi ser inget av komplexiteten i att förbereda planet för flygning, start, landning och olika potentiella nödsituationer. Och vi har inte nämnt satellitnavigering, autopilot och flygledningscentraler. Detta förenklar vårt liv.

När det gäller programmering är inkapsling att "dölja genomförandet". Jag gillar den definitionen. Vår klass kan innehålla hundratals metoder och implementera mycket komplext beteende i olika situationer. Men vi kan dölja alla dess metoder från nyfikna ögon (genom att markera dem som " privata ") och lämna bara två eller tre metoder för interaktion med andra klasser (genom att markera dem som " offentliga "). Då kommer alla andra klasser i vårt program bara att se – och anropa – dessa få metoder i den här klassen . All komplexitet i klassen kommer att döljas inuti, precis som cockpiten hålls borta från glada passagerare.

3) Arv.

Arv är ett begrepp inom programmering och verkliga livet. Inom programmering är arv ett speciellt förhållande mellan två klasser. Men arv i verkligheten är mycket mer intressant.

Om vi ​​behöver skapa något i verkligheten har vi två alternativ:

1) gör det vi behöver från grunden och lägger ner mycket tid och ansträngning på att göra det.

2) gör det vi behöver med hjälp av saker som redan finns.

Den bästa strategin är denna: Vi tar en befintlig bra lösning, omarbetar och justerar den för att möta våra behov och använder den sedan.

Tänk på mänsklig evolution. Om vi ​​spårar deras början tillbaka till början av livet på planeten, ser vi att miljarder år har gått. Men om vi tänker på människor som utgår från apor, så har bara ett par miljoner år gått. Att skapa något från grunden tar längre tid. Mycket längre.

På liknande sätt kan vi inom programmering skapa en klass baserad på en annan. Den nya klassen blir en ättling (arvinge) till en befintlig klass. Detta är väldigt användbart när du redan har en klass som innehåller 80-90% av de data och metoder som behövs. Vi förklarar helt enkelt en lämplig klass som förälder till vår nya klass. Alla överordnade klassens data och metoder blir automatiskt en del av den nya klassen. Bekvämt, eller hur?

4) Polymorfism.

Polymorfism är ett programmeringskoncept som beskriver situationen där olika implementeringar är gömda bakom samma gränssnitt. För att hitta en analog i verkliga livet kan vi titta på processen att köra bil.

Om en person kan köra lastbil kan han eller hon också sättas bakom ratten i en ambulans eller en sportbil. En person kan köra en bil oavsett vilken typ av bil det är, eftersom de alla har samma kontrollgränssnitt: en ratt, pedaler och en växel. Bilar är organiserade på olika sätt inuti, men de delar alla samma kontrollgränssnitt.

Återgå till programmering, polymorfism låter oss interagera med objekt av olika klasser (vanligtvis med en gemensam förfader) på samma sätt. Betydelsen av detta kan inte nog understrykas. Det blir viktigare när ett program växer sig större.

OOP är principer. Programmeringslagar. Var och en av dem begränsar oss på något sätt, men ger i gengäld enorma fördelar när programmen växer sig stora. De fyra principerna för OOP är som de fyra benen på en stol. Om du tar bort ens en av dem blir hela systemet instabilt.