{"id":228807,"date":"2022-11-03T19:34:00","date_gmt":"2022-11-03T16:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228807"},"modified":"2022-11-09T04:21:06","modified_gmt":"2022-11-09T01:21:06","slug":"korzysci-ze-wzorca-repozytorium-dlaczego-powinnismy-je-brac-pod-uwage","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/korzysci-ze-wzorca-repozytorium-dlaczego-powinnismy-je-brac-pod-uwage\/","title":{"rendered":"Korzy\u015bci ze wzorca repozytorium: dlaczego powinni\u015bmy je bra\u0107 pod uwag\u0119"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/podklad-wzorca-repozytorium\/\" title=\"Wczoraj\" >Wczoraj<\/a> da\u0142em podk\u0142ad na temat wzorca repozytorium. Kr\u00f3tko m\u00f3wi\u0105c, jest to jeden z tych wzorc\u00f3w, kt\u00f3ry powinien zrozumie\u0107 ka\u017cdy pracuj\u0105cy nad oprogramowaniem po\u015brednicz\u0105cym opartym na WordPressie.<\/p>\n<p>Podaj\u0105c podk\u0142ad na taki wz\u00f3r, mo\u017ce by\u0107 trudno odda\u0107 sprawiedliwo\u015b\u0107 wzorowi, gdy trzeba:<\/p>\n<ul>\n<li>przedstaw to,<\/li>\n<li>wyja\u015bnij, jak to dzia\u0142a,<\/li>\n<li>pokry\u0107 korzy\u015bci,<\/li>\n<li>i daj ma\u0142e demo.<\/li>\n<\/ul>\n<p>Ale prawdziwa zaleta repozytorium polega nie tylko na oddzieleniu warstwy danych od reszty aplikacji, ale tak\u017ce na tym, \u017ce mo\u017ce (lub powinna) by\u0107 \u0142atwo wymieniana z r\u00f3\u017cnymi magazynami danych bez zmiany API.<\/p>\n<p>Na przyk\u0142ad w jednym przypadku mo\u017ce by\u0107 konieczne pobranie danych z bazy danych WordPress, w innych przypadkach mo\u017ce by\u0107 konieczne pobranie czego\u015b z API innej firmy, a mo\u017ce jest jakie\u015b inne miejsce, z kt\u00f3rego musisz pobra\u0107 dane.<\/p>\n<p>Niezale\u017cnie od tego, idea wzorca repozytorium polega na tym, \u017ce to, co si\u0119 za nim znajduje, nie ma znaczenia, o ile udost\u0119pniany przez niego interfejs API dzia\u0142a dla warstwy aplikacji, kt\u00f3ra go wywo\u0142uje.<\/p>\n<p>A poniewa\u017c om\u00f3wili\u015bmy ju\u017c elementarz wzorca repozytorium, przyjrzyjmy si\u0119 niekt\u00f3rym zaletom wzorca repozytorium i sposobom jego implementacji w kontek\u015bcie projekt\u00f3w WordPress.<\/p>\n<h2>Korzy\u015bci ze wzorca repozytorium<\/h2>\n<p>Jest kilka sposob\u00f3w na rozpocz\u0119cie wyja\u015bniania wzoru, wi\u0119c zaczn\u0119 od prostego diagramu:<\/p>\n<p>Korzy\u015bci ze wzorca repozytorium obejmuj\u0105 abstrakcj\u0119 magazynu danych<\/p>\n<p>Zauwa\u017c, \u017ce na powy\u017cszym obrazku istniej\u0105 trzy g\u0142\u00f3wne elementy:<\/p>\n<ol>\n<li>logika domeny (lub logika biznesowa), kt\u00f3r\u0105 nazwa\u0142em \u201eApp&quot;,<\/li>\n<li>repozytorium,<\/li>\n<li>magazyn danych,<\/li>\n<\/ol>\n<p>Je\u015bli chodzi o aplikacj\u0119, regu\u0142y biznesowe zawsze pozostan\u0105 wzgl\u0119dnie sp\u00f3jne. Przynajmniej powinni, prawda?<\/p>\n<p>Repozytorium dzia\u0142a jako \u015brodek komunikacji mi\u0119dzy logik\u0105 biznesow\u0105 a magazynem danych.<\/p>\n<p>Teraz magazynem danych mo\u017ce by\u0107 baza danych, by\u0107 mo\u017ce zestaw plik\u00f3w (czego nie polecam), API dla os\u00f3b trzecich, lista informacji pobranych z innej aplikacji i tak dalej.<\/p>\n<p>Chodzi o to, \u017ce repozytorium zapewni czyste API, do kt\u00f3rego logika biznesowa mo\u017ce zapisywa\u0107 i odczytywa\u0107 (i wi\u0119cej o tym za chwil\u0119) bez martwienia si\u0119 o szczeg\u00f3\u0142y, dok\u0105d dane id\u0105 lub jak wracaj\u0105.<\/p>\n<p>To zadanie repozytorium. I w\u0142a\u015bnie dlatego wa\u017cne jest posiadanie sp\u00f3jnego interfejsu API i to jest wa\u017cne, aby upewni\u0107 si\u0119, \u017ce zawiera szczeg\u00f3\u0142y implementacji magazynu danych, z kt\u00f3rym wchodzi w interakcj\u0119.<\/p>\n<h3>Na sprz\u0119\u017ceniu<\/h3>\n<p>Opr\u00f3cz prawid\u0142owego segmentowania aplikacji, wzorzec repozytorium przynosi korzy\u015bci architekturze, poniewa\u017c pomaga oddzieli\u0107 cz\u0119\u015bci aplikacji.<\/p>\n<p>Oznacza to, \u017ce logika biznesowa nie wie nic o tym, jak i gdzie przechowywane s\u0105 dane. Po prostu wie, \u017ce mo\u017ce to napisa\u0107 i pobra\u0107, i mo\u017ce to zrobi\u0107 za pomoc\u0105 czystego interfejsu API.<\/p>\n<p>Repozytorium jest odpowiedzialne za komunikacj\u0119 wspomnianego magazynu danych w celu zorganizowania serializacji i pobierania, ale musi zapewnia\u0107 sp\u00f3jne API, wi\u0119c warstwa danych nie musi wykonywa\u0107 \u017cadnej gimnastyki sk\u0142adniowej, aby czyta\u0107 i zapisywa\u0107 informacje.<\/p>\n<h3>Szczeg\u00f3\u0142y dotycz\u0105ce wdro\u017cenia<\/h3>\n<p>Do tego momentu reprezentowa\u0142em repozytorium jako konkretn\u0105 klas\u0119.<\/p>\n<p>Chodzi o to, \u017ce aplikacja prawdopodobnie b\u0119dzie mia\u0142a wiele repozytori\u00f3w. Z tego powodu dobrym pomys\u0142em jest posiadanie interfejs\u00f3w, kt\u00f3re mo\u017ce zaimplementowa\u0107 ka\u017cde repozytorium.<\/p>\n<p>W ten spos\u00f3b definiujesz kontrakt metod, kt\u00f3re zapewni repozytorium. W ten spos\u00f3b mo\u017cesz upewni\u0107 si\u0119, \u017ce ka\u017cde repozytorium jest po\u0142\u0105czone z odpowiednim magazynem danych.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166772-61e79a138aeb3.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-166772-61e79a138aeb3.png\" alt=\"Korzy\u015bci ze wzorca repozytorium: dlaczego powinni\u015bmy je bra\u0107 pod uwag\u0119\" ><\/a><\/p>\n<p>Implementacja interfejsu dla wielu repozytori\u00f3w.<\/p>\n<p>Za\u0142\u00f3\u017cmy wi\u0119c, \u017ce Twoja aplikacja musi komunikowa\u0107 si\u0119 z baz\u0105 danych WordPress, a tak\u017ce z zewn\u0119trznym API.<\/p>\n<p>W idealnym przypadku interfejs zapewnia\u0142by wsp\u00f3lny zestaw metod, ale szczeg\u00f3\u0142y implementacji r\u00f3\u017cni\u0142yby si\u0119 w zale\u017cno\u015bci od repozytorium, poniewa\u017c ka\u017cde repozytorium b\u0119dzie mia\u0142o niezb\u0119dne po\u015bwiadczenia i mo\u017cliwo\u015b\u0107 komunikacji z magazynem danych.<\/p>\n<p>Jednak post\u0119p w interfejsie jest tym, co nadaje wzorowi moc. Logika domeny nie musi martwi\u0107 si\u0119 o spos\u00f3b zapisywania lub pobierania informacji. Po prostu wywo\u0142uje metody zdefiniowane w interfejsie, a niezb\u0119dny obiekt si\u0119 tym zajmuje.<\/p>\n<p>Po prostu wywo\u0142uje metody zdefiniowane w interfejsie, a niezb\u0119dny obiekt si\u0119 tym zajmuje.<\/p>\n<h2>Jak by to wygl\u0105da\u0142o w WordPressie?<\/h2>\n<p>To jest dobre pytanie (i nie, nie wymy\u015bli\u0142em go tylko po to, \u017ceby samemu odpowiedzie\u0107 \ud83d\ude42), a podanie \u015bwietnego przyk\u0142adu mo\u017ce by\u0107 trudne, poniewa\u017c wiele z tego, co robimy, oddzia\u0142uje bezpo\u015brednio z baz\u0105 danych WordPressa.<\/p>\n<p>Nie oznacza to, \u017ce nie ma abstrakcji, kt\u00f3rych mo\u017cemy u\u017cy\u0107, takich jak posty, strony, u\u017cytkownicy lub jakiekolwiek inne niestandardowe typy post\u00f3w, kt\u00f3re zdecydujemy si\u0119 tworzy\u0107.<\/p>\n<p>Ale WordPress zapewnia API do wi\u0119kszo\u015bci z nich. Widz\u0119 przypadek, w kt\u00f3rym, powiedzmy, u\u017cytkownik z dodatkowymi polami, kt\u00f3re zosta\u0142y dodane, m\u00f3g\u0142by skorzysta\u0107 z repozytorium u\u017cytkownik\u00f3w.<\/p>\n<p>Lub niestandardowy typ postu z du\u017c\u0105 ilo\u015bci\u0105 metadanych mo\u017ce r\u00f3wnie\u017c skorzysta\u0107 z repozytorium, poniewa\u017c szczeg\u00f3\u0142y s\u0105 enkapsulowane w repozytorium.<\/p>\n<h3>Przyk\u0142ad wysokiego poziomu<\/h3>\n<p>Za\u0142\u00f3\u017cmy na przyk\u0142ad, \u017ce masz niestandardowy typ wpisu dla wydarzenia, a wydarzenie ma tytu\u0142 i opis, kt\u00f3re naturalnie pasuj\u0105 do tytu\u0142u i tre\u015bci wpisu.<\/p>\n<p>Ale potem ma metadane dotycz\u0105ce jego lokalizacji, czasu rozpocz\u0119cia, czasu zako\u0144czenia i tak dalej. To mo\u017ce by\u0107 r\u00f3wnie\u017c zamkni\u0119te w repozytorium, dzi\u0119ki czemu mo\u017cna mie\u0107 obiekt Event, przekaza\u0107 go do repozytorium, a nast\u0119pnie pozwoli\u0107 repozytorium wys\u0142a\u0107 informacje do odpowiedniego miejsca w bazie danych.<\/p>\n<p>To samo dotyczy pobierania informacji: wie, gdzie je zdoby\u0107, jak wype\u0142ni\u0107 obiekt Event, a nast\u0119pnie przekaza\u0107 go z powrotem wywo\u0142uj\u0105cemu.<\/p>\n<h2>Z powrotem w grze<\/h2>\n<p>Ale ca\u0142a ta rozmowa o wydarzeniu jest troch\u0119 nie na temat, wi\u0119c by\u0107 mo\u017ce b\u0119d\u0119 nadal m\u00f3wi\u0107 o tym i o tym, jak pasuje do repozytorium w kolejnym po\u015bcie. Oczywi\u015bcie, m\u00f3wi\u0105c o tym, jest wiele do om\u00f3wienia.<\/p>\n<p>Wola\u0142bym robi\u0107 to ma\u0142ymi krokami<\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, je\u015bli masz repozytorium zdarze\u0144, prawdopodobnie masz obiekt zdarzenia lub encj\u0119 zdarzenia. A to, jak to pasuje do WordPressa, niestandardowych typ\u00f3w post\u00f3w, metadanych itd., wprowadza poziom z\u0142o\u017cono\u015bci, kt\u00f3ry na pocz\u0105tku mo\u017ce wydawa\u0107 si\u0119 zniech\u0119caj\u0105cy, ale ostatecznie op\u0142aca si\u0119 podczas pracy z wi\u0119ksz\u0105 aplikacj\u0105 internetow\u0105.<\/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>Przyjrzyjmy si\u0119 niekt\u00f3rym zaletom wzorca repozytorium i sposobom jego implementacji w kontek\u015bcie projekt\u00f3w WordPress.<\/p>\n","protected":false},"author":1,"featured_media":223872,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,845],"tags":[1169],"class_list":["post-228807","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228807","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=228807"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228807\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223872"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228807"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228807"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228807"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}