Ako vysvetliť objektovo orientované koncepty programovania šesťročnému dieťaťu

Všimli ste si, ako sa na pracovných pohovoroch vždy pýtajú rovnaké klišé otázky?

Som si istý, že vieš, čo tým myslím.

Napríklad:

Kde sa vidíš o päť rokov?

alebo ešte horšie:

Čo považujete za svoju najväčšiu slabinu?

Uf ... dajte mi pokoj. Odpoveď na túto otázku považujem za veľkú slabosť! Každopádne, nie môj názor.

Aj keď môžu byť také otázky také malicherné, sú dôležité, pretože poskytujú informácie o vás. Váš súčasný stav mysle, váš postoj, vaša perspektíva.

Pri odpovedi by ste mali byť opatrní, pretože môžete odhaliť niečo, čo neskôr ľutujete.

Dnes by som chcel hovoriť o podobnom type otázok v programovacom svete:

Aké sú hlavné princípy objektovo orientovaného programovania?

Bol som na oboch stranách tejto otázky. Je to jedna z tém, ktoré sa pýtajú tak často, že si nemôžete dovoliť vedieť.

Juniorskí a začínajúci vývojári na ňu musia zvyčajne odpovedať. Pretože pre anketára je ľahký spôsob, ako povedať tri veci:

  1. Pripravoval sa kandidát na tento pohovor?

    Bonusové body, ak odpoveď začujete okamžite - ukazuje to seriózny prístup.

  2. Prešiel kandidát fázou výučby?

    Pochopenie princípov objektovo orientovaného programovania (OOP) ukazuje, že ste prekročili rámec kopírovania a vkladania z tutoriálov - už vidíte veci z vyššej perspektívy.

  3. Je porozumenie uchádzača hlboké alebo povrchné?

    Úroveň kompetencie v tejto otázke sa často rovná úrovni kompetencie vo väčšine ostatných predmetov . Dôveruj mi.

Štyri princípy objektovo orientovaného programovania sú zapuzdrenie , abstrakcia , dedenie ,a polymorfizmus .

Tieto slová môžu znieť pre juniorského vývojára strašidelne. A zložité, príliš dlhé vysvetlenia na Wikipédii niekedy zmätok zdvojnásobujú.

Preto chcem ku každému z týchto pojmov podať jednoduché, krátke a jasné vysvetlenie. Môže to znieť ako niečo, čo dieťaťu vysvetlíte, ale v skutočnosti by som rád počul tieto odpovede, keď vediem pohovor.

Zapuzdrenie

Povedzme, že máme program. Má niekoľko logicky odlišných objektov, ktoré navzájom komunikujú - podľa pravidiel definovaných v programe.

Zapuzdrenie sa dosiahne, keď každý objekt udržuje svoj stav v súkromí v rámci triedy. Ostatné objekty nemajú priamy prístup do tohto stavu. Namiesto toho môžu volať iba zoznam verejných funkcií nazývaných metódy.

Objekt teda spravuje svoj vlastný stav pomocou metód - a žiadna iná trieda sa ho nemôže dotknúť, pokiaľ to nie je výslovne povolené. Ak chcete komunikovať s objektom, mali by ste použiť poskytnuté metódy. Ale (predvolene), nemôžete zmeniť stav.

Povedzme, že staviame malú simíkovskú hru. Sú ľudia a je tu mačka. Komunikujú medzi sebou. Chceme použiť zapuzdrenie, takže všetky „mačacie“ logiky zapuzdríme do aCattrieda. Môže to vyzerať takto:

Tu "štát" mačky sa o súkromné premennémood , hungrya energy. Má to aj súkromnú metódu meow(). Môže to nazvať, kedykoľvek chce, ostatné triedy nemôžu mačke povedať, kedy má mňaukať.

Čo môžu urobiť, je definovaný v spoločných metódsleep() , play()a feed(). Každý z nich nejako modifikuje vnútorný stav a môže sa dovolať meow(). Dochádza tak k väzbe medzi súkromným štátom a verejnými metódami.

Toto je zapuzdrenie.

Abstrakcia

Abstrakciu možno považovať za prirodzené rozšírenie zapuzdrenia.

V objektovo orientovanom dizajne sú programy často extrémne veľké. A samostatné objekty medzi sebou veľa komunikujú. Udržiavať takto veľkú základňu kódov celé roky - so zmenami v priebehu procesu - je ťažké.

Abstrakcia je koncept zameraný na zmiernenie tohto problému.

Aplikácia abstrakcie znamená, že každý objekt by mal vystaviť iba mechanizmus na vysokej úrovni na jeho použitie.

Tento mechanizmus by mal skrývať interné podrobnosti implementácie. Mal by odhaliť iba operácie relevantné pre ostatné objekty.

Mysli - kávovar. Robí veľa vecí a robí podivné zvuky pod kapotou. Všetko, čo musíte urobiť, je dať si kávu a stlačiť tlačidlo.

Výhodne by tento mechanizmus mal byť ľahko použiteľný a mal by sa časom meniť len zriedka. Predstavte si to ako malú skupinu verejných metód, ktoré môže ktorákoľvek iná trieda nazvať bez toho, aby „vedeli“, ako fungujú.

Ďalší skutočný príklad abstrakcie?

Popremýšľajte, ako používate telefón:

S telefónom komunikujete iba pomocou niekoľkých tlačidiel. Čo sa deje pod kapotou? Nemusíte vedieť - podrobnosti implementácie sú skryté. Potrebujete vedieť iba krátky súbor akcií.

Zmeny implementácie - napríklad aktualizácia softvéru - zriedka ovplyvnia použitú abstrakciu.

Dedenie

Dobre, videli sme, ako nám zapuzdrenie a abstrakcia môžu pomôcť vyvinúť a udržiavať veľkú základňu kódov.

Ale viete, aký je ďalší častý problém v dizajne OOP?

Objekty sú si často veľmi podobné. Zdieľajú spoločnú logiku. Ale nie sú úplne rovnaké. Uf ...

Ako teda znova použiť bežnú logiku a extrahovať jedinečnú logiku do samostatnej triedy? Jedným zo spôsobov, ako to dosiahnuť, je dedičstvo.

To znamená, že vytvoríte (podradenú) triedu odvodením z inej (nadradenej) triedy. Takto vytvoríme hierarchiu.

Podradená trieda znovu používa všetky polia a metódy nadradenej triedy (spoločná časť) a môže implementovať svoje vlastné (jedinečná časť).

Napríklad:

Ak náš program potrebuje správu verejných a súkromných učiteľov, ale aj iných typov ľudí, ako sú študenti, môžeme implementovať túto triednu hierarchiu.

Týmto spôsobom každá trieda pridáva iba to, čo je pre ňu nevyhnutné, pričom opätovne používa spoločnú logiku s nadradenými triedami.

Polymorfizmus

Sme pri najkomplexnejšom slove! Polymorfizmus znamená v gréčtine „mnoho tvarov“.

Takže už poznáme moc dedičstva a s radosťou ju používame. Ale prichádza tento problém.

Povedzme, že máme rodičovskú triedu a niekoľko detských tried, ktoré z nej dedia. Niekedy chceme použiť kolekciu - napríklad zoznam - ktorý obsahuje kombináciu všetkých týchto tried. Alebo máme implementovanú metódu pre rodičovskú triedu - ale chceli by sme ju použiť aj pre deti.

To je možné vyriešiť pomocou polymorfizmu.

Zjednodušene povedané, polymorfizmus poskytuje spôsob, ako používať triedu presne ako jej rodič, takže pri miešaní typov nedochádza k zámene.Ale každá trieda detí si zachováva svoje vlastné metódy také, aké sú.

To sa zvyčajne deje tak, že sa definuje (nadradené) rozhranie, ktoré sa má znova použiť. Načrtáva sa množstvo bežných metód. Potom každá podradená trieda implementuje svoju vlastnú verziu týchto metód.

Kedykoľvek kolekcia (napríklad zoznam) alebo metóda očakáva inštanciu rodiča (kde sú načrtnuté bežné metódy), jazyk sa postará o vyhodnotenie správnej implementácie bežnej metódy - bez ohľadu na to, ktoré dieťa je odovzdané.

Prezrite si náčrt implementácie geometrických útvarov. Pre výpočet plochy a obvodu znova používajú spoločné rozhranie:

Majú tieto tri postavy dediť rodičia Figure Interfacevám umožní vytvoriť zoznam zmiešané triangles, circlesa rectangles. A správajte sa k nim ako k rovnakému typu predmetu.

Ak sa potom tento zoznam pokúsi vypočítať povrch pre prvok, je nájdená a vykonaná správna metóda. Ak je prvkom trojuholník, trojuholníkyCalculateSurface()sa volá. Ak je to kruh - potom cirlceovCalculateSurface()sa volá. A tak ďalej.

Ak máte funkciu, ktorá s figúrou pracuje pomocou jej parametra, nemusíte ju definovať trikrát - raz pre trojuholník, kruh a obdĺžnik.

Môžete to definovať raz a prijať a Figureako argument. Či už prechádzate okolo trojuholníka, kruhu alebo obdĺžnika - pokiaľ sú implementované CalculateParamter(), na ich type nezáleží.

Dúfam, že to pomohlo. Tieto úplne rovnaké vysvetlenia môžete priamo použiť na pracovných pohovoroch.

Ak nájdete stále niečo ťažko pochopiteľné - neváhajte a opýtajte sa v komentároch nižšie.

Čo bude ďalej?

Byť pripravený odpovedať na jednu z klasických otázok, ktoré sa týkajú otázok po celý čas, je skvelé - ale niekedy vás nikdy na rozhovor neprijmú.

Ďalej sa zameriam na to, čo chcú zamestnávatelia vidieť v juniorskom vývojárovi a ako vyčnievať z davu pri hľadaní zamestnania.

Zostaňte naladení.