{"id":229716,"date":"2022-11-22T15:41:00","date_gmt":"2022-11-22T12:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229716"},"modified":"2022-11-22T15:44:19","modified_gmt":"2022-11-22T12:44:19","slug":"abstraktsed-klassid-2-osa-abstraktsed-klassid-ja-liidesed","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/abstraktsed-klassid-2-osa-abstraktsed-klassid-ja-liidesed\/","title":{"rendered":"Abstraktsed klassid, 2. osa \u2013 Abstraktsed klassid ja liidesed"},"content":{"rendered":"\n<p>Selle seeria <strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/abstraktsed-klassid-1-osa-abstraktne-kaeitumine\/\" title=\"eelmises postituses\">eelmises postituses<\/a><\/strong> k\u00e4isin l\u00e4bi:<\/p>\n<ul>\n<li>abstraktsete tundide p\u00f5hit\u00f5ed,<\/li>\n<li>kuidas neid rakendada,<\/li>\n<li>ja esitas t\u00f6\u00f6koodi n\u00e4iteid.<\/li>\n<\/ul>\n<p>Ja kuigi arvan, et abstraktsete klasside m\u00f5istmine on objektorienteeritud programmeerimisele tugeva aluse loomisel v\u00f5tmet\u00e4htsusega, n\u00e4en sageli, et nende v\u00f5rdlemine liidestega ja nende kasutamise teadmine v\u00f5ib sageli tekitada segadust.<\/p>\n<h2>Abstraktsed klassid ja liidesed<\/h2>\n<p>Nii et selles postituses jagan ma j\u00e4rgmist:<\/p>\n<ul>\n<li>kiire v\u00e4rskendus liideste kohta,<\/li>\n<li>mis on abstraktsed klassid,<\/li>\n<li>ja siis kuidas teada, millal kasutada \u00fcht teist.<\/li>\n<\/ul>\n<p>See ei tohiks olla kodeerimismahukas artikkel, kuid see peaks aitama teada, millal kirjutada teatud t\u00fc\u00fcpi koodi, et aidata oma projekte paremini korraldada.<\/p>\n<h3>1 Liidesed<\/h3>\n<p>Tuletage meelde, et liideste puhul kasutame ka terminit &quot;liidesesse programmeerimine&quot;, mille idee on see, et liides m\u00e4\u00e4ratleb meetodid, mida klass peab rakendama, et t\u00e4ita nimetatud liidesega s\u00f5lmitud &quot;lepingut&quot;.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a>P\u00f5hiliidese demonstreerimiseks kasutatud <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kood oli:<\/a><\/p>\n<pre><code>&lt;?php\n\ninterface iCache \n{\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n<\/code><\/pre>\n<p>Kuid pidage meeles, et liidese eesm\u00e4rk ei ole m\u00e4\u00e4ratleda p\u00e4rast koodi kirjutamist. Selle asemel on see t\u00f6\u00f6riist, mida kasutatakse klasside kavandamiseks, kui nad j\u00e4rgivad teatud paradigmat v\u00f5i n\u00f5uavad teatud funktsioonide komplekti.<\/p>\n<p>See t\u00e4hendab, et kui kavatsete koostada klasside komplekti, mis t\u00f6\u00f6tavad vahem\u00e4llu salvestamisega, siis te ei kirjuta klasse k\u00f5igepealt. K\u00f5igepealt kirjutate liidese ja seej\u00e4rel rakendavad klassid selle liidese.<\/p>\n<p>Idee seisneb selles, et igal liidest rakendaval klassil on need funktsioonid garanteeritud.<\/p>\n<h3>2 abstraktset klassi<\/h3>\n<p>Abstraktsed klassid seevastu v\u00f5imaldavad meil teha <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5b2936875807f041e98a87f8a5627e8b#file-00-taxonomy-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kahte asja:<\/a><\/strong><\/p>\n<ol>\n<li>rakendama funktsioone, mida alamklassid saavad kasutada,<\/li>\n<li>rakendama meetodi allkirju, mida alamklassid peavad rakendama.<\/li>\n<\/ol>\n<p>See v\u00f5ib alguses tunduda pisut vastuoluline, kuid kaaluge j\u00e4rgmist:<\/p>\n<p>Kui teil on teatud t\u00fc\u00fcpi klass, millel on alamklassist olenemata j\u00e4rjepidev funktsionaalsus, l\u00e4heb see funktsioon abstraktsesse klassi. Kui teistel meetoditel on vaja meetodit rakendada, sisestage lihtsalt meetodi allkiri ja m\u00e4rkige see <strong>abstraktseks<\/strong>.<\/p>\n<p>Siin on n\u00e4ide <strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/abstraktsed-klassid-1-osa-abstraktne-kaeitumine\/\" title=\"eelmisest postitusest:\">eelmisest postitusest:<\/a><\/strong><\/p>\n<p>See viib meid k\u00f5iki eelmiste n\u00e4idete ja eelmiste asjade juurde, millele peame liideste ja abstraktsete klasside osas keskenduma, kuid m\u00f5ne jaoks ei anna see siiski suurt selgust.<\/p>\n<p>T\u00e4psemalt, see ei vasta ikkagi k\u00fcsimusele: kuidas me otsustame, millal kasutada abstraktset klassi ja millal liidest?<\/p>\n<p>Pealtn\u00e4ha v\u00f5ib see tunduda pisut segane, kuid on m\u00f5ned asjad, mida saate otsuse tegemisel kasutada.<\/p>\n<h2>Millal me neid k\u00f5iki kasutame?<\/h2>\n<p>Pidage meeles, et kui tegemist on objektorienteeritud programmeerimisega, saame selle jagada kolmeks erinevaks viisiks:<\/p>\n<ul>\n<li>Klassid esindavad asja. Neid v\u00f5ib pidada nimis\u00f5nadeks.<\/li>\n<li>Atribuudid v\u00f5i omadused on nagu omaduss\u00f5nad. Need kirjeldavad objekti v\u00f5i midagi, mida objekt v\u00f5ib endas hoida.<\/li>\n<li>Meetodid v\u00f5i funktsioonid on nagu tegus\u00f5nad. Nad kirjeldavad, mida nad saavad teha.<\/li>\n<\/ul>\n<p>N\u00fc\u00fcd, kui r\u00e4\u00e4kida liidesest, m\u00f5elge sellele, mida liides teeb: see kirjeldab ilma rakendamiseta, mida objekt saab teha. Ja kui tegemist on abstraktse klassiga, siis see kirjeldab, mis objekt k\u00e4itusajal on.<\/p>\n<p>Teisis\u00f5nu, hea rusikareegel on see, et kui teil on vaja objektile k\u00e4itumise kogumit, on liides sobiv viis. Kui teil on vaja kirjeldada, mis objekt on, kasutage abstraktset klassi.<\/p>\n<p>Abstraktsete klasside puhul v\u00f5taksin selle sammu edasi ja \u00fctleksin, et see aitab kirjeldada p\u00f5hiandmete taset, mis kirjeldab objekti v\u00f5i seda, mida see v\u00f5ib lisaks funktsionaalsuse p\u00f5hitasemele salvestada.<\/p>\n<h3>Kas teil on n\u00e4ide?<\/h3>\n<p>Nagu enamiku nende postituste sisu puhul, p\u00fc\u00fcan ma tuua n\u00e4iteid isegi siis, kui see pole spetsiaalselt koodis tehtud. V\u00f5ib-olla aitab see seda veelgi paremini selgitada:<\/p>\n<ul>\n<li><strong>Liidestel pole rakendust.<\/strong> Nad garanteerivad ainult selle, mida klass teeb.<\/li>\n<li><strong>Abstraktsetel klassidel peaks olema juurutamise baastase<\/strong>. See peaks esindama seda, mida klass suudab hoida ja teha, kuid ei ole t\u00e4ielik. Need n\u00f5uavad alamklassilt veidi rohkem rakendamist.<\/li>\n<\/ul>\n<p>Kui t\u00f6\u00f6tate objektorienteeritud koodiga, loodan, et see aitab anda juhiseid selle kohta, millal mida kasutada. Kui ei, siis \u00e4rge kartke kommentaari j\u00e4tta (milleks on liikmetel luba :).<\/p>\n<p>Lisaks n\u00e4eme seda praktikas, kui hakkame kirjutama objektorienteeritud koodi (eelk\u00f5ige WordPressi jaoks, kuid mitte alati).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Objektorienteeritud koodi kirjutamisel on oluline m\u00f5ista abstraktsete klasside ja liideste erinevust.<\/p>\n","protected":false},"author":1,"featured_media":164774,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,842],"tags":[1165],"class_list":["post-229716","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-opetused","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=229716"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229716\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/164774"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=229716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=229716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=229716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}