{
    "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\/pl_pl\/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>",
        "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\/pl_pl\/wp-json\/wp\/v2\/posts\/727",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts"
            }
        ],
        "about": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/types\/post"
            }
        ],
        "author": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/users\/1"
            }
        ],
        "replies": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/comments?post=727"
            }
        ],
        "version-history": [
            {
                "count": 7,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/727\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 758,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/727\/revisions\/758"
            }
        ],
        "wp:featuredmedia": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media\/757"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media?parent=727"
            }
        ],
        "wp:term": [
            {
                "taxonomy": "category",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/categories?post=727"
            },
            {
                "taxonomy": "post_tag",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/tags?post=727"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}