{"id":229446,"date":"2022-11-02T10:38:00","date_gmt":"2022-11-02T07:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229446"},"modified":"2022-11-09T07:06:12","modified_gmt":"2022-11-09T04:06:12","slug":"singletons-in-wordpress-revisited-aika-ja-paikka","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/singletons-in-wordpress-revisited-aika-ja-paikka\/","title":{"rendered":"Singletons in WordPress, Revisited (Aika ja paikka?)"},"content":{"rendered":"\n<p>Ennen kuin aloitan postauksen, jossa puhutaan singletonien k\u00e4yt\u00f6st\u00e4 WordPressiss\u00e4 (tai sopivammin <a href=\"https:\/\/tommcfarlin.com\/singleton-pattern-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singleton Pattern<\/a> ), haluan varmistaa, ett\u00e4 luet seuraavat kaksi artikkelia:<\/p>\n<ul>\n<li><a href=\"http:\/\/wpkrauts.com\/2013\/cloning-in-php-or-why-your-singleton-might-kill-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kloonaus PHP:ss\u00e4 tai miksi sinkkusi saattaa tappaa WordPressin<\/a>, kirjoittanut <a href=\"https:\/\/twitter.com\/toscho\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Thomas Scholz<\/a><\/li>\n<li><a href=\"https:\/\/carlalexander.ca\/singletons-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singletonit ja niiden k\u00e4ytt\u00f6 WordPressiss\u00e4<\/a> Carl <a href=\"https:\/\/twitter.com\/twigpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Alexander<\/a><\/li>\n<\/ul>\n<p>Molemmat artikkelit tarjoavat \u00e4\u00e4rimm\u00e4isen arvokkaan n\u00e4k\u00f6kulman t\u00e4h\u00e4n malliin ja sen k\u00e4yt\u00f6n vaaroihin, kun k\u00e4yt\u00e4t sit\u00e4 WordPress-ty\u00f6ss\u00e4mme. tarkoittaako se kuitenkin, ett\u00e4 meid\u00e4n pit\u00e4isi v\u00e4ltt\u00e4\u00e4 niit\u00e4 kokonaan?<\/p>\n<p>En usko niin.<\/p>\n<p>Ymm\u00e4rr\u00e4n my\u00f6s, ett\u00e4 artikkeleissa ei ole tarkoitus v\u00e4ltt\u00e4\u00e4 niit\u00e4 kokonaan. He antavat vahvoja perusteita niiden k\u00e4ytt\u00f6\u00f6n ja niiden k\u00e4yt\u00f6n vaaroista, jos p\u00e4\u00e4t\u00e4t tehd\u00e4 niin.<\/p>\n<p>Ja vaikka olen ehdottomasti k\u00e4ytt\u00e4nyt niit\u00e4 aiemmin, olen yleens\u00e4 lopettanut. T\u00f6rm\u00e4sin kuitenkin \u00e4skett\u00e4in k\u00e4ytt\u00f6tapaukseen projektille, jossa se on mielest\u00e4ni hyv\u00e4ksytt\u00e4v\u00e4\u00e4.<\/p>\n<h2>K\u00e4yt\u00e4tk\u00f6 edelleen Singletoneja WordPressiss\u00e4?<\/h2>\n<p>Jotta voisin antaa syyn sille, miksi edes harkitsen t\u00e4t\u00e4 mallia, mielest\u00e4ni kannattaa ensin ymm\u00e4rt\u00e4\u00e4 k\u00e4ytt\u00f6tapaus. Yksinkertaisesti:<\/p>\n<ul>\n<li>Siell\u00e4 on hallintasivu, jonka avulla k\u00e4ytt\u00e4j\u00e4 voi valita, kuinka h\u00e4n haluaa n\u00e4ytt\u00e4\u00e4 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4t sivuston etuosassa.<\/li>\n<li>Kun k\u00e4ytt\u00e4j\u00e4 tallentaa vaihtoehdon, se kirjoittaa p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n <a href=\"https:\/\/php.net\/manual\/en\/function.date.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP-pohjaisen<\/a> muodon WordPressin taulukkoon.<\/li>\n<li>P\u00e4iv\u00e4m\u00e4\u00e4r\u00e4\u00e4 hahmonnettaessa arvo noudetaan tietokannasta ja sit\u00e4 sovelletaan hahmonnettavaan p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4\u00e4n.<\/li>\n<\/ul>\n<p>Ja niille, jotka ovat uteliaita, on olemassa vain kourallinen \u2013 vaikkapa nelj\u00e4 tai viisi \u2013 tapaa, joilla annamme k\u00e4ytt\u00e4j\u00e4n n\u00e4ytt\u00e4\u00e4 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n.<\/p>\n<p>Koska t\u00e4m\u00e4n projektin avulla k\u00e4ytt\u00e4j\u00e4t voivat tuoda tietoja CSV-tiedostoina (joissa on p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4t) ja joiden avulla he voivat render\u00f6id\u00e4 tietoja CSV-tiedostoista, vaikkakin eri muodossa, on syyt\u00e4 huomata, ett\u00e4 taustalla tapahtuu melko paljon p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n muotoilua.<\/p>\n<p>Luonnollisesti her\u00e4\u00e4 kysymys:<\/p>\n<p>Mikset vain muotoile p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4\u00e4, kun k\u00e4ytt\u00e4j\u00e4 tuo CSV-tiedoston?<\/p>\n<p>T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 k\u00e4ytt\u00e4j\u00e4 voi halutessaan muuttaa p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n esitystapaa CSV-tiedoston tuonnin j\u00e4lkeen.<\/p>\n<p>T\u00e4st\u00e4 huolimatta laajennuksessa on t\u00e4m\u00e4 kokonaan toinen mekanismi, joka vastaa k\u00e4ytt\u00e4j\u00e4n sy\u00f6tteiden vahvistamisesta, puhdistamisesta ja kirjoittamisesta tietokantaan.<\/p>\n<p>Mutta kun on aika noutaa arvot tietokannasta, varsinkin kun kyse on arvon lukemisesta tietokantataulukosta, ja tehd\u00e4 niin useissa kohdissa koko sovelluksen, eik\u00f6 olisi j\u00e4rkev\u00e4\u00e4 saada yksi piste jonka arvo voidaan johtaa?<\/p>\n<p>Korkean tason katsaus miten t\u00e4m\u00e4 toimii.<\/p>\n<p>Tai toinen tapa ilmaista se, eik\u00f6 ole j\u00e4rkev\u00e4\u00e4 vaihtaa yht\u00e4 paikkaa sovelluksessa, joka voi helposti ketjuttaa koko muun sovelluksen sen sijaan, ett\u00e4 etsitt\u00e4isiin kaikkia mahdollisia paikkoja:<\/p>\n<ol>\n<li>lue vaihtoehto,<\/li>\n<li>varmista, ett\u00e4 se on asetettu,<\/li>\n<li>oletusarvon m\u00e4\u00e4ritt\u00e4minen, jos sit\u00e4 ei ole asetettu,<\/li>\n<li>ja arvon palauttaminen?<\/li>\n<\/ol>\n<p>Ja t\u00e4ss\u00e4 n\u00e4en yhden sanan oikean k\u00e4yt\u00f6n WordPressiss\u00e4 tulevan peliin: tapa lukea tietoja useista kohdista koko sovelluksessa. T\u00e4h\u00e4n liittyy kuitenkin joitain seurauksia:<\/p>\n<ul>\n<li>luokkaa ei tarvitse ilment\u00e4\u00e4 useammin kuin kerran (tarkoitan, ett\u00e4 se on singletonin koko idea),<\/li>\n<li>se ei k\u00e4sittele muuttuvaa dataa,<\/li>\n<li>se ei kirjoita tietoja tai manipuloi tietoja.<\/li>\n<\/ul>\n<p>Toisin sanoen se on yksin vastuussa tietojen hakemisesta ja palauttamisesta. Se siit\u00e4. Ei mit\u00e4\u00e4n muuta.<\/p>\n<h3>Esimerkkitoteutus<\/h3>\n<p>Milt\u00e4 t\u00e4m\u00e4 sitten mahtaa n\u00e4ytt\u00e4\u00e4? T\u00e4ss\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-singleton-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">on karkea toteutus<\/a> keskustelua varten:<\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    private static $instance;\n\n    private function __construct() {\n    }\n\n    private static function get_instance() {\n\n        if (null === self::$instance) {\n            self::$instance = new self;\n        }\n\n        return self::$instance;\n    }\n\n    public static function get() {\n\n        self::get_instance();\n\n        $default_format = 'm\/d\/Y';\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Kuten n\u00e4et, se t\u00e4ytt\u00e4\u00e4 kaikki yll\u00e4 olevat kohdat. Eli se lukee tiedot, asettaa oletusarvon ja palauttaa sen sitten.<\/p>\n<p>T\u00e4m\u00e4 luokka ei tee mit\u00e4\u00e4n muuta kuin lukee ja palauttaa eritt\u00e4in tarkan tietojoukon.<\/p>\n<h3>Varoitus v\u00e4limuistiin tallentamisesta<\/h3>\n<p>On selv\u00e4\u00e4, ett\u00e4 koska t\u00e4m\u00e4 luokka lukee tietoja tietokannasta, se voidaan &#8211; ja mahdollisesti pit\u00e4isi &#8211; tallentaa v\u00e4limuistiin. T\u00e4m\u00e4n postauksen tarkoitus ei kuitenkaan ole puuttua transienteihin, vanhenemiseen ja kaikkien n\u00e4iden vivahteiden l\u00e4pik\u00e4ymiseen.<\/p>\n<p>Sen sijaan kyse on arvioinnista, onko t\u00e4m\u00e4 p\u00e4tev\u00e4 k\u00e4ytt\u00f6tapa singletonin k\u00e4ytt\u00f6\u00f6nottamiseksi WordPressiss\u00e4.<\/p>\n<h2>Odota, sen ei tarvitse olla n\u00e4in!<\/h2>\n<p>Tied\u00e4n tied\u00e4n. <a href=\"https:\/\/www.youtube.com\/watch?v=yeEp7BA2mLg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Psyykki<\/a>! Uskon, ett\u00e4 se on oikea terminologia, mutta pidet\u00e4\u00e4n t\u00e4m\u00e4 ammattimaisena.<\/p>\n<p>T\u00e4h\u00e4n asti koko viesti puhui siit\u00e4, miksi saatat haluta tutkia singletonien k\u00e4ytt\u00f6\u00e4 WordPressiss\u00e4, jotta sinulla on tapa helposti noutaa tietoja johdonmukaisesti oliopohjaisilla periaatteilla.<\/p>\n<p>Mutta en silti usko, ett\u00e4 singletonin k\u00e4ytt\u00e4minen WordPressiss\u00e4 on v\u00e4ltt\u00e4m\u00e4t\u00f6nt\u00e4. Ainakin staattinen toiminto on mielest\u00e4ni hyv\u00e4. Ja ainoa syy mielest\u00e4ni on okei, koska luokan esiintym\u00e4n luominen joka kerta, kun sinun on k\u00e4ytett\u00e4v\u00e4 toimintoa, joka hakee tietoja, jotka eiv\u00e4t muutu luokassa, on ylivoimaista.<\/p>\n<p>Joten milt\u00e4 t\u00e4m\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-refactored-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4ytt\u00e4\u00e4<\/a>? <\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    public static function get() {\n\n        $default_format = 'm\/d\/Y';\n\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Ja se on mielest\u00e4ni parempi ratkaisu kuin mielivaltaisen suunnittelumallin toteuttaminen, kun sit\u00e4 ei ollenkaan tarvita.<\/p>\n<p>Mutta olen valmis vakuuttumaan toisin.<\/p>\n<h2>Kokeneempien kehitt\u00e4jien ajatuksia?<\/h2>\n<p>Olen kuullut kollegaltani ja kollegoiltani, ett\u00e4 pelkk\u00e4 nimiavaruustoiminnon k\u00e4ytt\u00e4minen saattaa jopa olla oikea tapa edet\u00e4. On selv\u00e4\u00e4, ett\u00e4 t\u00e4h\u00e4n on olemassa useita tapoja ratkaista.<\/p>\n<p>Ja sen my\u00f6t\u00e4 olen kiinnostunut kuulemaan teilt\u00e4 muilta, kuinka voit muuttaa t\u00e4t\u00e4 entisest\u00e4\u00e4n. En ole niin kiinnostunut <strong>get<\/strong> &#8211; toiminnon toteuttamisesta, koska se on koottu p\u00e4\u00e4asiassa demoa varten.<\/p>\n<p>Sen sijaan olen kiinnostunut tavoista k\u00e4sitell\u00e4 t\u00e4t\u00e4 t\u00e4ss\u00e4 esitetyn ulkopuolella. Tai pikemminkin vain oma n\u00e4kemyksesi n\u00e4kem\u00e4st\u00e4si.<\/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>Ehk\u00e4 haluat ottaa k\u00e4ytt\u00f6\u00f6n singletons WordPressiss\u00e4 tietojen lukemisen helpottamiseksi. Sen ei kuitenkaan tarvitse olla niin.a<\/p>\n","protected":false},"author":1,"featured_media":221011,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,864],"tags":[1166],"class_list":["post-229446","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229446","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=229446"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229446\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/221011"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}