{"id":230610,"date":"2022-12-14T14:12:00","date_gmt":"2022-12-14T11:12:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230610"},"modified":"2022-12-14T14:13:32","modified_gmt":"2022-12-14T11:13:32","slug":"wordpressi-vidinad-objektorienteeritud-programmeerimise-tuvastamine","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-objektorienteeritud-programmeerimise-tuvastamine\/","title":{"rendered":"WordPressi vidinad: objektorienteeritud programmeerimise tuvastamine"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kui te pole selle seeria esimest postitust lugenud, soovitan seda, sest me hakkame vidinate API<\/a><\/strong> abil WordPressi jaoks objektorienteeritud koodi kirjutama .<\/p>\n<p>Seerias on j\u00e4\u00e4dvustatud m\u00f5ned asjad:<\/p>\n<ol>\n<li>n\u00e4idata teile vidina p\u00f5hilist luustikku ja seda, miks see on objektorienteeritud,<\/li>\n<li>arutlege, mida peaksite suutma t\u00e4hele panna ja miks<\/li>\n<li>v\u00e4rskendage esmalt Widget Boilerplate&#8217;i otse sellel saidil ja seej\u00e4rel l\u00fckake see GitHubisse,<\/li>\n<li>looge vidin, kasutades API-d ja katlaplaati meie t\u00f6\u00f6 aluseks.<\/li>\n<\/ol>\n<p>Kuid enne seda tahan veenduda, et k\u00f5ik, kes seda loevad, tunnevad objektorienteeritud programmeerimise p\u00f5hiprintsiipe ja neil on k\u00f5ik vajalik WordPressi objektorienteeritud lahenduse loomiseks.<\/p>\n<p>Selleks soovitan j\u00e4rgmist:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-esimest-sammast\/\" title=\"Objektorienteeritud programmeerimise kaks sammast: 1. osa 2-st\">Objektorienteeritud programmeerimise kaks sammast: 1. osa 2-st<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-teist-sammast\/\" title=\"Objektorienteeritud programmeerimise kaks sammast: 2. osa 2-st\">Objektorienteeritud programmeerimise kaks sammast: 2. osa 2-st<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/abstraktsed-klassid-1-osa-abstraktne-kaeitumine\/\" title=\"Abstraktsed klassid, 1. osa \u2013 Abstraktne k\u00e4itumine\">Abstraktsed klassid, 1. osa \u2013 Abstraktne k\u00e4itumine<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/abstraktsed-klassid-2-osa-abstraktsed-klassid-ja-liidesed\/\" title=\"Abstraktsed klassid, 2. osa \u2013 Abstraktsed klassid ja liidesed\">Abstraktsed klassid, 2. osa \u2013 Abstraktsed klassid ja liidesed<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">S\u00f5ltumatu WordPressi arendaja<\/a><\/strong><\/li>\n<\/ol>\n<p>Kui olete kogu selle sisu lugenud, on suurep\u00e4rane. Olete selleks postituseks ja eelseisvateks postitusteks h\u00e4sti ette valmistatud. Kui ei, siis v\u00f5ib \u00fclej\u00e4\u00e4nud lugemises olla auke, kuid postituse sisu peaks olema piisavalt selge.<\/p>\n<h3>Mis leping t\u00e4pselt on?<\/h3>\n<p>Asi on j\u00e4rgmine: <strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-objektorienteeritud-laehenemisviis\/\" title=\"eelmisel n\u00e4dalal\">eelmisel n\u00e4dalal<\/a><\/strong> jagasin natuke koodi ja teavet <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vidinate API<\/a><\/strong> kohta. Ma k\u00e4sitlen seda selles postituses veidi rohkem, enne kui j\u00f5uame kodeerimise intensiivsema osa juurde kahel p\u00f5hjusel:<\/p>\n<ol>\n<li>Ma tahan, et k\u00f5ik, kes seda loevad, oleksid objektorienteeritud koodi kirjutamise osas samal lehel (v\u00e4hemalt selles kontekstis),<\/li>\n<li>M\u00f5istan, et inimesed on erineva taustaga, ja tahan enne j\u00e4tkamist veenduda, et oleme k\u00f5ik v\u00f5imalikult \u00fchel lehel.<\/li>\n<\/ol>\n<p>Kui teil on kogemusi objektorienteeritud koodi kirjutamisel, eriti edasij\u00f5udnutele, v\u00f5ib see tunduda teile lihtsam; muidu loodan, et see varustab teid k\u00f5ige vajalikuga objektorienteeritud tavade tuvastamiseks mitte ainult selle API kohta, vaid ka teiste koodi lugemisel.<\/p>\n<h2>Kuidas tuvastada objektorienteeritud programmeerimist<\/h2>\n<p>V\u00f5ib-olla on loomulik esimene k\u00fcsimus, miks me peame suutma objektorienteeritud programmeerimist tuvastada, lugeda v\u00f5i m\u00f5ista enne selle kirjutamist?<\/p>\n<h3>S\u00f5na halva koodi kohta<\/h3>\n<p>L\u00fchike vastus sellele on j\u00e4rgmine:<\/p>\n<p>Sa ei pea seda tegema, aga mulle on sellest abi. Kui oskate objektorienteeritud programmeerimist lugeda, saate selle paradigmana pakutavate eeliste \u00e4rakasutamiseks edumaa, kuna kavatsete tugineda teiste projektide strateegiatele ja t\u00f6\u00f6le.<\/p>\n<p>See ei t\u00e4henda, et me ei loeks halba koodi, kuid teeme k\u00f5ik endast oleneva, et tuvastada halb kood, tuvastada probleemsed piirkonnad ja seej\u00e4rel teha k\u00f5ik, et v\u00e4ltida selle kaasamist oma t\u00f6\u00f6sse.<\/p>\n<p>Praegu aga vaatame <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vidinate API<\/a><\/strong> -t, et n\u00e4ha, mida saame objektorienteeritud programmeerimise tuvastamiseks teha.<\/p>\n<h3>Tagasi objektorienteeritud programmeerimise juurde<\/h3>\n<p>Eelmises postituses t\u00f5in v\u00e4lja kaks asja, mis n\u00e4itavad, et API on objektorienteeritud (v\u00e4hemalt teatud m\u00e4\u00e4ral):<\/p>\n<ol>\n<li><strong>laiendab<\/strong> m\u00e4rks\u00f5na kasutamine ,<\/li>\n<li>funktsioone, mida peame rakendama.<\/li>\n<\/ol>\n<p>P\u00f5hjus, miks ma tahan seda teemat uuesti l\u00e4bi vaadata, on see, et see tuvastab kaks p\u00f5hiasja, mis on osa objektorienteeritud p\u00f5hiprintsiipidest: <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e4rimine<\/a><\/strong> ja funktsioonide rakendamine (mis on sageli osa <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">abstraktsetest klassidest<\/a><\/strong> ).<\/p>\n<p>M\u00e4rkus enne \u00fclaltoodu vaatamist:<\/p>\n<p>Kui vaatate <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">klassi WP_Widget allikat,<\/a><\/strong> m\u00e4rkate, et seal pole abstraktseid meetodeid. Kuid m\u00f5ned funktsioonid, mida me peame rakendama ja mida ma selles postituses hiljem mainin, on abstraktsete meetodite peamised kandidaadid. Ja ma arutan ka, miks.<\/p>\n<p>Eraldame \u00fclaltoodud teemad kaheks eraldi jaotiseks: P\u00e4rimine ja Abstraktsioonid.<\/p>\n<h3>P\u00e4rand<\/h3>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-objektorienteeritud-laehenemisviis\/\" title=\"Eelmises postituses\">Eelmises postituses<\/a><\/strong> k\u00e4sitlesin p\u00e4rimise suhtelist s\u00fcgavust, nii et ma ei hakka seda siin k\u00e4sitlema. Ma \u00fctlen paar s\u00f5na, kuid ma olen palju rohkem huvitatud abstraktsiooni \u00fcle arutlemisest, mida ma teen hetke p\u00e4rast.<\/p>\n<p>Enne kui l\u00e4hete sellesse liiga kaugele, vaadake palun <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rgmist koodi:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Kuid k\u00f5igepealt saame aru, et iga klass, mis rakendab vidinate API-d, peab kasutama p\u00e4rimist lihtsalt <strong>laiendatud<\/strong> m\u00e4rks\u00f5na t\u00f5ttu.<\/p>\n<p>See t\u00e4hendab, et teatud funktsionaalsuse tase me p\u00e4rime (v\u00f5i saame tasuta) ja funktsionaalsuse taseme, mille peame ise rakendama.<\/p>\n<p>PHP <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">juhendist<\/a><\/strong> :<\/p>\n<blockquote>\n<p>N\u00e4iteks 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>Kui p\u00e4randate funktsionaalsuse klassist, v\u00f5ite avastada, et on oluline kutsuda rangelt vanemkonstruktor (meie funktsioonis <strong>__construct<\/strong> ).<\/p>\n<p>Kuid see t\u00f5statab minu arvates PHP p\u00e4rimisega seotud \u00fche k\u00f5ige olulisema probleemi (ja kogu p\u00f5hjuse, miks ma tahtsin selle jaotise kaasata): kas peame emakonstruktorit selges\u00f5naliselt kutsuma?<\/p>\n<p>Samuti vastavalt <strong><a href=\"http:\/\/www.php.net\/manual\/en\/language.oop5.decon.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">juhendile:<\/a><\/strong><\/p>\n<blockquote>\n<p>Vanemkonstruktoreid ei kutsuta kaudselt v\u00e4lja, kui alamklass m\u00e4\u00e4ratleb konstruktori. \u00dclemkonstruktori k\u00e4ivitamiseks on vaja alamkonstruktoris k\u00f5net <strong>vanematele::__construct()<\/strong>. Kui laps konstruktorit ei defineeri, v\u00f5ib see p\u00e4rida p\u00f5hiklassist nagu tavaline klassimeetod (kui seda ei deklareeritud privaatseks).<\/p>\n<\/blockquote>\n<p>Kuid me saame seda lihtsustada. V\u00f5ib-olla on seda lihtsam meeles pidada:<\/p>\n<ol>\n<li>Kui meie klass kasutab p\u00e4rimist, kuid ei defineeri konstruktorit, kutsutakse v\u00e4lja emakonstruktor.<\/li>\n<li>Kui meie klass kasutab p\u00e4rimist, kuid m\u00e4\u00e4ratleb konstruktori, tuleb emakonstruktsiooni selges\u00f5naliselt kutsuda.<\/li>\n<\/ol>\n<p>V\u00f5i ehk veelgi lihtsamalt:<\/p>\n<ul>\n<li>Kui meie klass konstruktorit ei m\u00e4\u00e4ratle, on kood vaikimisi vanemate konstruktor.<\/li>\n<\/ul>\n<p>On loogiline? L\u00fchidalt, kui me m\u00e4\u00e4ratleme konstruktoris oma atribuudid, l\u00e4htestamise ja koodi, peaks meie klassi konstruktori esimene rida olema k\u00f5ne emakonstruktorile.<\/p>\n<h3>Abstraktsioon<\/h3>\n<p><strong>Et olla t\u00e4iesti selge, ei sisalda klassi WP_Widget<\/strong> l\u00e4htekood abstraktseid meetodeid. Osa sellest on seotud klassi \u00fclesehitusega, osa on seotud tagasi\u00fchilduvusega ja PHP5 funktsioonidega.<\/p>\n<p>See aga ei t\u00e4henda, et me ei saaks tuvastada, milliseid funktsioone v\u00f5iks <strong>abstraktseks<\/strong> m\u00e4rkida. Tegelikult arvan, et see annab p\u00f5hjust, millised klassid tuleks muuta abstraktseks. Kuid k\u00f5igepealt defineerime abstraktsed funktsioonid.<\/p>\n<p><strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kasutusjuhendist<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Abstraktsest klassist p\u00e4rimisel peavad k\u00f5ik vanema klassideklaratsioonis abstraktseks m\u00e4rgitud meetodid olema lapse poolt defineeritud; lisaks peavad need meetodid olema m\u00e4\u00e4ratletud sama (v\u00f5i v\u00e4hem piiratud) n\u00e4htavusega.<\/p>\n<\/blockquote>\n<p>Kui vaadata meie vidina allikat:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Arvan, et on \u00f5iglane \u00f6elda, et <strong>vormi<\/strong> funktsiooni v\u00f5ib m\u00e4rkida <strong>abstraktseks<\/strong>, kuna see on meie rakendusele ainulaadne. Teine viis abstraktsetest funktsioonidest programmeerimise seisukohast m\u00f5elda on endalt k\u00fcsida: millised funktsioonid n\u00f5uavad ainulaadset funktsionaalsust?<\/p>\n<p>Ja antud juhul on <strong>vormifunktsioon<\/strong> just see, kuna iga vidin on selle renderdamise osas unikaalselt erinev. <strong>Vidina<\/strong> funktsiooni v\u00f5iks m\u00e4rkida ka abstraktseks, kuna see v\u00e4ljastab vidina sisu. See sisu p\u00f5hineb loomulikult funktsioonidel, mille oleme oma juurutamisel rakendanud.<\/p>\n<p>Lisaks \u00fctleb klassi <strong>WP_Widget<\/strong> l\u00e4htekood :<\/p>\n<blockquote>\n<p>funktsioon WP_Widget::widget() tuleb alamklassis \u00fcle kanda.&#8217;<\/p>\n<\/blockquote>\n<p>Just seda t\u00fc\u00fcpi funktsioon tuleks m\u00e4rkida abstraktseks. Kuna PHP annab vea, kui funktsioon on m\u00e4rgitud abstraktseks ja seda ei rakendata. Me ei vajanud \u00fchtegi <strong>funktsioonikutset<\/strong> ega midagi sellist.<\/p>\n<p>Teisi funktsioone ei pea aga tingimata abstraktseks m\u00e4rkima ja siin on p\u00f5hjus:<\/p>\n<ol>\n<li><strong>__construct<\/strong> kutsub k\u00f5ige elementaarsemal tasemel v\u00e4lja vanemakonstruktori ja see on vajalik baasklassi l\u00e4htestamiseks. \u00c4rge unustage siiski; saame sellele meetodile lisada oma omadused, mis on meie klassile ainulaadsed.<\/li>\n<li><strong>v\u00e4rskendus\u00a0<\/strong> kasutab teabe serialiseerimiseks emaklassi funktsioone.<\/li>\n<\/ol>\n<p>Seega j\u00e4\u00e4b meile kaks funktsiooni, mida v\u00f5iks klassi kaasaegsemas iteratsioonis abstraktseks m\u00e4rkida.<\/p>\n<h2>J\u00e4rgmisena<\/h2>\n<p>Siinkohal peaksime k\u00f5ik objektorienteeritud koodi osas olema samal lehel. V\u00e4hemalt niipalju, kui me blogipostituste seeriat l\u00e4bi saame.<\/p>\n<p>Alates j\u00e4rgmisest postitusest l\u00e4heme tagasi koodi kirjutamise juurde.<\/p>\n<p>See t\u00e4hendab, et vaatame uuesti <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPressi vidina katlaplaati<\/a><\/strong> ja muudan selle praeguses seisukorras, et v\u00f5tta kasutusele kaasaegsemad PHP-standardid.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161697-61e7280e064dc.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161697-61e7280e064dc.png\" alt=\"WordPressi vidinad: objektorienteeritud programmeerimise tuvastamine\"><\/a><\/p>\n<p>Jagan tehtud muudatusi, p\u00f5hjendusi, miks ja seej\u00e4rel r\u00e4\u00e4gin ka sellest, millist t\u00fc\u00fcpi vidinat me katlaplaadi p\u00f5hjal ehitame (ja me saame seda teha).<\/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>Eesm\u00e4rk on varustada teid k\u00f5ige vajalikuga objektorienteeritud praktika tuvastamiseks nii selles API-s kui ka teistes.<\/p>\n","protected":false},"author":1,"featured_media":235594,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,802,863],"tags":[1165],"class_list":["post-230610","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-php-4","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230610","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=230610"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230610\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/235594"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}