{"id":229054,"date":"2022-11-09T14:53:00","date_gmt":"2022-11-09T11:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229054"},"modified":"2022-11-09T15:24:13","modified_gmt":"2022-11-09T12:24:13","slug":"jakie-sa-w-ogole-skutki-uboczne-programowania","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/jakie-sa-w-ogole-skutki-uboczne-programowania\/","title":{"rendered":"Jakie s\u0105 w og\u00f3le skutki uboczne programowania?"},"content":{"rendered":"\n<p>Ilekro\u0107 m\u00f3wimy o pewnych koncepcjach programistycznych, my\u015bl\u0119, \u017ce wa\u017cne jest, aby cofn\u0105\u0107 si\u0119 o krok od wszelkich szczeg\u00f3\u0142\u00f3w, o kt\u00f3rych rozmawiamy i spojrze\u0107 na sprawy w kontek\u015bcie szerszego obrazu.<\/p>\n<p>Niekt\u00f3re modu\u0142y wprowadzaj\u0105 efekty uboczne; niekt\u00f3rzy nie. W porz\u0105dku.<\/p>\n<p>Na przyk\u0142ad <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/podstawowe-standardy-kodowania-za-posrednictwem-psr-1\/\" title=\"wczoraj\">wczoraj<\/a> kr\u00f3tko poruszy\u0142em pomys\u0142 programowania efekt\u00f3w ubocznych, ale zrobi\u0142em to, m\u00f3wi\u0105c o korzystaniu z PSR. A dla tych, kt\u00f3rzy po prostu interesuj\u0105 si\u0119 aspektami programowania w bardziej og\u00f3lnym sensie, wa\u017cne jest r\u00f3wnie\u017c, aby je zrozumie\u0107.<\/p>\n<p>Pami\u0119taj, \u017ce idea skutk\u00f3w ubocznych <a href=\"http:\/\/www.php-fig.org\/psr\/psr-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, o kt\u00f3rej mowa w PSR-1,<\/a> to:<\/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<\/blockquote>\n<p>W tym po\u015bcie nie jestem tak zainteresowany omawianiem logiki ze skutkami ubocznymi (poniewa\u017c zdarzaj\u0105 si\u0119 sytuacje, w kt\u00f3rych efekty uboczne si\u0119 zdarzaj\u0105). Zamiast tego jestem bardziej zainteresowany zrozumieniem efekt\u00f3w ubocznych programowania (czym one s\u0105, czego nale\u017cy unika\u0107 itd.).<\/p>\n<p>W ko\u0144cu m\u00f3wienie o skutkach ubocznych w jednym kontek\u015bcie mo\u017ce oznacza\u0107 jedno, podczas gdy w programowaniu mo\u017ce oznacza\u0107 co\u015b innego.<\/p>\n<h2>Programowanie skutk\u00f3w ubocznych<\/h2>\n<p>Ok, wi\u0119c ca\u0142y pomys\u0142 lub definicja og\u00f3lnego efektu ubocznego jest prosta, <a href=\"https:\/\/d.pr\/Jyf2Np\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">prawda<\/a>? <\/p>\n<blockquote>\n<p>wt\u00f3rny, zwykle niepo\u017c\u0105dany efekt leku lub leczenia medycznego.<\/p>\n<\/blockquote>\n<p>Usu\u0144 ca\u0142y aspekt leczenia, a zostaniesz z \u201edrugorz\u0119dnym, \u2026 niepo\u017c\u0105danym efektem&quot;. Dobrze, wi\u0119c oto potencjalnie myl\u0105ca cz\u0119\u015b\u0107:<\/p>\n<ul>\n<li>decydujemy si\u0119 do\u0142\u0105czy\u0107 plik,<\/li>\n<li>wiemy, co robi plik,<\/li>\n<li>tak wi\u0119c, je\u015bli wiemy, co <a href=\"https:\/\/php.net\/manual\/en\/function.include-once.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zawieramy<\/a> i co robi, jak mo\u017ce wprowadzi\u0107 co\u015b niepo\u017c\u0105danego?<\/li>\n<\/ul>\n<p>Przynajmniej tak cz\u0119sto s\u0142ysz\u0119 to pytanie, je\u015bli chodzi o m\u00f3wienie o skutkach ubocznych. W programowaniu zawsze uog\u00f3lnia\u0142em efekty uboczne jako wszystko, co zmienia stan programu.<\/p>\n<p>Wystarczaj\u0105co \u0142atwe, prawda?<\/p>\n<h3>Skutki uboczne w WordPressie<\/h3>\n<p>Za\u0142\u00f3\u017cmy, \u017ce pracujesz z WordPressem, poniewa\u017c to w\u0142a\u015bnie robi\u0119 <a href=\"https:\/\/tommcfarlin.com\/tag\/wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i o czym pisz\u0119<\/a> \ud83d\ude42, a my mamy plik odpowiedzialny za dodanie elementu podmenu do jednego z istniej\u0105cych menu najwy\u017cszego poziomu.<\/p>\n<p>Ta klasa mo\u017ce by\u0107 stosunkowo prosta, poniewa\u017c <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zawiera odpowiednie wywo\u0142anie API WordPress<\/a>, jest uruchamiana po do\u0142\u0105czeniu do [w\u0142a\u015bciwego] zaczepu, a nast\u0119pnie dodaje podmenu zgodnie z przeznaczeniem.<\/p>\n<p>Ale za\u0142\u00f3\u017cmy, \u017ce albo ta klasa, metoda w klasie, albo do\u0142\u0105cza plik, do kt\u00f3rego ta klasa dodaje r\u00f3wnie\u017c JavaScript lub style, kt\u00f3re zmieniaj\u0105 stan elementu podmenu tak, \u017ce jest pod\u015bwietlony, zachowuje si\u0119 tak, jakby zosta\u0142 \u201eklikni\u0119ty&#8221; lub robi co\u015b, czego ani program, ani u\u017cytkownik nie zamierzaj\u0105.<\/p>\n<p>By\u0142by to efekt uboczny, poniewa\u017c zmienia stan programu.<\/p>\n<h2>Co powinien zrobi\u0107 modu\u0142?<\/h2>\n<p>Ta klasa sama w sobie powinna zrobi\u0107 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jedn\u0105 rzecz<\/a> :<\/p>\n<blockquote>\n<p>Zasada pojedynczej odpowiedzialno\u015bci to zasada programowania komputerowego, kt\u00f3ra stanowi, \u017ce ka\u017cdy modu\u0142 lub klasa powinna mie\u0107 odpowiedzialno\u015b\u0107 za pojedyncz\u0105 cz\u0119\u015b\u0107 funkcjonalno\u015bci zapewnianej przez oprogramowanie, a odpowiedzialno\u015b\u0107 ta powinna by\u0107 ca\u0142kowicie zawarta w klasie.<\/p>\n<\/blockquote>\n<p>Ale kiedy wprowadzamy co\u015b, co dodaje do tego, co ma robi\u0107 \u2013 kiedy zwi\u0119kszamy jego odpowiedzialno\u015b\u0107 lub zmieniamy jedn\u0105 podstawow\u0105 rzecz, kt\u00f3r\u0105 robi \u2013 wtedy wprowadzili\u015bmy efekt uboczny.<\/p>\n<p>Pami\u0119taj, \u017ce nie jest to z natury z\u0142e (zgodnie z definicj\u0105 PSR-1 powy\u017cej), ale wa\u017cne jest, aby rozpozna\u0107, kiedy to robimy, a kiedy nie.<\/p>\n<h2>Jak wi\u0119c doda\u0107 funkcjonalno\u015b\u0107?<\/h2>\n<p>My\u015bl\u0119, \u017ce naturalnym pytaniem jest to, \u017ce je\u015bli chcemy doda\u0107 funkcjonalno\u015b\u0107 do programu, kt\u00f3ry zmienia jego stan, jak to robimy (i czy to \u017ale)?<\/p>\n<p>Po pierwsze nie, to nie jest z\u0142e. Mam na my\u015bli, \u017ce programy maj\u0105 r\u00f3\u017cne stany w zale\u017cno\u015bci od r\u00f3\u017cnych rzeczy, prawda? Czasami dzieje si\u0119 tak, gdy co\u015b jest zapisywane na dysku lub w bazie danych; czasami dzieje si\u0119 tak, gdy u\u017cytkownik kliknie element w interfejsie u\u017cytkownika i tak dalej.<\/p>\n<p>Ale w jaki spos\u00f3b te stany si\u0119 zdarzaj\u0105, w gr\u0119 wchodzi natura skutk\u00f3w ubocznych.<\/p>\n<p>We\u017amy na przyk\u0142ad pomys\u0142 podmenu. Ma robi\u0107 jedn\u0105 rzecz. Nie powinno to zmienia\u0107 niczego poza tym, co widzimy na ekranie.<\/p>\n<ul>\n<li>Nie powinien zapisywa\u0107 do bazy danych,<\/li>\n<li>Nie powinien ustawia\u0107 detektora zdarze\u0144, gdy inny obiekt doda podmenu,<\/li>\n<li>Nie powinien zmienia\u0107 prezentacji niczego poza sob\u0105.<\/li>\n<li>I tak dalej.<\/li>\n<\/ul>\n<p>Dodawanie funkcjonalno\u015bci dzia\u0142a w ten sam spos\u00f3b: wprowadzasz klasy, kt\u00f3re s\u0105 odpowiedzialne za wykonanie okre\u015blonej rzeczy i pozwalasz im to zrobi\u0107. Kiedy te komponenty dzia\u0142aj\u0105 w po\u0142\u0105czeniu ze sob\u0105, masz program funkcjonalny, w kt\u00f3rym ka\u017cdy modu\u0142 (klasa\/funkcja\/cokolwiek) pozostaje na swoim torze, \u017ce tak powiem.<\/p>\n<h2>Jaka jest zasada kciuka?<\/h2>\n<p>Jestem pewien, \u017ce wielu z was czytaj\u0105cych to ma swoje zdanie na temat tego, jakie s\u0105 skutki uboczne, a czym nie s\u0105. I tak jak ty mam sw\u00f3j w\u0142asny.<\/p>\n<p>Pomy\u015bl o tym w ten spos\u00f3b:<\/p>\n<p>Je\u015bli wywo\u0142asz metod\u0119, kt\u00f3ra zwr\u00f3ci warto\u015b\u0107, a nast\u0119pnie ponownie wywo\u0142asz metod\u0119 z tym samym zestawem danych, powinna ona zwr\u00f3ci\u0107 t\u0119 sam\u0105 warto\u015b\u0107.<\/p>\n<p>W ten spos\u00f3b wiesz, \u017ce twoja funkcja, klasa lub modu\u0142 generyczny nie ma skutk\u00f3w ubocznych.<\/p>\n<p>I jak ze wszystkim, pope\u0142ni\u0142em te b\u0142\u0119dy (i prawdopodobnie b\u0119d\u0119 kontynuowa\u0142), ale jest to kwestia pr\u00f3bowania poprawy w nie robieniu tego.<\/p>\n<p>W ko\u0144cu stanie si\u0119 to now\u0105 norm\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>Wcze\u015bniej omawia\u0142em efekty uboczne programowania w kontek\u015bcie PSR-1. Ale ich znaczenie wykracza poza pojedynczy j\u0119zyk i obejmuje og\u00f3lne programowanie.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897],"tags":[1169],"class_list":["post-229054","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229054","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=229054"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229054\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}