{"id":230744,"date":"2022-12-19T15:07:00","date_gmt":"2022-12-19T12:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230744"},"modified":"2022-12-07T10:05:11","modified_gmt":"2022-12-07T07:05:11","slug":"programowanie-wordpress-oddzielanie-obaw","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-wordpress-oddzielanie-obaw\/","title":{"rendered":"Programowanie WordPress: oddzielanie obaw"},"content":{"rendered":"\n<p>Je\u015bli chodzi o tworzenie klas dla wtyczek do WordPressa, pytano mnie, dlaczego zawracam sobie g\u0142ow\u0119 rozdzieleniem funkcjonalno\u015bci na subskrybent\u00f3w i na inne klasy.<\/p>\n<p>My\u015bl\u0119, \u017ce to dobre pytanie, poniewa\u017c pomaga zrozumie\u0107 dwie rzeczy:<\/p>\n<ol>\n<li>rola subskrybenta w odniesieniu do architektury WordPress,<\/li>\n<li>rola innych klas w odniesieniu do tego, co tworzysz (i jak to mo\u017ce pom\u00f3c w innych rzeczach, takich jak testowanie jednostkowe i tak dalej).<\/li>\n<\/ol>\n<p>Pomy\u015bla\u0142em wi\u0119c, dlaczego nie odpowiedzie\u0107 w formie kr\u00f3tkiego posta? B\u0119dzie dokumentowa\u0107, dlaczego stoi za czym [i da mi miejsce do aktualizacji, je\u015bli co\u015b zmieni si\u0119 w przysz\u0142o\u015bci].<\/p>\n<h2>Programowanie WordPress: subskrybenci i obiekty domeny<\/h2>\n<p>Rozwa\u017cam klasy, kt\u00f3re nie s\u0105 obiektami domeny subskrybenta, kt\u00f3re pochodz\u0105 z podej\u015bcia programistycznego do projektowania opartego na domenie.<\/p>\n<p>To wykracza poza zakres tego postu, ale warto wspomnie\u0107, je\u015bli nie z innego powodu, poniewa\u017c nadaje to kontekst temu, co w przeciwnym razie by\u0142oby uznane za \u017cargon.<\/p>\n<h3>1 Subskrybenci<\/h3>\n<p>Ale najpierw subskrybenci.<\/p>\n<p>Poniewa\u017c WordPress opiera si\u0119 na systemie przechwytuj\u0105cym \u2014 systemie opartym na wzorcu projektowym opartym na zdarzeniach \u2014 warto mie\u0107 klas\u0119, kt\u00f3ra reaguje na ka\u017cde zdarzenie.<\/p>\n<p>Mo\u017ce to dotyczy\u0107 dowolnego wst\u0119pnie zdefiniowanego haka WordPress lub dowolnych hak\u00f3w niestandardowych. Nie wa\u017cne.<\/p>\n<p>I nie chc\u0119, aby klasa by\u0142a bardziej skomplikowana ni\u017c to konieczne, wi\u0119c my\u015bl\u0119 o nich w ten spos\u00f3b:<\/p>\n<p>Abonent odpowiada za ka\u017cdym razem, gdy wydarzy si\u0119 okre\u015blone zdarzenie.<\/p>\n<p>I to wszystko. To zdarzenie mo\u017ce by\u0107 czym\u015b w rodzaju <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/after_setup_theme\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">after_theme_setup<\/a> lub <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/the_content\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">the_content<\/a>, a nawet <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/init\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">init<\/a>. To nie ma znaczenia.<\/p>\n<p>Czeka na zdarzenie, a nast\u0119pnie odpowiada w tym, co zdecydujemy, za pomoc\u0105 innego kodu (w kt\u00f3rym w gr\u0119 wchodz\u0105 obiekty domeny).<\/p>\n<h3>2 obiekty domeny<\/h3>\n<p>Mog\u0105 by\u0107 r\u00f3wnie\u017c nazywane obiektami biznesowymi lub podobnie. Ich idea jest nast\u0119puj\u0105ca:<\/p>\n<p>Wszystko, co robimy w programowaniu obiektowym, ma na celu rozwi\u0105zanie konkretnego problemu i ma to na celu zrobienie tego poprzez jaki\u015b rodzaj obiektu, kt\u00f3ry reprezentuje obiekt ze \u015bwiata rzeczywistego lub przynajmniej konkretn\u0105 ide\u0119.<\/p>\n<p>Tak wi\u0119c za ka\u017cdym razem, gdy pracujesz nad zapewnieniem komu\u015b rozwi\u0105zania, pisane przez Ciebie klasy \u2014 obiekty, kt\u00f3rymi stan\u0105 si\u0119 po utworzeniu instancji \u2014 s\u0105 obiektami domeny.<\/p>\n<p>S\u0105 to r\u00f3wnie\u017c klasy, kt\u00f3re wykonuj\u0105 rzeczywist\u0105 prac\u0119. Mo\u017cesz wi\u0119c my\u015ble\u0107 o tym w trzech elementach:<\/p>\n<ol>\n<li><strong>WordPress<\/strong>. Podstawowa aplikacja, oczywi\u015bcie, kt\u00f3ra podnosi zdarzenie, na kt\u00f3re reaguj\u0105 subskrybenci.<\/li>\n<li><strong>Abonenci<\/strong>. Zbi\u00f3r klas odpowiedzialnych za nas\u0142uchiwanie okre\u015blonego zdarzenia, a nast\u0119pnie tworzenie instancji odpowiedniego obiektu do obs\u0142ugi kodu.<\/li>\n<li><strong>Obiekty domeny<\/strong>. Kod, kt\u00f3ry faktycznie wykonuje prac\u0119 polegaj\u0105c\u0105 na pobieraniu zestawu danych, operowaniu na nim, a nast\u0119pnie potencjalnie zwracaniu warto\u015bci.<\/li>\n<\/ol>\n<p>Obiekty domeny s\u0105 miejscem, w kt\u00f3rym \u017cyje kod faktycznie robienia czego\u015b. Subskrybenci s\u0105 jak po\u0142\u0105czenie mi\u0119dzy WordPressem a wspomnian\u0105 funkcjonalno\u015bci\u0105.<\/p>\n<p>Subskrybenci m\u00f3wi\u0105: \u201eTo wydarzenie si\u0119 wydarzy\u0142o i ta klasa jest zdolna i odpowiedzialna za obs\u0142ug\u0119 jego wynik\u00f3w&quot;.<\/p>\n<h2>A co z testowaniem i tak dalej?<\/h2>\n<p>Wcze\u015bniej w po\u015bcie m\u00f3wi\u0142em o tym, jak obiekty domeny s\u0105 powi\u0105zane z testowaniem jednostkowym i innymi technikami programowania zwi\u0105zanymi z kontrol\u0105 jako\u015bci.<\/p>\n<p>Chocia\u017c nie jest to post zawieraj\u0105cy szczeg\u00f3\u0142y, warto wspomnie\u0107, \u017ce utrzymywanie obiekt\u00f3w domeny i subskrybent\u00f3w oddzielonych od siebie (i z kolei od WordPressa) pozwala nam tworzy\u0107 wyst\u0105pienia, testowa\u0107 i pracowa\u0107 z obiektami, kt\u00f3re s\u0105 wywo\u0142ywane przez subskrybent\u00f3w bez konieczno\u015bci w\u0142\u0105czania WordPressa do naszej pracy.<\/p>\n<p>A to mo\u017ce by\u0107 niezwykle pomocne przy budowaniu wi\u0119kszych rozwi\u0105za\u0144. Ale sednem tego, jak to zrobi\u0107, jest tre\u015b\u0107 innego posta.<\/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>Je\u015bli chodzi o programowanie WordPress, zw\u0142aszcza z wtyczkami, po co zawraca\u0107 sobie g\u0142ow\u0119 rozdzielaniem funkcjonalno\u015bci na subskrybent\u00f3w i na inne klasy?<\/p>\n","protected":false},"author":1,"featured_media":234940,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,836,866],"tags":[1169],"class_list":["post-230744","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-przewodnik-dla-poczatkujacych","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230744","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=230744"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/234940"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}