{"id":229043,"date":"2022-11-08T17:57:00","date_gmt":"2022-11-08T14:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229043"},"modified":"2022-11-09T05:18:47","modified_gmt":"2022-11-09T02:18:47","slug":"podstawowe-standardy-kodowania-za-posrednictwem-psr-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/podstawowe-standardy-kodowania-za-posrednictwem-psr-1\/","title":{"rendered":"Podstawowe standardy kodowania za po\u015brednictwem PSR-1"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/korzystanie-z-psr-w-porownaniu-ze-standardami-kodowania-wordpress\/\" title=\"Wczoraj\" >Wczoraj<\/a> om\u00f3wi\u0142em kr\u00f3tko o powodach u\u017cywania <a href=\"http:\/\/www.php-fig.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PSR<\/a> w por\u00f3wnaniu ze <a href=\"https:\/\/codex.wordpress.org\/WordPress_Coding_Standards\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">standardami kodowania WordPressa<\/a> oraz o tym, kiedy i dlaczego. Ale to nie znaczy, \u017ce nie jest pozbawiony punkt\u00f3w zamieszania, zw\u0142aszcza je\u015bli dopiero zaczynasz z nimi, prawda?<\/p>\n<p>Mam na my\u015bli to, \u017ce: powiedzmy, \u017ce pracujesz ze standardami kodowania WordPress od lat (poniewa\u017c mog\u0119 si\u0119 odnie\u015b\u0107), a teraz jest ca\u0142y nowy zestaw zasad i wytycznych, kt\u00f3rych nale\u017cy przestrzega\u0107. Ale to nie jest prosta sprawa zmiany jakiego\u015b odst\u0119pu i zmiany nazw plik\u00f3w.<\/p>\n<p>S\u0105 jeszcze inne punkty do na\u015bladowania, a ka\u017cda z nich jest nakre\u015blona, \u200b\u200bca\u0142kiem dos\u0142ownie (PSR-1, PSR-2 itd.), jak co\u015b powinno dzia\u0142a\u0107.<\/p>\n<p>Wi\u0119c je\u015bli chodzi tylko o podstawowe standardy kodowania opisane w PSR-1, na jakie problematyczne obszary mo\u017cemy napotka\u0107 jako programi\u015bci WordPressa?<\/p>\n<h2>Podstawowe standardy kodowania (i skutki uboczne)<\/h2>\n<p>Nie planuj\u0119 przejrzenia ka\u017cdego z tych dokument\u00f3w i powt\u00f3rzenia tego, czego mo\u017cemy si\u0119 ju\u017c nauczy\u0107, po prostu <a href=\"http:\/\/www.php-fig.org\/psr\/psr-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">je czytaj\u0105c<\/a>, ale my\u015bl\u0119, \u017ce jest co\u015b do powiedzenia, aby wzi\u0105\u0107 co\u015b, czego wielu z nas albo robi lub do\u015bwiadcza, i zobaczy\u0107, jak to mo\u017ce si\u0119 zmieni\u0107 w ci\u0105gu kontekst WordPressa.<\/p>\n<p>We\u017amy <strong>efekty uboczne<\/strong> z podstawowego standardu kodowania (lub <a href=\"http:\/\/www.php-fig.org\/psr\/psr-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PSR-1<\/a> ), na przyk\u0142ad:<\/p>\n<blockquote>\n<p>Plik POWINIEN deklarowa\u0107 nowe symbole (klasy, funkcje, sta\u0142e itp.) i nie powodowa\u0107 \u017cadnych innych skutk\u00f3w ubocznych lub POWINIEN wykonywa\u0107 logik\u0119 z efektami ubocznymi, ale NIE POWINIEN robi\u0107 obu.<\/p>\n<p>Wyra\u017cenie \u201eefekty uboczne&quot; oznacza wykonanie logiki niezwi\u0105zanej bezpo\u015brednio z deklarowaniem klas, funkcji, sta\u0142ych itp., jedynie z do\u0142\u0105czenia pliku.<\/p>\n<\/blockquote>\n<p>Osobi\u015bcie uwa\u017cam, \u017ce druga fraza jest kluczem do zrozumienia i unikni\u0119cia efekt\u00f3w ubocznych w naszym kodzie tak bardzo, jak to mo\u017cliwe. Oznacza to, \u017ce wszystko, co robi\u0105 nasze zaj\u0119cia, powinno by\u0107 samowystarczalne lub sp\u00f3jne z czym\u015b, co mog\u0142o zosta\u0107 w jaki\u015b spos\u00f3b wstrzykni\u0119te.<\/p>\n<p>Niezale\u017cnie od tego, znalezienie kodu, kt\u00f3ry wprowadza efekt uboczny i wyczyszczenie go nie powinno by\u0107 zbyt trudne. W\u0142a\u015bciwie u\u017cyj\u0119 siebie jako przyk\u0142adu.<\/p>\n<p>Sp\u00f3jrz na ten konkretny <a href=\"https:\/\/gist.github.com\/tommcfarlin\/f9de10bd98d0ba3dd22c914b01fad140#file-00-toggle-admin-notices-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fragment kodu<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace TAN;\nuse TANAdmin;\n\ninclude_once( 'admin\/class-toggle-admin-notices-node.php' );\ninclude_once( 'admin\/interfaces\/interface-asset.php' );\ninclude_once( 'admin\/class-javascript-assets.php' );\n\nadd_action( 'plugins_loaded', __NAMESPACE__. 'tan_start' );\n\/**\n * Initializes the JavaScript loader and the Administration Bar Node for\n * rendering the option to toggle admin notices.\n *\/\nfunction tan_start() {\n  \/\/ Code removed for brevity.\n}\n<\/code><\/pre>\n<p>Ten kod pochodzi bezpo\u015brednio z <a href=\"https:\/\/tommcfarlin.com\/wordpress-admin-notices\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Toggle Admin Notices<\/a>. To prawda, jest to proste, a <a href=\"https:\/\/github.com\/tommcfarlin\/toggle-admin-notices\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repozytorium<\/a> pokazuje notatk\u0119, jak to zmieni\u0107. To jednak pokazuje, o co chodzi, prawda?<\/p>\n<p>Jakie jest rozwi\u0105zanie? Dzieje si\u0119 to w formie automatycznego \u0142adowania (kt\u00f3re jest r\u00f3wnie\u017c om\u00f3wione w <a href=\"http:\/\/www.php-fig.org\/psr\/psr-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PSR-4<\/a> ). Co z tego, je\u015bli mia\u0142bym go przerobi\u0107, aby prawid\u0142owo pod\u0105\u017ca\u0142 za PSR-1? Wtedy jeden ze sposob\u00f3w refaktoryzacji mo\u017ce <a href=\"https:\/\/gist.github.com\/tommcfarlin\/f9de10bd98d0ba3dd22c914b01fad140#file-01-toggle-admin-notices-autoloading-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wygl\u0105da\u0107 tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace TAN;\nuse TANAdmin;\n\ninclude_once 'inc\/autoload.php';\n\nadd_action( 'plugins_loaded', __NAMESPACE__. 'tan_start' );\n\/**\n * Initializes the JavaScript loader and the Administration Bar Node for\n * rendering the option to toggle admin notices.\n *\/\nfunction tan_start() {\n  \/\/ Code removed for brevity.\n}\n<\/code><\/pre>\n<p>Czy to \u015bwietny przyk\u0142ad? Prawdopodobnie nie. Ale to co\u015b wi\u0119cej ni\u017c tylko do\u0142\u0105czanie plik\u00f3w. W\u0142\u0105czenie tych plik\u00f3w powoduje, \u017ce ten pojedynczy plik wprowadza r\u00f3\u017cne skutki uboczne.<\/p>\n<p>Oznacza to, \u017ce ten jeden plik jest odpowiedzialny za du\u017co wi\u0119cej ni\u017c tylko te cztery linijki kodu. Pomy\u015bl o tym jako zawieraj\u0105cym wszystko, co implementuj\u0105 inne pliki. W tym momencie staje si\u0119 bardziej z\u0142o\u017cona.<\/p>\n<p>Wi\u0119c we\u017a ten pomys\u0142 i przenie\u015b go do znacznie wi\u0119kszego systemu, a zobaczysz, jak i dlaczego by\u0142oby to problematyczne.<\/p>\n<p>Oczywi\u015bcie istniej\u0105 r\u00f3wnie\u017c alternatywne sposoby. A to tylko jeden przyk\u0142ad. A tak\u017ce autodeprecjonuj\u0105ce. Nie chodzi tu o pokazanie ostatecznego sposobu na zrobienie tego, ale o zasianie my\u015bli o tym, jak projektujemy, planujemy, budujemy i w\u0142\u0105czamy klasy.<\/p>\n<h3>A co z widokami?<\/h3>\n<p>Je\u015bli chodzi o pisanie wtyczek, wol\u0119 traktowa\u0107 to, co u\u017cytkownicy zobacz\u0105 jako <strong>widoki.\u00a0<\/strong>Ale wydaje si\u0119, \u017ce jest tu pewien haczyk: do\u0142\u0105czanie plik\u00f3w jest uwa\u017cane za kiepsk\u0105 praktyk\u0119, poniewa\u017c powoduje to skutki uboczne.<\/p>\n<p>Nie chcemy wi\u0119c wyprowadza\u0107 logiki w naszych klasach, ale chcemy r\u00f3wnie\u017c oddzieli\u0107 prezentacj\u0119 od logiki biznesowej.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166223-61e7906a0bf19.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-166223-61e7906a0bf19.png\" alt=\"Podstawowe standardy kodowania za po\u015brednictwem PSR-1\" ><\/a><\/p>\n<p>Co mamy robi\u0107?<\/p>\n<blockquote>\n<p>Skr\u0119t\u2026 polega na tym, \u017ce u\u017cyjemy do tego programowania obiektowego. Zaprojektujemy klas\u0119 generuj\u0105c\u0105 HTML przy u\u017cyciu szablonu PHP.<\/p>\n<\/blockquote>\n<p>Zosta\u0142o to dog\u0142\u0119bnie om\u00f3wione <a href=\"https:\/\/carlalexander.ca\/designing-class-generate-wordpress-html-content\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przez kogo\u015b innego<\/a> i bardzo polecam przeczytanie tego konkretnego postu, aby wzi\u0105\u0107 pod uwag\u0119 ide\u0119 skutk\u00f3w ubocznych, unikn\u0105\u0107 ich i jak najwi\u0119cej zastosowa\u0107 solidne praktyki.<\/p>\n<h2>\u2026A zasoby i powi\u0105zane pliki?<\/h2>\n<p>Wiem: pomys\u0142 odej\u015bcia od skutk\u00f3w ubocznych (nie m\u00f3wi\u0105c ju\u017c o ich identyfikacji) mo\u017ce by\u0107 pocz\u0105tkowo dziwny, zw\u0142aszcza gdy my\u015blisz o pewnych rzeczach, kt\u00f3re robili\u015bmy od tak dawna.<\/p>\n<p>Mo\u017ce te\u017c rodzi\u0107 pytania typu: Czy do\u0142\u0105czanie plik\u00f3w JavaScript lub CSS jest niew\u0142a\u015bciwe? To chyba temat na inny post. Pami\u0119taj jednak, \u017ce istniej\u0105 podstawowe funkcje API bezpo\u015brednio z tym zwi\u0105zane i mog\u0105 by\u0107 cz\u0119\u015bci\u0105 klasy \u015bci\u015ble odpowiedzialnej za to.<\/p>\n<p>Je\u015bli celem klasy jest zrobienie dok\u0142adnie tego i tylko tego, a u\u017cywa do tego funkcji API, to powiedzia\u0142bym, \u017ce prawdopodobnie jest w porz\u0105dku.<\/p>\n<p>Ale na razie dygresj\u0119 w tej sprawie (a mo\u017ce to temat na komentarze lub kolejny post).<\/p>\n<p>Zamiast tego utrzymuj lekcje szczup\u0142e i celowe. Powinni post\u0119powa\u0107 zgodnie ze stanami <a href=\"http:\/\/www.php-fig.org\/psr\/psr-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PSR-1<\/a> i unika\u0107 robienia takich rzeczy jak \u201e[deklarowanie] nowych klas, funkcji, sta\u0142ych itp.&#8221; oraz \u201e[wykonywanie] logiki z efektami ubocznymi&#8221;.<\/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>Utrzymuj celowo\u015b\u0107 swoich zaj\u0119\u0107. Unikaj rzeczy takich jak \u201e[deklarowanie] nowych klas, funkcji, sta\u0142ych itp.\u201d oraz \u201e[wykonywanie] logiki z efektami ubocznymi\u201d.<\/p>\n","protected":false},"author":1,"featured_media":166224,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721],"tags":[1169],"class_list":["post-229043","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229043","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=229043"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229043\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/166224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}