{"id":727,"date":"2018-04-25T21:47:12","date_gmt":"2018-04-25T21:47:12","guid":{"rendered":"http:\/\/hayperek.pl\/?p=727"},"modified":"2018-04-25T21:47:18","modified_gmt":"2018-04-25T21:47:18","slug":"alarmy-komunikaty-i-ostrzezenia-czyli-regula-dry-w-praktyce","status":"publish","type":"post","link":"https:\/\/hayperek.pl\/en\/2018\/04\/25\/alarmy-komunikaty-i-ostrzezenia-czyli-regula-dry-w-praktyce\/","title":{"rendered":"Alarmy, komunikaty i ostrze\u017cenia &#8211; czyli regu\u0142a DRY w praktyce"},"content":{"rendered":"<p>Chyba ka\u017cdy, kto cho\u0107 raz spr\u00f3bowa\u0142 swoich si\u0142 w programowaniu, zetkn\u0105\u0142 si\u0119 na pewno z zasad\u0105 DRY <em>(ang. Don&#8217;t Repeat Yourself &#8211; Nie Powtarzaj Si\u0119)<\/em>. W my\u015bl tej regu\u0142y nale\u017cy unika\u0107 wielokrotnego powielania identycznych <em>(lub bardzo zbli\u017conych funkcjonalnie)<\/em> fragment\u00f3w kodu. Najcz\u0119\u015bciej uzyskujemy to poprzez wydzielanie cz\u0119sto powtarzanych operacji formie funkcji czy wr\u0119cz ca\u0142ych bibliotek. Innym sposobem jest wprowadzanie r\u00f3\u017cnych form abstrakcji, kt\u00f3ra pozwala &#8222;nadbudowywa\u0107&#8221; istniej\u0105ce ju\u017c funkcjonalno\u015bci oraz u\u0142atwia\u0107 ich p\u00f3\u017aniejsz\u0105 ewolucj\u0119.<\/p>\n<p>Pracuj\u0105c ze swoim poprzednim projektem zauwa\u017cy\u0142em, i\u017c w r\u00f3\u017cnych komponentach, cz\u0119\u015b\u0107 funkcjonalno\u015bci zwi\u0105zana z obs\u0142ug\u0105 komunikat\u00f3w i ostrze\u017ce\u0144 wy\u015bwietlanych na ekranie ma bardzo zbli\u017con\u0105 form\u0119.  Jest to swego rodzaju prosta maszyna stan\u00f3w, kt\u00f3r\u0105 mo\u017cna zobrazowa\u0107 poni\u017cszym grafem:<\/p>\n<p><a href=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/04\/alert_graph.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/04\/alert_graph.png\" alt=\"\" width=\"965\" height=\"801\" class=\"aligncenter size-full wp-image-740\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/04\/alert_graph.png 965w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/04\/alert_graph-600x498.png 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/04\/alert_graph-300x249.png 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/04\/alert_graph-768x637.png 768w\" sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/a><\/p>\n<p>G\u0142\u00f3wnym jej zadaniem jest prowadzenie interakcji z u\u017cytkownikiem. Komunikat ostrzegawczy zostanie wy\u015bwietlony w momencie wyst\u0105pienia pewnego okre\u015blonego <em>warunku\/\u00f3w<\/em>, np. przekroczona pr\u0119dko\u015b\u0107, niezapi\u0119te pasy bezpiecze\u0144stwa, zbyt wysoka temperatura oleju, itp. Sytuacj\u0119 t\u0105 opisuje tranzycja od stanu <em>WAITING <\/em>do stanu <em>ALERT<\/em>. Potwierdzeniu komunikatu przez u\u017cytkownika powinno przenie\u015b\u0107 alarm w stan &#8222;drzemki&#8221; <em>SNOOZE<\/em>. Je\u015bli po up\u0142ywie zadanego czasu <em>warunek<\/em> nadal b\u0119dzie spe\u0142niony, ca\u0142o\u015b\u0107 powr\u00f3ci do stanu <em>ALERT<\/em>, ponownie wy\u015bwietlaj\u0105c komunikat. W przeciwnym wypadku nast\u0105pi przej\u015bcie do stanu oczekiwania <em>WAIT<\/em>.<\/p>\n<p>W dowolnym momencie mo\u017cemy dezaktywowa\u0107 nasz\u0105 maszyn\u0119, przechodz\u0105c do stanu <em>INACTIVE<\/em>. Spowoduje to zaprzestanie cyklicznego monitorowania <em>warunku<\/em>.<\/p>\n<p>Ze wzgl\u0119du na swoj\u0105 elastyczno\u015b\u0107, maszyn\u0119 stan\u00f3w mo\u017cna dostosowa\u0107 r\u00f3wnie\u017c do jednorazowych komunikat\u00f3w &#8211; przy potwierdzeniu wystarczy przeprowadzi\u0107 j\u0105 do stanu <em>INACTIVE<\/em>. Komunikaty mog\u0105 by\u0107 tak\u017ce wy\u015bwietlane po okre\u015blonym czasie od uruchomienia systemu. Wystarczy w trakcie inicjalizacji wymusi\u0107 na maszynie stan &#8222;drzemki&#8221; z okre\u015blonym timeout&#8217;em, po kt\u00f3rym sprawdzony zostanie zadany <em>warunek<\/em> i nast\u0105pi przej\u015bcie do stanu <em>ALERT<\/em> lub <em>WAIT<\/em>.<\/p>\n<blockquote><p>Hmmm&#8230; ca\u0142o\u015b\u0107 nie wygl\u0105da na zbyt skomplikowan\u0105. Czy warto wyodr\u0119bnia\u0107 tak prosty kod jako osobn\u0105 jednostk\u0119 lub klas\u0119?<\/p><\/blockquote>\n<p>Zdecydowanie tak, nawet je\u015bli w niekt\u00f3rych przypadkach cz\u0119\u015b\u0107 funkcjonalno\u015bci b\u0119dzie redundantna <em>(nadmiarowa)<\/em>. Pami\u0119tajmy, \u017ce powtarzanie podobnych fragment\u00f3w kodu jest niemal zawsze \u017ar\u00f3d\u0142em trywialnych, cho\u0107 trudnych do wychwycenia, pomy\u0142ek. Pisz\u0105c go raz, w spos\u00f3b mo\u017cliwie jak najbardziej og\u00f3lny i uniwersalny, minimalizujemy ryzyko wprowadzenia b\u0142\u0119du. Oszcz\u0119dzamy cenny czas i nasze nerwy!<\/p>\n<p>Dzisiejszy kr\u00f3tki przyk\u0142ad pokazuje, \u017ce tworz\u0105c software zawsze warto spogl\u0105da\u0107 zar\u00f3wno wstecz jak i daleko w przysz\u0142o\u015b\u0107. Pisanie oprogramowania to z natury proces iteracyjny &#8211; nie jest mo\u017cliwe stworzenie &#8222;od razu&#8221; kodu idealnego. Wa\u017cne aby ka\u017cda kolejna wersja by\u0142a lepsza &#8211; szybsza, czytelniejsza, lepiej zaprojektowana i przemy\u015blana ni\u017c poprzednia. Nale\u017cy r\u00f3wnie\u017c przewidywa\u0107 dalszy rozw\u00f3j i wsz\u0119dzie gdzie dostrzegamy taki potencja\u0142, stara\u0107 si\u0119 po\u015bwi\u0119ci\u0107 wi\u0119cej czasu na wprowadzenie elastycznych lub bardziej uniwersalnych rozwi\u0105za\u0144. Dzi\u015b po\u015bwi\u0119cimy &#8222;a\u017c&#8221; 10 minut &#8211; jutro zaoszcz\u0119dzi nam to godziny pracy.<\/p>\n<p>Tyle teorii &#8211; nied\u0142ugo spr\u00f3bujemy wcieli\u0107 j\u0105 w \u017cycie \ud83d\ude42 I znowu b\u0119dzie du\u017co kolork\u00f3w!<\/p>","protected":false},"excerpt":{"rendered":"<p>Chyba ka\u017cdy, kto cho\u0107 raz spr\u00f3bowa\u0142 swoich si\u0142 w programowaniu, zetkn\u0105\u0142 si\u0119 na pewno z zasad\u0105 DRY (ang. Don&#8217;t Repeat Yourself &#8211; Nie Powtarzaj Si\u0119). W my\u015bl tej regu\u0142y nale\u017cy unika\u0107 wielokrotnego powielania identycznych (lub bardzo zbli\u017conych funkcjonalnie) fragment\u00f3w kodu. Najcz\u0119\u015bciej uzyskujemy to poprzez wydzielanie cz\u0119sto powtarzanych operacji formie funkcji czy wr\u0119cz ca\u0142ych bibliotek. Innym [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":757,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-727","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-stodni","9":"post-with-thumbnail","10":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/727","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/comments?post=727"}],"version-history":[{"count":7,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/727\/revisions"}],"predecessor-version":[{"id":758,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/727\/revisions\/758"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media\/757"}],"wp:attachment":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media?parent=727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/categories?post=727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/tags?post=727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}