{"id":228765,"date":"2022-11-02T11:11:00","date_gmt":"2022-11-02T08:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228765"},"modified":"2022-11-09T04:11:38","modified_gmt":"2022-11-09T01:11:38","slug":"singletony-w-wordpressie-ponownie-czas-i-miejsce","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/singletony-w-wordpressie-ponownie-czas-i-miejsce\/","title":{"rendered":"Singletony w WordPressie, ponownie (czas i miejsce?)"},"content":{"rendered":"\n<p>Zanim zaczn\u0119 post m\u00f3wi\u0105cy o u\u017cywaniu singleton\u00f3w w WordPressie (a w\u0142a\u015bciwie <a href=\"https:\/\/tommcfarlin.com\/singleton-pattern-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Wzorzec Singleton<\/a> ), chc\u0119 si\u0119 upewni\u0107, \u017ce przeczyta\u0142e\u015b nast\u0119puj\u0105ce dwa artyku\u0142y:<\/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\">Klonowanie w PHP, czyli dlaczego tw\u00f3j singiel mo\u017ce zabi\u0107 WordPressa<\/a> autorstwa <a href=\"https:\/\/twitter.com\/toscho\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Thomasa Scholza<\/a><\/li>\n<li><a href=\"https:\/\/carlalexander.ca\/singletons-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singletony i ich wykorzystanie w WordPress<\/a> autorstwa <a href=\"https:\/\/twitter.com\/twigpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Carla Alexandra<\/a><\/li>\n<\/ul>\n<p>Oba te artyku\u0142y dostarczaj\u0105 niezwykle cennego spojrzenia na ten wzorzec i niebezpiecze\u0144stw zwi\u0105zanych z jego u\u017cywaniem podczas pracy z WordPressem; jednak czy to oznacza, \u017ce \u200b\u200bpowinni\u015bmy ich ca\u0142kowicie unika\u0107?<\/p>\n<p>Nie s\u0105dz\u0119.<\/p>\n<p>Z drugiej strony zdaj\u0119 sobie spraw\u0119, \u017ce artyku\u0142y nie m\u00f3wi\u0105, aby ca\u0142kowicie ich unika\u0107. Daj\u0105 mocne argumenty, jak ich u\u017cywa\u0107 i niebezpiecze\u0144stwa zwi\u0105zane z ich u\u017cywaniem, je\u015bli zdecydujesz si\u0119 to zrobi\u0107.<\/p>\n<p>I chocia\u017c na pewno u\u017cywa\u0142em ich w przesz\u0142o\u015bci, generalnie przesta\u0142em. Jednak ostatnio natkn\u0105\u0142em si\u0119 na przypadek u\u017cycia dla projektu, w kt\u00f3rym uwa\u017cam, \u017ce jest to dopuszczalne.<\/p>\n<h2>Nadal u\u017cywasz singleton\u00f3w w WordPressie?<\/h2>\n<p>Aby da\u0107 pow\u00f3d, dla kt\u00f3rego w og\u00f3le rozwa\u017cam ten konkretny wzorzec, my\u015bl\u0119, \u017ce warto najpierw zrozumie\u0107 przypadek u\u017cycia. M\u00f3wi\u0105c pro\u015bciej:<\/p>\n<ul>\n<li>Istnieje strona administracyjna, kt\u00f3ra pozwala u\u017cytkownikowi wybra\u0107 spos\u00f3b wy\u015bwietlania dat na interfejsie witryny.<\/li>\n<li>Gdy u\u017cytkownik zapisze opcj\u0119, zapisze format daty <a href=\"https:\/\/php.net\/manual\/en\/function.date.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oparty na PHP do tabeli w WordPress.<\/a><\/li>\n<li>Podczas renderowania daty warto\u015b\u0107 zostanie pobrana z bazy danych i zastosowana do daty, kt\u00f3ra ma by\u0107 renderowana.<\/li>\n<\/ul>\n<p>A dla tych, kt\u00f3rzy s\u0105 ciekawi, istnieje tylko kilka \u2013 powiedzmy cztery lub pi\u0119\u0107 \u2013 sposob\u00f3w, na kt\u00f3re pozwalamy u\u017cytkownikowi wy\u015bwietli\u0107 dat\u0119.<\/p>\n<p>Poniewa\u017c ten konkretny projekt umo\u017cliwia u\u017cytkownikom importowanie plik\u00f3w CSV z danymi (zawieraj\u0105cych daty) i renderowanie danych z plik\u00f3w CSV, cho\u0107 w innym formacie, warto zauwa\u017cy\u0107, \u017ce na zapleczu wyst\u0119puje spora ilo\u015b\u0107 formatowania daty.<\/p>\n<p>Naturalnie pojawia si\u0119 pytanie:<\/p>\n<p>Dlaczego po prostu nie sformatowa\u0107 daty importu pliku CSV przez u\u017cytkownika?<\/p>\n<p>A to dlatego, \u017ce u\u017cytkownik mo\u017ce zdecydowa\u0107 si\u0119 na zmian\u0119 sposobu renderowania daty po zaimportowaniu pliku CSV.<\/p>\n<p>Maj\u0105c to na uwadze, we wtyczce znajduje si\u0119 ca\u0142y inny mechanizm odpowiedzialny za walidacj\u0119, oczyszczanie i zapisywanie danych wej\u015bciowych u\u017cytkownika do bazy danych.<\/p>\n<p>Ale kiedy przychodzi czas na pobieranie warto\u015bci z bazy danych, zw\u0142aszcza gdy jest to odczytywanie warto\u015bci z tabeli bazy danych i robienie tego w wielu punktach w aplikacji, nie ma sensu posiadanie jednego punktu z jak\u0105 warto\u015b\u0107 mo\u017cna wyprowadzi\u0107?<\/p>\n<p>Og\u00f3lne spojrzenie na to, jak to dzia\u0142a.<\/p>\n<p>Lub, inaczej m\u00f3wi\u0105c, nie ma sensu zmienia\u0107 jednego miejsca w aplikacji, kt\u00f3re mo\u017ce \u0142atwo przechodzi\u0107 kaskadowo przez reszt\u0119 aplikacji, zamiast szuka\u0107 wszystkich mo\u017cliwych miejsc:<\/p>\n<ol>\n<li>przeczytanie opcji,<\/li>\n<li>upewniaj\u0105c si\u0119, \u017ce jest ustawiony,<\/li>\n<li>zdefiniowanie domy\u015blnego, je\u015bli nie jest ustawione,<\/li>\n<li>i zwracasz warto\u015b\u0107?<\/li>\n<\/ol>\n<p>I tutaj widz\u0119 prawid\u0142owe u\u017cycie singletona w WordPressie: spos\u00f3b na odczytywanie danych w wielu punktach w ca\u0142ej aplikacji. Wi\u0105\u017ce si\u0119 to jednak z pewnymi implikacjami:<\/p>\n<ul>\n<li>klasa nie musi by\u0107 tworzona wi\u0119cej ni\u017c raz (to znaczy, to ca\u0142a idea singletona),<\/li>\n<li>nie b\u0119dzie zajmowa\u0107 si\u0119 zmiennymi danymi,<\/li>\n<li>nie b\u0119dzie pisa\u0107 informacji ani manipulowa\u0107 informacjami.<\/li>\n<\/ul>\n<p>Innymi s\u0142owy, ponosi wy\u0142\u0105czn\u0105 odpowiedzialno\u015b\u0107 za pobieranie informacji i ich zwracanie. Ot\u00f3\u017c \u200b\u200bto. Nic wi\u0119cej.<\/p>\n<h3>Przyk\u0142adowa implementacja<\/h3>\n<p>Wi\u0119c jak to mo\u017ce wygl\u0105da\u0107? Oto <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-singleton-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przybli\u017cona implementacja<\/a> na potrzeby konwersacji:<\/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>Jak wida\u0107, spe\u0142nia wszystkie powy\u017csze punkty. Oznacza to, \u017ce odczytuje dane, ustawia warto\u015b\u0107 domy\u015bln\u0105, a nast\u0119pnie zwraca j\u0105.<\/p>\n<p>Ta klasa nie robi nic poza odczytywaniem i zwracaniem bardzo konkretnego zestawu danych.<\/p>\n<h3>Zastrze\u017cenie dotycz\u0105ce buforowania<\/h3>\n<p>Oczywi\u015bcie, poniewa\u017c ta klasa odczytuje dane z bazy danych, mo\u017ce by\u0107 \u2013 i ewentualnie powinna by\u0107 \u2013 zbuforowana. Celem tego postu nie jest jednak wchodzenie w stan przej\u015bciowy, wyga\u015bni\u0119cie i przepracowanie wszystkich tych niuans\u00f3w.<\/p>\n<p>Zamiast tego chodzi o ocen\u0119, czy jest to prawid\u0142owy przypadek u\u017cycia do implementacji singletona w WordPress.<\/p>\n<h2>Czekaj, nie musi tak by\u0107!<\/h2>\n<p>Wiem wiem. <a href=\"https:\/\/www.youtube.com\/watch?v=yeEp7BA2mLg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Psychika<\/a>! Uwa\u017cam, \u017ce to poprawna terminologia, ale zachowajmy profesjonalizm.<\/p>\n<p>Do tego momentu ca\u0142y post m\u00f3wi\u0142 o tym, dlaczego mo\u017cesz chcie\u0107 zbada\u0107 u\u017cycie singleton\u00f3w w WordPressie, aby mie\u0107 spos\u00f3b na \u0142atwe pobieranie informacji przy u\u017cyciu konsekwentnie zorientowanych obiektowo zasad.<\/p>\n<p>Ale nadal nie uwa\u017cam, \u017ce u\u017cywanie singletona w WordPressie jest tutaj konieczne. Przynajmniej my\u015bl\u0119, \u017ce funkcja statyczna jest w porz\u0105dku. A jedynym powodem, dla kt\u00f3rego uwa\u017cam, \u017ce to jest w porz\u0105dku, jest to, \u017ce tworzenie instancji klasy za ka\u017cdym razem, gdy potrzebujesz dost\u0119pu do funkcji, kt\u00f3ra pobiera dane, kt\u00f3re nie b\u0119d\u0105 zmieniane w ramach klasy, jest przesad\u0105.<\/p>\n<p>Wi\u0119c jak to <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-refactored-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wygl\u0105da<\/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>A to, jak s\u0105dz\u0119, jest lepszym rozwi\u0105zaniem ni\u017c implementacja dowolnego wzorca projektowego, gdy nie jest on w og\u00f3le potrzebny.<\/p>\n<p>Ale jestem otwarty na przekonanie, \u017ce jest inaczej.<\/p>\n<h2>My\u015bli od bardziej do\u015bwiadczonych programist\u00f3w?<\/h2>\n<p>S\u0142ysza\u0142em od znajomego przyjaciela i wsp\u00f3\u0142pracownika, \u017ce \u200b\u200bzwyk\u0142e u\u017cycie funkcji z przestrzeni\u0105 nazw mo\u017ce by\u0107 nawet dobrym rozwi\u0105zaniem. Oczywi\u015bcie istnieje wiele sposob\u00f3w radzenia sobie z tym problemem.<\/p>\n<p>I z tym chcia\u0142bym us\u0142ysze\u0107 od reszty z was, w jaki spos\u00f3b mo\u017cna to jeszcze bardziej skorygowa\u0107. Nie jestem tak bardzo zainteresowany implementacj\u0105\u00a0 funkcji <strong>get<\/strong>, poniewa\u017c jest ona tworzona g\u0142\u00f3wnie na potrzeby demonstracji.<\/p>\n<p>Zamiast tego interesuj\u0105 mnie sposoby radzenia sobie z tym poza tym, co zosta\u0142o tutaj przedstawione. Albo raczej po prostu twoje podej\u015bcie do tego, co widzisz.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mo\u017ce chcesz zaimplementowa\u0107 singletony w WordPressie, aby \u0142atwo czyta\u0107 dane. Jednak nie musi tak by\u0107.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":[721,897,866],"tags":[1169],"class_list":["post-228765","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=228765"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228765\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/221011"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}