{"id":730,"date":"2018-04-26T21:26:54","date_gmt":"2018-04-26T21:26:54","guid":{"rendered":"http:\/\/hayperek.pl\/?p=730"},"modified":"2018-04-26T21:26:54","modified_gmt":"2018-04-26T21:26:54","slug":"asystenci-cz-1-czyli-refaktoryzacja-kodu-w-praktyce","status":"publish","type":"post","link":"https:\/\/hayperek.pl\/en\/2018\/04\/26\/asystenci-cz-1-czyli-refaktoryzacja-kodu-w-praktyce\/","title":{"rendered":"Asystenci cz.1 &#8211; czyli refaktoryzacja kodu w praktyce"},"content":{"rendered":"<p>Dzi\u015b przyszed\u0142 czas na zaj\u0119cie si\u0119 typowo &#8222;aplikacyjn\u0105&#8221; cz\u0119\u015bci\u0105 naszego projektu. Zdecydowa\u0142em, i\u017c pierwszymi aplikacjami jakie stworzymy b\u0119d\u0105 tzw. asystenci kierowcy. Tego typu funkcjonalno\u015b\u0107 zosta\u0142a ju\u017c zaimplementowana na potrzeby poprzedniego projektu HypeFIS. Rozs\u0105dnym podej\u015bciem by\u0142oby wi\u0119c re-u\u017cycie istniej\u0105cego ju\u017c, dzia\u0142aj\u0105cego i dobrze przetestowanego kodu. W ten spos\u00f3b znacz\u0105co ograniczyliby\u015bmy ilo\u015b\u0107 pracy przeznaczonej na implementacj\u0119 oraz testy. W naszym przypadku wprowadzimy jednak pewne zmiany. W jednym z poprzednich artyku\u0142\u00f3w zwr\u00f3ci\u0142em uwag\u0119 na mo\u017cliwo\u015b\u0107 stworzenia uniwersalnej maszyny stan\u00f3w do obs\u0142ugi wszelkich komunikat\u00f3w. U\u017cycie jej w podsystemie asystent\u00f3w spowoduje znacz\u0105ce uproszczenie kodu i zredukuje jego ilo\u015b\u0107.<br \/>\nJako &#8222;rasowi&#8221; developerzy zaczniemy wi\u0119c od refaktoryzacji kodu \ud83d\ude42<\/p>\n<blockquote><p>No ale czym jest ta refaktoryzacja?<\/p><\/blockquote>\n<p>Najog\u00f3lniej refaktoryzacja polega na przekszta\u0142ceniu istniej\u0105cego kodu \u017ar\u00f3d\u0142owego lub zmodyfikowaniu architektury, tak aby lepiej dopasowa\u0107 je do zmieniaj\u0105cych si\u0119 wymaga\u0144, umo\u017cliwi\u0107 testowanie, upro\u015bci\u0107 czy uczyni\u0107 bardziej przejrzystymi. <\/p>\n<p>Dla cz\u0119\u015bci os\u00f3b refaktoryzacja jednoznacznie kojarzy si\u0119 z przepisaniem kodu &#8222;od nowa&#8221;. Jest to jej najbardziej drastyczna forma, aczkolwiek w przypadku skrajnie zaniedbanego kodu jedyna, kt\u00f3ra da zadowalaj\u0105cy efekt. W praktyce jednak refaktoryzacja najcz\u0119\u015bciej przebiega, jako naturalny, iteracyjny proces polepszania jako\u015bci kodu \u017ar\u00f3d\u0142owego oraz struktury oprogramowania. <\/p>\n<p>Nale\u017cy pami\u0119ta\u0107 i\u017c tego rodzaju dzia\u0142ania wi\u0105\u017c\u0105 si\u0119 zawsze z ryzykiem wprowadzenia nowych b\u0142\u0119d\u00f3w. Dlatego te\u017c podstaw\u0105 skutecznej refaktoryzacji s\u0105 dzia\u0142aj\u0105ce testy lub przynajmniej referencyjny kod, kt\u00f3ry stanowi punkt odniesienia.<\/p>\n<blockquote><p>Jak g\u0142\u0119boka b\u0119dzie refaktoryzacja w przypadku naszego kodu?<\/p><\/blockquote>\n<p>Bardzo g\u0142\u0119boka. Ca\u0142kowitej przebudowie na pewno musi ulec interfejs u\u017cytkownika <em>(inna biblioteka graficzna, widgety, system okien, etc)<\/em>. R\u00f3wnie\u017c wszelkie interakcje logiki steruj\u0105cej z otoczeniem ulegaj\u0105 zmianie. Mo\u017cna powiedzie\u0107, \u017ce jedyn\u0105 niezmienion\u0105 cz\u0119\u015bci\u0105 pozostanie w\u0142a\u015bnie owa logika, przeniesiona do wyekstrahowanej maszyny stan\u00f3w.<\/p>\n<blockquote><p>Czyli w zasadzie niewiele pozostaje? Po co wi\u0119c refaktoryzacja? Jaki ma ona sens? Nie lepiej napisa\u0107 kod od nowa?<\/p><\/blockquote>\n<p>Absolutnie nie! Nale\u017cy pami\u0119ta\u0107, \u017ce zanim zabierzemy si\u0119 do pracy, musimy przebrn\u0105\u0107 przez stary kod, dobrze go zrozumie\u0107. W\u00f3wczas nawet je\u017celi posuwamy si\u0119 do bardzo g\u0142\u0119bokiej przebudowy, dokonujemy jej \u015bwiadomie. Pisz\u0105c &#8222;od nowa&#8221; zawsze ryzykujemy utrat\u0119 jakiego\u015b detalu, drobnego szczeg\u00f3\u0142u, kt\u00f3ry umknie nam gdzie\u015b  w ferworze walki.<\/p>\n<blockquote><p>Co dok\u0142adnie chcemy przenie\u015b\u0107 ze starego projektu?<\/p><\/blockquote>\n<p>Poni\u017cej lista naszych asystent\u00f3w kierowcy:<\/p>\n<ul>\n<li>Asystent \u015bwiate\u0142 &#8211; informuje o konieczno\u015bci w\u0142\u0105czenia \u015bwiate\u0142 mijania (dziennych),<\/li>\n<li>Asystent odpoczynku &#8211; informuje o konieczno\u015bci zrobienia kr\u00f3tkiej przerwy w czasie d\u0142u\u017cszej jazdy,<\/li>\n<li>Asystent pas\u00f3w bezpiecze\u0144stwa &#8211; przypomina o konieczno\u015bci zapi\u0119cia pas\u00f3w oraz monitoruje ich stan w trakcie jazdy,<\/li>\n<li>Asystent pr\u0119dko\u015bci &#8211; ostrzega o przekroczeniu zadanego limitu dozwolonej pr\u0119dko\u015bci,<\/li>\n<p>Ka\u017cdy asystent b\u0119dzie sk\u0142ada\u0142 si\u0119 z kilku subkomponent\u00f3w:<\/p>\n<ul>\n<li>Maszyny stan\u00f3w,<\/li>\n<li>Okna z komunikatem,<\/li>\n<li>Okna konfiguracyjnego,<\/li>\n<\/ul>\n<p>Ok, wiem co i jak musimy zrobi\u0107. Jutro pi\u0105teczek, pi\u0105tunio \ud83d\ude42 Chwila przerwy na z\u0142apanie oddechu &#8211; idealny moment, \u017ceby zaj\u0105\u0107 si\u0119 asystentem, kt\u00f3ry powie nam wprost, \u017ce&#8230; czas na kaw\u0119 \ud83d\ude42 !  <\/p>","protected":false},"excerpt":{"rendered":"<p>Dzi\u015b przyszed\u0142 czas na zaj\u0119cie si\u0119 typowo &#8222;aplikacyjn\u0105&#8221; cz\u0119\u015bci\u0105 naszego projektu. Zdecydowa\u0142em, i\u017c pierwszymi aplikacjami jakie stworzymy b\u0119d\u0105 tzw. asystenci kierowcy. Tego typu funkcjonalno\u015b\u0107 zosta\u0142a ju\u017c zaimplementowana na potrzeby poprzedniego projektu HypeFIS. Rozs\u0105dnym podej\u015bciem by\u0142oby wi\u0119c re-u\u017cycie istniej\u0105cego ju\u017c, dzia\u0142aj\u0105cego i dobrze przetestowanego kodu. W ten spos\u00f3b znacz\u0105co ograniczyliby\u015bmy ilo\u015b\u0107 pracy przeznaczonej na implementacj\u0119 oraz [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":761,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-730","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\/730","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=730"}],"version-history":[{"count":7,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/730\/revisions"}],"predecessor-version":[{"id":762,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/730\/revisions\/762"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media\/761"}],"wp:attachment":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media?parent=730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/categories?post=730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/tags?post=730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}