Selle seeria eelmises postituses käisin läbi:
- abstraktsete tundide põhitõed,
- kuidas neid rakendada,
- ja esitas töökoodi näiteid.
Ja kuigi arvan, et abstraktsete klasside mõistmine on objektorienteeritud programmeerimisele tugeva aluse loomisel võtmetähtsusega, näen sageli, et nende võrdlemine liidestega ja nende kasutamise teadmine võib sageli tekitada segadust.
Abstraktsed klassid ja liidesed
Nii et selles postituses jagan ma järgmist:
- kiire värskendus liideste kohta,
- mis on abstraktsed klassid,
- ja siis kuidas teada, millal kasutada üht teist.
See ei tohiks olla kodeerimismahukas artikkel, kuid see peaks aitama teada, millal kirjutada teatud tüüpi koodi, et aidata oma projekte paremini korraldada.
1 Liidesed
Tuletage meelde, et liideste puhul kasutame ka terminit "liidesesse programmeerimine", mille idee on see, et liides määratleb meetodid, mida klass peab rakendama, et täita nimetatud liidesega sõlmitud "lepingut".
Põhiliidese demonstreerimiseks kasutatud kood oli:
<?php
interface iCache
{
public function set($key, $value);
public function get($key);
public function has($key);
}
Kuid pidage meeles, et liidese eesmärk ei ole määratleda pärast koodi kirjutamist. Selle asemel on see tööriist, mida kasutatakse klasside kavandamiseks, kui nad järgivad teatud paradigmat või nõuavad teatud funktsioonide komplekti.
See tähendab, et kui kavatsete koostada klasside komplekti, mis töötavad vahemällu salvestamisega, siis te ei kirjuta klasse kõigepealt. Kõigepealt kirjutate liidese ja seejärel rakendavad klassid selle liidese.
Idee seisneb selles, et igal liidest rakendaval klassil on need funktsioonid garanteeritud.
2 abstraktset klassi
Abstraktsed klassid seevastu võimaldavad meil teha kahte asja:
- rakendama funktsioone, mida alamklassid saavad kasutada,
- rakendama meetodi allkirju, mida alamklassid peavad rakendama.
See võib alguses tunduda pisut vastuoluline, kuid kaaluge järgmist:
Kui teil on teatud tüüpi klass, millel on alamklassist olenemata järjepidev funktsionaalsus, läheb see funktsioon abstraktsesse klassi. Kui teistel meetoditel on vaja meetodit rakendada, sisestage lihtsalt meetodi allkiri ja märkige see abstraktseks.
Siin on näide eelmisest postitusest:
See viib meid kõiki eelmiste näidete ja eelmiste asjade juurde, millele peame liideste ja abstraktsete klasside osas keskenduma, kuid mõne jaoks ei anna see siiski suurt selgust.
Täpsemalt, see ei vasta ikkagi küsimusele: kuidas me otsustame, millal kasutada abstraktset klassi ja millal liidest?
Pealtnäha võib see tunduda pisut segane, kuid on mõned asjad, mida saate otsuse tegemisel kasutada.
Millal me neid kõiki kasutame?
Pidage meeles, et kui tegemist on objektorienteeritud programmeerimisega, saame selle jagada kolmeks erinevaks viisiks:
- Klassid esindavad asja. Neid võib pidada nimisõnadeks.
- Atribuudid või omadused on nagu omadussõnad. Need kirjeldavad objekti või midagi, mida objekt võib endas hoida.
- Meetodid või funktsioonid on nagu tegusõnad. Nad kirjeldavad, mida nad saavad teha.
Nüüd, kui rääkida liidesest, mõelge sellele, mida liides teeb: see kirjeldab ilma rakendamiseta, mida objekt saab teha. Ja kui tegemist on abstraktse klassiga, siis see kirjeldab, mis objekt käitusajal on.
Teisisõnu, hea rusikareegel on see, et kui teil on vaja objektile käitumise kogumit, on liides sobiv viis. Kui teil on vaja kirjeldada, mis objekt on, kasutage abstraktset klassi.
Abstraktsete klasside puhul võtaksin selle sammu edasi ja ütleksin, et see aitab kirjeldada põhiandmete taset, mis kirjeldab objekti või seda, mida see võib lisaks funktsionaalsuse põhitasemele salvestada.
Kas teil on näide?
Nagu enamiku nende postituste sisu puhul, püüan ma tuua näiteid isegi siis, kui see pole spetsiaalselt koodis tehtud. Võib-olla aitab see seda veelgi paremini selgitada:
- Liidestel pole rakendust. Nad garanteerivad ainult selle, mida klass teeb.
- Abstraktsetel klassidel peaks olema juurutamise baastase. See peaks esindama seda, mida klass suudab hoida ja teha, kuid ei ole täielik. Need nõuavad alamklassilt veidi rohkem rakendamist.
Kui töötate objektorienteeritud koodiga, loodan, et see aitab anda juhiseid selle kohta, millal mida kasutada. Kui ei, siis ärge kartke kommentaari jätta (milleks on liikmetel luba :).
Lisaks näeme seda praktikas, kui hakkame kirjutama objektorienteeritud koodi (eelkõige WordPressi jaoks, kuid mitte alati).