{"id":229774,"date":"2022-11-10T17:36:00","date_gmt":"2022-11-10T14:36:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229774"},"modified":"2022-11-09T16:19:56","modified_gmt":"2022-11-09T13:19:56","slug":"mikae-on-liikaa-tietojen-vaelittaemiseen-riippuvuusinjektion-kautta","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/mikae-on-liikaa-tietojen-vaelittaemiseen-riippuvuusinjektion-kautta\/","title":{"rendered":"Mik\u00e4 on liikaa tietojen v\u00e4litt\u00e4miseen riippuvuusinjektion kautta?"},"content":{"rendered":"\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Riippuvuuden<\/a> lis\u00e4\u00e4minen on aihe, joka on ollut olemassa jo jonkin aikaa olio-ohjelmointipiireiss\u00e4. Joskus n\u00e4emme sen WordPressiss\u00e4; joskus emme.<\/p>\n<p>Olen sen fani, mutta rehellisesti sanottuna en kuitenkaan ole aina varma, kuinka paljon tietoa pit\u00e4isi lis\u00e4t\u00e4 luokkaan. Tarkoitan, sanotaanpa, ett\u00e4 meille annetaan kaksi luokkaa, ja toisessa on tietoja, joita toinen tarvitsee.<\/p>\n<ul>\n<li>Emmek\u00f6 lis\u00e4\u00e4 luokkaa toiseen luokkaan?<\/li>\n<li>Lis\u00e4\u00e4mmek\u00f6 vain osan tiedosta (olipa se merkkijono, kokonaisluku, tietorakenne tai mik\u00e4 tahansa) toiseen luokkaan?<\/li>\n<\/ul>\n<p>En usko, ett\u00e4 t\u00e4lle on tiukkaa s\u00e4\u00e4nt\u00f6\u00e4, mutta on luultavasti turvallista sanoa, ett\u00e4 on parempi sy\u00f6tt\u00e4\u00e4 vain tarvitsemasi tiedot. Mutta sitten t\u00e4m\u00e4 her\u00e4tt\u00e4\u00e4 kysymyksen siit\u00e4, kuinka tiedot valmistetaan sy\u00f6tett\u00e4v\u00e4ksi tiettyyn luokkaan?<\/p>\n<ul>\n<li>Luotko menetelm\u00e4n yhdess\u00e4 luokassa ja siirr\u00e4tk\u00f6 sen toiseen?<\/li>\n<li>Siirr\u00e4tk\u00f6 siihen osan <strong>yksityist\u00e4<\/strong> tai <strong>suojattua<\/strong> tietoa?<\/li>\n<\/ul>\n<p>Toisaalta luulen, ett\u00e4 se riippuu siit\u00e4, t\u00e4ytyyk\u00f6 tiedoille tapahtua jotain ennen kuin se siirret\u00e4\u00e4n luokkaan.<\/p>\n<p>Joka tapauksessa voisin palata t\u00e4h\u00e4n edestakaisin koko postauksen ajan, enk\u00e4 koskaan tule tekem\u00e4\u00e4n johtop\u00e4\u00e4t\u00f6ksi\u00e4, joten miksi en ty\u00f6st\u00e4isi l\u00e4hdekoodia l\u00e4pi ennen kuin on jotain j\u00e4rkev\u00e4\u00e4.<\/p>\n<p>Aloitetaan sanomalla, ett\u00e4 meill\u00e4 on p\u00e4\u00e4laajennusten luokkatiedosto ja t\u00e4m\u00e4 luokka on vastuussa tietojen yll\u00e4pit\u00e4misest\u00e4, kuten:<\/p>\n<ul>\n<li>polku laajennukseen,<\/li>\n<li>laajennuksen URL-osoite,<\/li>\n<li>onko laajennus ladattu vai ei,<\/li>\n<li>t\u00e4ll\u00e4 hetkell\u00e4 katsottava n\u00e4ytt\u00f6,<\/li>\n<li>ja luokat, joille sen on l\u00e4hetett\u00e4v\u00e4 (ajattele <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pub\/sub<\/a>) tiettyj\u00e4 tietoja.<\/li>\n<\/ul>\n<p>Ehk\u00e4 luokan luuranko tai tynk\u00e4 saattaa n\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-00-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass(...)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Aloitetaan sitten todella laajasti. Sano, ett\u00e4 haluamme ottaa koko luokan ja siirt\u00e4\u00e4 sen jollekin luokasta, jolle se l\u00e4hett\u00e4\u00e4 tietoja.<\/p>\n<p>Jos n\u00e4in olisi, se voisi n\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-01-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Mutta yksi t\u00e4m\u00e4n haasteista on, ett\u00e4 se siirt\u00e4\u00e4 paljon enemm\u00e4n tietoa kuin on tarpeen toiseen luokkaan. Lis\u00e4ksi se v\u00e4litt\u00e4\u00e4 tietoa, joka sis\u00e4lt\u00e4\u00e4 tietoa luokasta, jolle se v\u00e4litt\u00e4\u00e4 tiedot.<\/p>\n<p>Oletetaan siis, ett\u00e4 haluamme ottaa askeleen taaksep\u00e4in ja v\u00e4litt\u00e4\u00e4 vain yhden yksityisist\u00e4 tiedoista. T\u00e4m\u00e4 on yksinkertaista, eik\u00f6? Se n\u00e4ytt\u00e4\u00e4 lopulta <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-02-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this-&gt;plugin_path)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Ja t\u00e4m\u00e4 voi olla t\u00e4ysin riitt\u00e4v\u00e4 joissakin tapauksissa. Mutta kuten aiemmin mainittiin, on my\u00f6s hetki\u00e4, jolloin haluamme ottaa tiedon, k\u00e4sitell\u00e4 ne ja sitten siirt\u00e4\u00e4 ne luokkaan.<\/p>\n<p>T\u00e4t\u00e4 varten m\u00e4\u00e4rit\u00e4mme menetelm\u00e4n, pyyd\u00e4mme sen k\u00e4sittelem\u00e4\u00e4n tiedot ja siirt\u00e4m\u00e4\u00e4n palautusarvon luokkaan, joka tarvitsee <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-03-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tiedot<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this-&gt;isCurrentAdminStatus())\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Ajatus t\u00e4m\u00e4n keskustelun taustalla syntyi, kun ty\u00f6skentelimme \u00e4skett\u00e4isen projektin koodiarvioinnin parissa ja keskustelimme eri vaihtoehdoista, joilla tietoa voitaisiin v\u00e4litt\u00e4\u00e4 luokkaan.<\/p>\n<p>Joten aloitin laajasta (huolimatta siit\u00e4, mik\u00e4 on v\u00e4ltt\u00e4m\u00e4t\u00f6nt\u00e4, vaikka yll\u00e4 oleva ajatusprosessi otetaan huomioon) ja sitten rajasin sen siihen, mik\u00e4 on vain v\u00e4ltt\u00e4m\u00e4t\u00f6nt\u00e4.<\/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>Olio-ohjelmoinnissa riippuvuusinjektio on hienoa, ja kaikkea muuta, mutta kuinka paljon sit\u00e4 pidet\u00e4\u00e4n liikaa siirrett\u00e4ess\u00e4 tietoja riippuvuusinjektion kautta?<\/p>\n","protected":false},"author":1,"featured_media":166138,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[1018,719],"tags":[1166],"class_list":["post-229774","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hyodyllisia-sivustoja","category-kehittaejae","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229774","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=229774"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229774\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/166138"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}