{"id":228537,"date":"2022-10-25T10:10:00","date_gmt":"2022-10-25T07:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228537"},"modified":"2022-11-09T03:01:46","modified_gmt":"2022-11-09T00:01:46","slug":"wiele-obiektow-zapisuje-dane-jak-tego-uniknac","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/wiele-obiektow-zapisuje-dane-jak-tego-uniknac\/","title":{"rendered":"Wiele obiekt\u00f3w zapisuje dane: jak tego unikn\u0105\u0107"},"content":{"rendered":"\n<p>Znasz te czasy, kiedy pracujesz nad programem, a w Twoim kodzie s\u0105 miejsca, kt\u00f3re w zale\u017cno\u015bci od wymaga\u0144 lub pojawiaj\u0105cy si\u0119 w jaki\u015b spos\u00f3b b\u0142\u0105d jest bezpo\u015brednio zwi\u0105zany z faktem, \u017ce masz wiele obiekt\u00f3w zapisuj\u0105cych dane do tego samego magazynu danych? To nie jest dobra rzecz.<\/p>\n<p>To okropny spos\u00f3b na rozpocz\u0119cie postu. Spr\u00f3buj\u0119 jeszcze raz.<\/p>\n<h2>Wiele obiekt\u00f3w zapisuje dane<\/h2>\n<p>Za\u0142\u00f3\u017cmy, \u017ce pracujesz nad programem i jedn\u0105 z rzeczy, kt\u00f3re wykonuje kod, jest aktualizowanie licznika gdzie\u015b w bazie danych, aby \u015bledzi\u0107, ile zmian zasz\u0142o w kr\u00f3tkim okresie czasu.<\/p>\n<p>Problem: masz wiele miejsc w kodzie, kt\u00f3re aktualizuj\u0105 ten licznik.<\/p>\n<p>Wiele obiekt\u00f3w zapisuje dane (w przypadku, gdy moje pismo odr\u0119czne jest tak nieczytelne, jak si\u0119 wydaje).<\/p>\n<p>Nie s\u0105dz\u0119, aby wielu z nas chcia\u0142o pisa\u0107 taki kod, ale tak si\u0119 dzieje, a kiedy to si\u0119 dzieje, ko\u0144czy si\u0119 to tymi wszystkimi skutkami ubocznymi, kt\u00f3re po prostu powoduj\u0105 r\u00f3\u017cne rodzaje dziwacznych zachowa\u0144. (Nie znam oficjalnego, akademickiego terminu na to \u2013 i nie mam na my\u015bli <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">DRY<\/a> \u2013 ale nie mam nic przeciwko \u201ezabawnemu zachowaniu&quot; w tym po\u015bcie.)<\/p>\n<p>Wiemy intuicyjnie, \u017ce powinni\u015bmy mie\u0107 jedno miejsce, w kt\u00f3rym to wszystko si\u0119 dzieje, czynniki zewn\u0119trzne \u2013 czy to pe\u0142zanie zakresu, czy nieporozumienie z naszej strony w zrozumieniu wymaga\u0144, czy cokolwiek innego \u2013 powoduj\u0105 s\u0142abe kodowanie.<\/p>\n<p>Tak wi\u0119c mamy wszystkie te <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/typy-postow-wordpress-abstrakcja-dla-podmiotow\/\" title=\"podmioty\">podmioty<\/a> w naszym systemie, z kt\u00f3rych ka\u017cdy rozmawia z jednym punktem w naszej bazie danych (lub jakimkolwiek innym magazynie danych), ale \u017caden z nich nie jest \u015bwiadomy, \u017ce inni z nimi rozmawiaj\u0105.<\/p>\n<h2>Ustaw granice<\/h2>\n<p>Mo\u017cemy spr\u00f3bowa\u0107 zwalczy\u0107 to za pomoc\u0105 instrukcji warunkowych i innych, ale tylko to pogarszamy. Wi\u0119c co mamy zrobi\u0107?<\/p>\n<p>Wiem, podobnie jak w przypadku wielu rzeczy w programowaniu, jest wiele sposob\u00f3w rozwi\u0105zania tego problemu, ale by\u0107 mo\u017ce jednym z pierwszych przej\u015b\u0107 refaktoryzacji jest posiadanie klasy odpowiedzialnej za wydawanie aktualizacji do datastore.<\/p>\n<p>W ten spos\u00f3b mo\u017cemy przej\u015b\u0107 od powy\u017cszej ilustracji do czego\u015b takiego:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167733-61e7a7cc3a1aa.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-167733-61e7a7cc3a1aa.png\" alt=\"Wiele obiekt\u00f3w zapisuje dane: jak tego unikn\u0105\u0107\" ><\/a><\/p>\n<p>Wiele obiekt\u00f3w zapisuj\u0105cych dane: Wy\u015blij je do swego rodzaju mediatora.<\/p>\n<p>Czyli wszystkie encje spo\u0142eczno\u015bci z tym obiektem i tym obiektem \u2013 i tylko ten obiekt mo\u017ce odczytywa\u0107 i zapisywa\u0107 dane do bazy danych.<\/p>\n<p>Jest kilka <a href=\"https:\/\/sourcemaking.com\/design_patterns\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wzorc\u00f3w projektowych<\/a>, kt\u00f3re pasowa\u0142yby do tego konkretnego problemu, ale to wykracza poza zakres tego postu. Zamiast tego staram si\u0119 zwr\u00f3ci\u0107 uwag\u0119 na to, \u017ce je\u015bli napotkasz problem:<\/p>\n<ul>\n<li>Podmioty zapisuj\u0105 dane do magazynu danych,<\/li>\n<li>Robi to wiele podmiot\u00f3w,<\/li>\n<li>I rodzi niezamierzone konsekwencje,<\/li>\n<\/ul>\n<p>Nast\u0119pnie spr\u00f3buj stworzy\u0107 klas\u0119 lub zbi\u00f3r klas \u015bci\u015ble odpowiedzialnych za odczytywanie i zapisywanie danych. Tylko pozw\u00f3l, aby informacje przechodzi\u0142y przez te klasy, zamiast mie\u0107 wiele klas, aby manipulowa\u0107 danymi.<\/p>\n<p>U\u0142atwia testowanie, u\u0142atwia debugowanie i ostatecznie u\u0142atwia czytanie.<\/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>Posiadanie wielu obiekt\u00f3w zapisuj\u0105cych dane w jednym magazynie danych w wielu miejscach ma negatywne skutki uboczne. Oto spos\u00f3b, aby to naprawi\u0107.<\/p>\n","protected":false},"author":1,"featured_media":221243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721],"tags":[1169],"class_list":["post-228537","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\/228537","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=228537"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228537\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/221243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}