{"id":229416,"date":"2022-11-01T11:32:00","date_gmt":"2022-11-01T08:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229416"},"modified":"2022-11-09T06:56:52","modified_gmt":"2022-11-09T03:56:52","slug":"wordpress-laajennusten-rakentajien-ei-pitaeisi-maeaeritellae-koukkuja","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-laajennusten-rakentajien-ei-pitaeisi-maeaeritellae-koukkuja\/","title":{"rendered":"WordPress-laajennusten rakentajien ei pit\u00e4isi m\u00e4\u00e4ritell\u00e4 koukkuja"},"content":{"rendered":"\n<p>WordPress-laajennusten rakentajat n\u00e4ytt\u00e4v\u00e4t olevan yh\u00e4 enemm\u00e4n keskustelunaiheena, kun on kyse siit\u00e4, mit\u00e4 niiden pit\u00e4isi m\u00e4\u00e4ritell\u00e4. Olen puhunut siit\u00e4 ennenkin, mutta on okei palata t\u00e4h\u00e4n aiheeseen aika ajoin, eik\u00f6 niin?<\/p>\n<p>Loppujen lopuksi on asioita, joita opimme ja asioita, joita muutumme, kun saamme lis\u00e4\u00e4 kokemusta.<\/p>\n<p>Ei ole ollenkaan harvinaista n\u00e4hd\u00e4 liit\u00e4nn\u00e4isi\u00e4, jotka m\u00e4\u00e4ritt\u00e4v\u00e4t koukkuja ja muuta k\u00e4ytt\u00e4ytymist\u00e4, mutta en ole t\u00e4m\u00e4n l\u00e4hestymistavan fani. Sen sijaan koukkurekister\u00f6innin k\u00e4sittelyn pit\u00e4isi mielest\u00e4ni tapahtua omassa funktiossaan tai, viel\u00e4 rajummin, ryhmien joukossa.<\/p>\n<p>Mutta ennen kuin menen siihen, haluan selitt\u00e4\u00e4, mit\u00e4 WordPress-laajennusten rakentajassa pit\u00e4isi menn\u00e4, miksi sen pit\u00e4isi menn\u00e4 konstruktoriin ja kuinka t\u00e4m\u00e4 voidaan k\u00e4sitell\u00e4 laajennuksiasi k\u00e4sitelt\u00e4ess\u00e4.<\/p>\n<h2>WordPress-laajennusten rakentajat<\/h2>\n<p>Alusta alkaen olen sit\u00e4 mielt\u00e4, ett\u00e4 rakentajia tulisi k\u00e4ytt\u00e4\u00e4 yhteen asiaan:<\/p>\n<ul>\n<li>Objektin tilan alustaminen.<\/li>\n<\/ul>\n<p>Se, mik\u00e4 m\u00e4\u00e4ritt\u00e4\u00e4 objektin alkutilan, saattaa riippua siit\u00e4, onko se luotu &quot;tyhj\u00e4st\u00e4&quot; vai ladataanko siihen tietoja aiemmasta sarjasta (kuten istunnon sarjoittaminen). Tapa, jolla n\u00e4en sen:<\/p>\n<ul>\n<li>attribuutit ovat substantiivit, jotka kuvaavat objektia,<\/li>\n<li>Funktiot ovat verbej\u00e4, jotka kuvaavat, mit\u00e4 objekti voi tehd\u00e4.<\/li>\n<\/ul>\n<p>Toiminnot tekev\u00e4t tietysti sen ty\u00f6n, jonka objekti pystyy tekem\u00e4\u00e4n. Ne voivat muuttaa objektin tilaa kutsuttaessa, tai ne voivat k\u00e4sitell\u00e4 funktioihin v\u00e4litettyj\u00e4 argumentteja.<\/p>\n<h3>Mit\u00e4 konstruktorissa pit\u00e4isi menn\u00e4?<\/h3>\n<p>Kun objektia rakennetaan, se tulee yksinkertaisesti asettaa siten, ett\u00e4 sen attribuutit on asetettu ja sen toiminnot ovat valmiita toimimaan.<\/p>\n<p>Jos konstruktorissa on jotain, joka ei vaikuta objektin alkutilaan, sen ei pit\u00e4isi olla siell\u00e4.<\/p>\n<h3>Miksi attribuuttien pit\u00e4isi olla konstruktorissa?<\/h3>\n<p>Ehk\u00e4 parempi tapa esitt\u00e4\u00e4 t\u00e4m\u00e4 kysymys on:<\/p>\n<p>Miksi koukkuja ei saisi m\u00e4\u00e4ritell\u00e4 konstruktorissa?<\/p>\n<p>WordPressin koukkuj\u00e4rjestelm\u00e4 on osa <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_programming\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tapahtumal\u00e4ht\u00f6ist\u00e4 suunnittelumallia<\/a> (jonka olen fani), mutta koukkujen rekister\u00f6inti ei kuvaa objektin tilaa. Sen sijaan perustavanlaatuisimmalta tasolla se on jotain, joka luo suhteen objektiin ja WordPressiin.<\/p>\n<p>Objektin alkutilan ei tarvitse tiet\u00e4\u00e4 WordPressist\u00e4, sen toimintoja ei tarvitse olla yhdistettyn\u00e4 WordPressiin tai mit\u00e4\u00e4n k\u00e4sittely\u00e4 WordPressill\u00e4.<\/p>\n<p>Muista, ett\u00e4 attribuutit alustetaan rakentajassa. WordPress ei ole attribuutti. Se on riippuvuus. Riippuvuuden luominen on toiminnan suorittamista, joka on verbin m\u00e4\u00e4ritelm\u00e4.<\/p>\n<p>Siksi kaikki koukun rekister\u00f6inti tulisi tehd\u00e4 funktiossa.<\/p>\n<h3>Kuinka voimme hoitaa koukun rekister\u00f6innin?<\/h3>\n<p>T\u00e4m\u00e4 on yksi niist\u00e4 aiheista, joka voi olla oma viesti tai viestisarja.<\/p>\n<ul>\n<li>WordPressill\u00e4 on mahdollista luoda luokka, joka yll\u00e4pit\u00e4\u00e4 rekisteri\u00e4 objekteista ja koukuista.<\/li>\n<li>On my\u00f6s mahdollista m\u00e4\u00e4ritt\u00e4\u00e4 koukun rekister\u00f6inti luokan funktiossa.<\/li>\n<li>Voimme my\u00f6s tehd\u00e4 useita asioita <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">riippuvuuden inversiolla<\/a>.<\/li>\n<\/ul>\n<p>Kaikki edell\u00e4 mainitut ovat asioita, jotka eiv\u00e4t kuulu t\u00e4m\u00e4n viestin piiriin, mutta yksinkertaisuuden vuoksi n\u00e4yt\u00e4n esimerkin siit\u00e4, kuinka luokka voi rekister\u00f6id\u00e4 funktionsa WordPressiin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">init-funktiossa<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdmin;\nuse AcmeAdminInterfaces;\n\nclass JavaScript_Assets implements InterfacesAsset {\n\n    private $assets_dir;\n\n    private $js_dir;\n\n    public function __construct() {\n\n        $this-&gt;assets_dir = trailingslashit(\n            plugin_dir_url( __FILE__ ). 'assets'\n        );\n\n        $this-&gt;js_dir = trailingslashit( $this-&gt;assets_dir. 'js' );\n    }\n\n    public function init() {\n\n        add_action(\n            'admin_enqueue_scripts',\n            array( $this, 'enqueue') );\n    }\n\n    public function enqueue() {\n\n        wp_enqueue_script(\n            'toggle-admin-notices',\n            $this-&gt;js_dir. 'admin.js',\n            array( 'jquery' ),\n            false\n        );\n    }\n}\n<\/code><\/pre>\n<p>T\u00e4ll\u00e4 tavalla voimme instantoida objektin, testata sit\u00e4, k\u00e4ytt\u00e4\u00e4 sit\u00e4 jne., mutta meid\u00e4n ei tarvitse k\u00e4sitell\u00e4 mit\u00e4\u00e4n WordPressiin liittyv\u00e4\u00e4 kutsumatta nimenomaisesti <strong>init<\/strong> &#8211; funktiota.<\/p>\n<p>Kun sit\u00e4 kutsutaan, riippuvuus luodaan, WordPress tarvitaan ja asiat muuttuvat monimutkaisemmiksi.<\/p>\n<h2>Ja se testausjuttu<\/h2>\n<p>Haluan mainita viel\u00e4 yhden seikan, joka on hieman t\u00e4m\u00e4n postauksen laajuuden ja tarkoituksen ulkopuolella, mutta on silti ajankohtainen: Kun on kyse luokan testaamisesta, meid\u00e4n pit\u00e4isi pysty\u00e4:<\/p>\n<ol>\n<li>luo luokasta ilmentym\u00e4,<\/li>\n<li>testata sen logiikkaa kutsumalla toimintoja,<\/li>\n<li>sen parametrien v\u00e4litt\u00e4minen ja sen palautusarvojen arvioiminen.<\/li>\n<\/ol>\n<p>Ja meid\u00e4n pit\u00e4isi pysty\u00e4 tekem\u00e4\u00e4n t\u00e4st\u00e4 mahdollisimman paljon eristyksiss\u00e4. Jos koukut m\u00e4\u00e4ritell\u00e4\u00e4n rakentajassa, se luo v\u00e4litt\u00f6m\u00e4n riippuvuuden WordPressist\u00e4, jota ei pit\u00e4isi tarvita.<\/p>\n<p>WordPress ei kuvaa objektin tilaa. Se on riippuvuutta kohteesta.<\/p>\n<p>Joka tapauksessa yrit\u00e4n sanoa, ett\u00e4 WordPress-laajennusten rakentajien ei pit\u00e4isi k\u00e4sitell\u00e4 koukkujen rekister\u00f6inti\u00e4, koska koukut eiv\u00e4t kuvaa sen tilaa. Ne liittyv\u00e4t johonkin, jota luokka tekee, ja ne est\u00e4v\u00e4t meit\u00e4 pystym\u00e4st\u00e4 testaamaan objektia eristyksiss\u00e4.<\/p>\n<p>Joten niill\u00e4 on paikkansa, mutta se ei ole rakentajassa.<\/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>WordPress-laajennusten rakentajien ei tule k\u00e4sitell\u00e4 koukkujen rekister\u00f6inti\u00e4, koska koukut eiv\u00e4t kuvaa sen tilaa.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,813,843,803,864],"tags":[1166],"class_list":["post-229416","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-laajennuksia","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=229416"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229416\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}