{"id":229634,"date":"2022-11-21T16:56:00","date_gmt":"2022-11-21T13:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229634"},"modified":"2022-11-21T16:57:23","modified_gmt":"2022-11-21T13:57:23","slug":"oop-kaks-teist-sammast","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-teist-sammast\/","title":{"rendered":"OOP kaks teist sammast"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-esimest-sammast\/\" title=\"Nagu ma selle seeria esimeses postituses\">Nagu ma selle seeria esimeses postituses<\/a><\/strong> mainisin, kuulete sageli teemal &quot;The Three Pillars of Object-Oriented Programming&quot;. Samuti v\u00f5ite kuulda objektorienteeritud programmeerimise neljast sambast.<\/p>\n<p>Ja asi pole selles, et neid on kokku seitse v\u00f5i midagi sellist. Selle asemel on see rohkem seotud sellega, mida inimesed peavad OOP-i aluseks: kas on kolm v\u00f5i neli peamist kontseptsiooni?<\/p>\n<p>Eelmisest artiklist (pealkirjast r\u00e4\u00e4kimata) v\u00f5ite aimata, ma usun, et neid on neli.<\/p>\n<p>Ja selles postituses k\u00e4sitlen kahte viimast:<\/p>\n<ul>\n<li>P\u00e4rand,<\/li>\n<li>ja pol\u00fcmorfism<\/li>\n<\/ul>\n<p>Kui olete enne selle artikli lugemist teinud mis tahes t\u00fc\u00fcpi objektorienteeritud programmeerimist, olete t\u00f5en\u00e4oliselt kuulnud v\u00e4hemalt \u00fchest neist.<\/p>\n<p>Vaatamata sellele vaatame iga\u00fcks neist \u00fcksikasjalikumalt.<\/p>\n<h2>Veel kaks OOP-i sammast<\/h2>\n<p>Enne k\u00f5igi nende juurde h\u00fcppamist tahan olla kindel, et olete seni k\u00e4sitletuga kursis.<\/p>\n<h3>S\u00f5na anal\u00fc\u00fcsist<\/h3>\n<p>Ma ei hakka seda m\u00f5tet k\u00e4sitlema, kuid p\u00f5hjus, miks ma n\u00fc\u00fcd objektorienteeritud p\u00f5hit\u00f5dedest r\u00e4\u00e4gin, on see, et me liigume selle materjali teise faasi. Alustasime <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">anal\u00fc\u00fcsifaasi<\/a><\/strong> katmisega, mis h\u00f5lmas j\u00e4rgmist:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/objektorienteeritud-programmeerimine-wordpressis-analueues-1-osa\/\" title=\"Anal\u00fc\u00fcs, 1. osa\">Anal\u00fc\u00fcs, 1. osa<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/objektorienteeritud-programmeerimine-wordpressis-analueues-2-osa\/\" title=\"Anal\u00fc\u00fcs, 2. osa\">Anal\u00fc\u00fcs, 2. osa<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/objektorienteeritud-programmeerimine-wordpressis-klientide-ootuste-moistmine\/\" title=\"Klientide ootuste m\u00f5istmine\">Klientide ootuste m\u00f5istmine<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/objektorienteeritud-programmeerimine-wordpressis-toeoearuanne\/\" title=\"T\u00f6\u00f6aruanne\">T\u00f6\u00f6aruanne<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/objektorienteeritud-programmeerimine-wordpressis-nouded-ja-tingimused\/\" title=\"Tingimused\">Tingimused<\/a><\/li>\n<\/ol>\n<h3>N\u00fc\u00fcd Arengu juurde<\/h3>\n<p>Ja n\u00fc\u00fcd oleme <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">arendusfaasis<\/a><\/strong>. M\u00f5ned v\u00f5ivad seda nimetada p\u00f5hit\u00f5dedeks (kuid ma olen rahul, et ilma p\u00f5hialusteta ei saa head arendust teha, nii et see on nii (.<\/p>\n<p>Kui te pole <strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-esimest-sammast\/\" title=\"eelmist postitust\">eelmist postitust<\/a><\/strong> lugenud, soovitan seda teha enne j\u00e4tkamist, kuna see h\u00f5lmab abstraktsiooni, kapseldamise ja selle seost WordPressiga.<\/p>\n<h3>3 P\u00e4rand<\/h3>\n<p>P\u00e4rimise kontseptsiooni on \u00fcsna lihtne j\u00e4rgida. See t\u00e4hendab, et \u00fcks klass v\u00f5ib p\u00e4rida teise klassi atribuute. Toon selle kohta m\u00f5ne n\u00e4ite, kuid lubage mul esitada selle postituse jaoks t\u00f6\u00f6tav m\u00e4\u00e4ratlus:<\/p>\n<blockquote>\n<p>P\u00e4rimine viitab ideele, et \u00fchel klassil, kuigi sellel on oma rakendus, p\u00e4rib see s\u00f5na otseses m\u00f5ttes \u00fclemklassi omadused, funktsioonid ja \u00fcldise teostuse.<\/p>\n<\/blockquote>\n<h4>N\u00e4ide 1: dokument<\/h4>\n<p>V\u00e4ga lihtsalt \u00f6eldes oletame, et teil on klass nimega Dokument ja dokumendil on pealkiri ja sellel on sisu. Seej\u00e4rel on dokumendi alamklass, millel on kuup\u00e4eva ja kellaaja atribuudid. V\u00f5iksime seda nimetada PostDocument v\u00f5i PageDocument.<\/p>\n<p>See t\u00e4hendab, et PageDocument <strong>p\u00e4rib<\/strong> Dokumendi atribuudid ja atribuudid, lisades sellele ka oma teostuse. On loogiline?<\/p>\n<p>Kui ei, siis \u00e4rge muretsege. See ei pruugi alati alguses &quot;kl\u00f5psata&quot;, nii et vaatame teist n\u00e4idet.<\/p>\n<h4>N\u00e4ide 2: S\u00f5num<\/h4>\n<p>Oletame, et meil on s\u00f5numiklass. S\u00f5numil on tavaliselt kaks omadust:<\/p>\n<ul>\n<li>1 saatja,<\/li>\n<li>2 Saaja.<\/li>\n<\/ul>\n<p>On aus \u00f6elda, et s\u00f5numeid on erinevat t\u00fc\u00fcpi, eks? See t\u00e4hendab, et v\u00f5ib-olla on meil meilis\u00f5num v\u00f5i teksts\u00f5num.<\/p>\n<p>Meilis\u00f5numil on endiselt saatja ja saaja, kuid sellel on palju muud, eks? Sellel on sellised asjad nagu:<\/p>\n<ul>\n<li>teemarida,<\/li>\n<li>valikuline lisand,<\/li>\n<li>teine \u200b\u200bsaatjate komplekt, kellele see on saadetud,<\/li>\n<li>tugi teiste avalikult v\u00f5i privaatselt s\u00f5numisse kopeerimiseks,<\/li>\n<li>ja palju muud.<\/li>\n<\/ul>\n<p>Teksts\u00f5numis seevastu ei pruugi olla k\u00f5ike \u00fclaltoodut. Oletame, et r\u00e4\u00e4gime lihtsast SMS-s\u00f5numist (v\u00f5rreldes rikasteksts\u00f5numiga n\u00e4iteks Hangoutsis, Telegramis, iMessage&#8217;is v\u00f5i mis iganes muus saadaval).<\/p>\n<p>See klass:<\/p>\n<ul>\n<li>olema seotud telefoninumbriga,<\/li>\n<li>v\u00f5ib h\u00f5lmata r\u00fchma teisi adressaate, kes k\u00f5ik on avalikud,<\/li>\n<li>operaator (see on mobiilsideteenuse pakkuja),<\/li>\n<li>maksimaalne m\u00e4rkide arv, mida see v\u00f5ib sisaldada<\/li>\n<li>v\u00f5imalus jagada \u00fcks s\u00f5num mitmeks s\u00f5numiks, kui m\u00e4rkide maksimaalne arv \u00fcletab teatud t\u00e4hem\u00e4rkide arvu.<\/li>\n<\/ul>\n<p>Kuid see tekitab siiski k\u00fcsimusi omaduste ja meetodite (v\u00f5i \u00fcldisemalt rakendamise kohta, eks?)<\/p>\n<h4>S\u00f5na rakendamisest<\/h4>\n<p>Kui r\u00e4\u00e4kida objektorienteeritud programmeerimisest, on meil nn juurdep\u00e4\u00e4su modifikaatorid. V\u00f5ib-olla olete neid mujal lugenud, n\u00e4iteks n\u00e4htavuse muutjatena v\u00f5i millegi sellisena.<\/p>\n<p>K\u00f5ik on sama.<\/p>\n<p>L\u00fchidalt v\u00f5ib neid modifikaatoreid m\u00e4\u00e4ratleda j\u00e4rgmiselt:<\/p>\n<blockquote>\n<p>M\u00e4rks\u00f5nad, mis m\u00e4\u00e4ravad, millistel klassidel on juurdep\u00e4\u00e4s olemasolevale teabele.<\/p>\n<\/blockquote>\n<p>Lucikly, sellest osast on lihtne aru saada:<\/p>\n<ul>\n<li><strong>privaatsed<\/strong> atribuudid ja funktsioonid on juurdep\u00e4\u00e4setavad ainult klassile, milles need on m\u00e4\u00e4ratletud. See t\u00e4hendab, et PostDocument ei saa kasutada midagi dokumendis, mis on m\u00e4rgitud privaatseks. K\u00f5igil kavatsustel ja eesm\u00e4rkidel pole PostDocument isegi teadlik selle teabe olemasolust.<\/li>\n<li><strong>kaitstud<\/strong> omadused ja funktsioonid on juurdep\u00e4\u00e4setavad klassile, milles need on m\u00e4\u00e4ratletud, ja mis tahes klassile, mis on j\u00e4rglane. See t\u00e4hendab, et igal klassil, mis p\u00e4rib andmed baasklassist v\u00f5i \u00fclemklassist, on sellele juurdep\u00e4\u00e4s. Seega, erinevalt <strong>privaatsetest<\/strong> juurutamise \u00fcksikasjadest, p\u00e4\u00e4seb PostDocument juurde dokumendi teabele, kui see on kaitstuks m\u00e4rgitud.<\/li>\n<li><strong>avalikud<\/strong> omadused ja funktsioonid on k\u00f5igile k\u00e4ttesaadavad. Sellel pole tegelikult midagi pistmist p\u00e4rimisega, vaid rohkem kapseldamisega, kui \u00fcldse. Selle asemel tuleb otsustada, millele tahame, et teised objektid p\u00e4\u00e4seksid juurde.<\/li>\n<\/ul>\n<p>Kuidas siis rakendamist k\u00e4sitletakse? See on keeleti erinev, kuid PHP ei toeta seda, mida nimetatakse &quot;mitmekordseks p\u00e4randiks&quot;. Lihtsamalt \u00f6eldes <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">saab PHP antud klass p\u00e4rida (v\u00f5i laiendada) ainult \u00fchte teist klassi<\/a>. Mitte mitut klassi (m\u00f5ned keeled toetavad seda).<\/p>\n<blockquote>\n<p>Klassi laiendamisel p\u00e4rib alamklass \u00fclemklassilt k\u00f5ik avalikud ja kaitstud meetodid. Kui klass neid meetodeid ei alista, s\u00e4ilitavad need oma algsed funktsioonid.<\/p>\n<\/blockquote>\n<p>Meie n\u00e4ites ei saa me tutvustada teist klassi, n\u00e4iteks WrittenDocument, mis p\u00e4rib nii PageDocument kui ka PostDocument. See on kas \u00fcks v\u00f5i teine. Ja v\u00e4\u00e4rib m\u00e4rkimist, et kui see p\u00e4rib PostDocumentilt, p\u00e4rib see teabe ka dokumendist, kuna see on klassi alamklassi alamklass.<\/p>\n<h3>4 Pol\u00fcmorfism<\/h3>\n<p>N\u00fc\u00fcd, kui meil on paigas p\u00e4rimise p\u00f5hidefinitsioon, v\u00f5ime r\u00e4\u00e4kida pol\u00fcmorfismist. Hea uudis on see, et see on suur ja imelik s\u00f5na v\u00e4ga lihtsa kontseptsiooni jaoks.<\/p>\n<p>Halb uudis on see, et me pole r\u00e4\u00e4kinud liidestest ega abstraktsetest klassidest. Need on tulemas, kuid neid peetakse nelja samba osaks, nii et \u00e4rge nende p\u00e4rast praegu muretsege.<\/p>\n<p>Selle asemel m\u00f5elge sellele j\u00e4rgmiselt:<\/p>\n<blockquote>\n<p>Pol\u00fcmorfism v\u00f5imaldab meil viidata \u00fche t\u00fc\u00fcbi klassile, kui seda v\u00f5idakse deklareerida teise t\u00fc\u00fcbina.<\/p>\n<\/blockquote>\n<p>See v\u00f5ib endiselt segadust tekitada, kuid kas m\u00e4letate meie n\u00e4iteks \u00fclaltoodud s\u00f5numi n\u00e4idet? Saame luua SMSMessage klassi, mis <strong>laiendab<\/strong> klassi S\u00f5num ja seej\u00e4rel kutsuda sellel teatud meetodeid.<\/p>\n<p>SMSMessage&#8217;il v\u00f5ib olla meetod, mis klassil Message on. Ja kui klass on loodud SMSMessage klassi eksemplarina, kutsub see seda meetodit v\u00e4lja. Samamoodi, kui sellel pole meetodit, kuid selle vanemklassil Message on see olemas, kutsub ta seda meetodit.<\/p>\n<p>M\u00f5nikord on seda k\u00f5ige lihtsam koodis m\u00f5ista, nii et teeme seda.<\/p>\n<p>Esiteks m\u00e4\u00e4ratleme oma <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00f5numiklassi<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nclass Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the Message class.n\";\n  }\n\n  public function receive()\n  {\n    echo \"This message was received from the Message class.n\";\n  }\n}\n<\/code><\/pre>\n<p>Seej\u00e4rel m\u00e4\u00e4ratleme oma <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage<\/a> klassi. Pange t\u00e4hele, et sellel ei ole <strong>Receive()<\/strong> funktsiooni. See on hetkega oluline:<\/p>\n<pre><code>&lt;?php\nclass SMSMessage extends Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the SMSMessage class.n\";\n  }\n}<\/code><\/pre>\n<p>N\u00fc\u00fcd loome oma <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00f5numiklassi<\/a><\/strong> ja kutsume v\u00e4lja m\u00f5ned meetodid:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Ja teeme sama, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kasutades SMSMessage klassi:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Kui soovite kogu skripti, n\u00e4ete seda <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">siin<\/a><\/strong>, saate selle <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">alla laadida<\/a> ja kohapeal k\u00e4ivitada.<\/p>\n<h2>P\u00e4rand, pol\u00fcmorfism ja WordPress<\/h2>\n<p>Siin on n\u00e4pun\u00e4ide (ja me uurime seda l\u00e4hemalt, kui j\u00f5uame liideste ja abstraktsete klasside juurde): kui klass <strong>laiendab<\/strong> teist klassi ja sellel puuduvad juurutamise \u00fcksikasjad, mis tema \u00fclemklassil on, kasutatakse \u00fclemrakendust.<\/p>\n<p>Teine m\u00f5tteviis on &quot;k\u00e4suahela \u00fclest\u00f6\u00f6tamine&quot;. See algab meie loodud klassist madalaima klassiga. Meie \u00fclaltoodud n\u00e4ites on see SMS-s\u00f5num. Kui ta seda sealt ei leia, liigub see klassi, mida ta laiendab. (Ja kui see seda sealt ei leia ja see klass laiendab klassi, proovib ta seal.)<\/p>\n<p>Kogu pol\u00fcmorfne asi on j\u00e4rgmine: oleme loonud \u00fchte t\u00fc\u00fcpi klassi SMSMessage, kuid see kasutab teist t\u00fc\u00fcpi klassi rakendamist (jah, et see p\u00e4rib, kuid see on siiski erinev).<\/p>\n<h3>Kursuste kirjutamine WordPressis<\/h3>\n<p>L\u00f5petuseks tahaksin j\u00e4tta teile selle: ma mainisin midagi sarnast eelmises postituses, kuid tahan seda siin korrata.<\/p>\n<p>Olenemata sellest, kui paljusid neist kontseptsioonidest WordPressi tuum kasutab, pole see oluline, sest me saame WordPressis kirjutada kvaliteetset objektorienteeritud koodi, mis suhtleb WordPressiga ja m\u00e4ngib kenasti WordPressiga (ja muu kolmanda osapoole koodiga \u2013 mitte alati)., kuid mitu korda).<\/p>\n<h2>Mis edasi saab?<\/h2>\n<p>J\u00e4rgmisena vaatleme liideseid ja abstraktsioone.<\/p>\n<p>Need on objektorienteeritud programmeerimise jaoks endiselt olulised, kuid kui olete kahest eelmisest postitusest aru saanud, olete valmis saama eelseisvate kontseptsioonidega kindla kogemuse.<\/p>\n<p>Ja kui ei, siis \u00e4rge muretsege! V\u00f5ite sellest alati kommentaarides r\u00e4\u00e4kida v\u00f5i meili teel rohkem vestelda.<\/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>Siia v\u00f5tan kokku oma kaks postitust OOP nelja samba kohta, mis h\u00f5lmavad p\u00e4rimist ja pol\u00fcmorfismi koos funktsionaalse demoga.<\/p>\n","protected":false},"author":1,"featured_media":164983,"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-229634","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\/229634","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=229634"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229634\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=229634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=229634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=229634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}