{"id":16389,"date":"2022-10-19T07:00:00","date_gmt":"2022-10-19T05:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=16389"},"modified":"2023-02-16T15:06:54","modified_gmt":"2023-02-16T14:06:54","slug":"podejscie-do-refaktoryzacji-w-projekcie-ze-starymi-technologiami","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/podejscie-do-refaktoryzacji-w-projekcie-ze-starymi-technologiami\/","title":{"rendered":"Podej\u015bcie do refaktoryzacji w projekcie ze starymi technologiami"},"content":{"rendered":"\n<p>Pewnie ka\u017cdy z nas \u2013 programist\u00f3w i in\u017cynier\u00f3w oprogramowania \u2013 od czasu do czasu, a mo\u017ce nieustannie, pracuje z \u201eLegacy code\u201d.<\/p>\n\n\n\n<p>Za\u0142\u00f3\u017cmy scenariusz: do\u0142\u0105czamy do zespo\u0142u, kt\u00f3ry dobrze sobie radzi, ale potrzebuje wi\u0119cej r\u0105k do pracy. W aplikacji, nad kt\u00f3r\u0105 pracuj\u0105, od lat wszystko dzia\u0142a. Nie ma powa\u017cnych zg\u0142osze\u0144 o b\u0142\u0119dach. Jedynym problemem jest dodawanie nowych funkcji biznesowych. Udaje si\u0119 to, poniewa\u017c s\u0105 tam do\u015bwiadczeni programi\u015bci, znaj\u0105cy na pami\u0119\u0107 wi\u0119kszo\u015b\u0107 zawi\u0142o\u015bci tej aplikacji. Jest czas i og\u00f3lnie ma\u0142e, planowane zmiany. <\/p>\n\n\n\n<p>Tu w\u0142a\u015bnie le\u017cy problem \u2013 potrzeba nowych funkcji biznesowych, a czas nagli. Pracujemy z kodem \u201eLegacy\u201d. Pierwszy pomys\u0142, jaki przychodzi do g\u0142owy \u2013 zatrudni\u0107 wi\u0119cej programist\u00f3w. Ale czy nowi programi\u015bci natychmiast zwi\u0119ksz\u0105 wydajno\u015b\u0107? Alternatyw\u0105 mo\u017ce by\u0107 refaktoryzacja. \u015awietny pomys\u0142 \u2013 ka\u017cdy przytakuje, no poza Product Ownerem (PO).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Czym jest refaktoryzacja?<\/strong><\/h2>\n\n\n\n<p>Szybkie spojrzenie na <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Refaktoryzacja#:~:text=Refaktoryzacja%20(czasem%20te%C5%BC%20refaktoring%2C%20ang,odpowiedniej%2C%20wysokiej%20jako%C5%9Bci%20organizacji%20systemu.\" rel=\"nofollow\" >definicj\u0119 w Wikipedii<\/a>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Refaktoryzacja&nbsp;(czasem te\u017c refaktoring,&nbsp;ang<a href=\"https:\/\/pl.wikipedia.org\/wiki\/J%C4%99zyk_angielski\" rel=\"nofollow\" >.<\/a>&nbsp;<em>refactoring<\/em>) \u2013 proces wprowadzania zmian w projekcie\/programie, w wyniku kt\u00f3rych zasadniczo nie zmienia si\u0119 funkcjonalno\u015b\u0107. Celem refaktoryzacji jest wi\u0119c nie wytwarzanie nowej funkcjonalno\u015bci, ale utrzymywanie odpowiedniej, wysokiej&nbsp;jako\u015bci&nbsp;organizacji systemu (\u2026).<\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Refaktoryzacja Legacy code<\/strong><\/h2>\n\n\n\n<p>Porozmawiajmy zatem o refaktoryzacji legacy code. Mo\u017ce tym razem b\u0119dzie lepiej ni\u017c zwykle. Poniewa\u017c zazwyczaj, kojarzy mi si\u0119 to z walk\u0105 z mitologiczn\u0105 Hydr\u0105. Odcinamy g\u0142ow\u0119 \u2013 jest sukces \u2013 ale ju\u017c za chwil\u0119 na jej miejsce wyrastaj\u0105 dwie nowe, czyli nasze b\u0142\u0119dy w kodzie, niezgodno\u015bci z innymi funkcjonalno\u015bciami.<\/p>\n\n\n\n<p>Zejd\u017amy zatem na ziemi\u0119 i rozwa\u017cmy opcje:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Napisa\u0107 ca\u0142o\u015b\u0107 od nowa, wstrzyma\u0107 projekt (powiedzmy na rok), przygotowa\u0107 wszystko jak najlepiej, idealnie.  <ul><li>Tak, ale czy mo\u017cemy sobie na to pozwoli\u0107? Nie wspiera\u0107 klienta przez ten czas, nie odpowiada\u0107 na zg\u0142oszenia i potrzeby?<\/li><\/ul><\/li><li>To mo\u017ce nie rok, ale 6 miesi\u0119cy, refaktoryzuj\u0105c wszystko, czego potrzebujemy.<ul><li>I tu pojawiaj\u0105 si\u0119 te same problemy\u2026<\/li><\/ul><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>W takim razie co mo\u017cemy zrobi\u0107?<\/strong><\/h2>\n\n\n\n<p>Na pocz\u0105tek, doce\u0144my legacy kod aplikacji. On dzia\u0142a, nie ma wielu b\u0142\u0119d\u00f3w, a co najwa\u017cniejsze \u2013 istnieje i funkcjonuje.<\/p>\n\n\n\n<p>Zastan\u00f3wmy si\u0119, co chcemy osi\u0105gn\u0105\u0107 dzi\u0119ki refaktoryzacji:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Czy chcemy tylko poprawi\u0107 czytelno\u015b\u0107 kodu?<\/li><li>Mo\u017ce wyprze\u0107 star\u0105 technologi\u0119 i aktualizowa\u0107 komponenty do nowszych wersji?<\/li><li>A mo\u017ce jest potrzeba dynamicznej rozbudowy aplikacji, a bez refaktoryzacji nie b\u0119dzie to mo\u017cliwe?<\/li><\/ul>\n\n\n\n<p>Koniecznie zadajmy pytanie, jakie obszary aplikacji b\u0119d\u0105 rozwijane w przysz\u0142o\u015bci albo z jakimi zazwyczaj mamy najwi\u0119kszy problem. Mo\u017ce w\u0142a\u015bnie te modu\u0142y powinni\u015bmy refaktoryzowa\u0107.<\/p>\n\n\n\n<p>Nie trzeba zmienia\u0107 cz\u0119\u015bci aplikacji, kt\u00f3ra dzia\u0142a, nie ma b\u0142\u0119d\u00f3w i nie b\u0119dzie rozwijana. Prawdopodobnie by\u0142oby to nieop\u0142acalne.<\/p>\n\n\n\n<p>Przeanalizujmy zatem prosty wykres poni\u017cej. Najlepszym kandydatem b\u0119dzie cz\u0119\u015b\u0107 aplikacji o du\u017cej z\u0142o\u017cono\u015bci kodu, gdzie zachodzi najwi\u0119cej zmian.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-4.png\"><img decoding=\"async\" width=\"705\" height=\"516\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-4.png\" alt=\"Najlepszy obszar do refaktoryzacji\" class=\"wp-image-16392\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-4.png 705w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-4-300x220.png 300w\" sizes=\"(max-width: 705px) 100vw, 705px\" \/><\/a><figcaption>Ryc. 1 <a href=\"http:\/\/www.bnsit.pl\/szkolenie,wzorce-projektowe-i-refaktoryzacja-do-wzorcow\" rel=\"nofollow\" >Najlepszy obszar do refaktoryzacji<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jak poradzi\u0107 sobie z refaktoryzacj\u0105?<\/strong><\/h2>\n\n\n\n<p>Chcia\u0142bym zaproponowa\u0107 kilka sposob\u00f3w radzenia sobie z naszym kodem \u2013 Hydr\u0105.<br>Znaj\u0105c ju\u017c potrzeby i problemy, u\u0142\u00f3\u017cmy plan d\u0142ugoterminowy, kt\u00f3ry b\u0119dzie zak\u0142ada\u0142 konkretne, du\u017ce zmiany, jakich zazwyczaj nie jeste\u015bmy wstanie bezpiecznie wprowadzi\u0107 w kr\u00f3tkim czasie. Taki plan mo\u017ce zak\u0142ada\u0107 np. zmian\u0119 dzia\u0142aj\u0105cego komponentu w jednej cz\u0119\u015bci aplikacji na nowsz\u0105 wersj\u0119 lub wprowadzenie jednolitego wzorca projektowego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Refaktoryzacja strategiczna<\/strong><\/h3>\n\n\n\n<p>W ten spos\u00f3b u\u015bwiadomimy sobie cel naszej pracy. Cel jest wa\u017cny, poniewa\u017c bez niego mo\u017cemy utkn\u0105\u0107 w \u015blepym zau\u0142ku, d\u0105\u017cy\u0107 do perfekcji, pracowa\u0107 w niesko\u0144czono\u015b\u0107 i nigdy nie zako\u0144czy\u0107 refaktoryzacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Everyday refactoring<\/strong><\/h3>\n\n\n\n<p>Proponuj\u0119, d\u0105\u017cy\u0107 do celu metod\u0105 ma\u0142ych krok\u00f3w. Mo\u017ce b\u0119dzie trzeba podzieli\u0107 dzia\u0142ania na kilka mniejszych cz\u0119\u015bci.<br>Pracujmy codziennie z kodem, zw\u0142aszcza przy okazji wprowadzania zmian i poprawek wymaganych przez u\u017cytkownik\u00f3w. Pami\u0119tajmy jednak o naszym celu nadrz\u0119dnym, strategicznym. W ten spos\u00f3b zapewnimy ci\u0105g\u0142e wsparcie dla aplikacji i zbli\u017cymy si\u0119 do konkretnego planowanego efektu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Potrzebujemy narz\u0119dzi<\/strong><\/h3>\n\n\n\n<p>Konieczne b\u0119d\u0105 narz\u0119dzia takie jak wzorce projektowe, dobre praktyki, SOLID. Mo\u017ce wprowadzenie albo usuni\u0119cie warstwy przyniesie korzy\u015b\u0107?<\/p>\n\n\n\n<p>Opr\u00f3cz narz\u0119dzi warto, je\u015bli jest to mo\u017cliwe, poprosi\u0107 autora lub inne osoby pracuj\u0105ce z kodem o pomoc. Pomocny oka\u017ce si\u0119 ka\u017cdy, kto zna system, tak\u017ce od strony u\u017cytkownika. Kr\u00f3tka rozmowa na temat funkcji programu, niuans\u00f3w, historii zmian wok\u00f3\u0142 kluczowych element\u00f3w przyniesie wiele korzy\u015bci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Refaktoryzacja \u2013 szkic<\/strong><\/h2>\n\n\n\n<p>W przypadku, kiedy zaczynamy, a dany obszar jest skomplikowany, rozpocznijmy od tej metody. Co do zasady ta refaktoryzacja b\u0119dzie do wyrzucenia \u201edo kosza\u201d. Celem dzia\u0142ania jest rozpoznanie kodu \u2013 jak po\u0142\u0105czono go z innymi modu\u0142ami i jakie ma zale\u017cno\u015bci.<br><br>Mo\u017cemy wyj\u0105\u0107 ca\u0142\u0105 klas\u0119 do oddzielnego projektu i spr\u00f3bowa\u0107 wydzieli\u0107 odpowiedzialno\u015bci. Je\u015bli to mo\u017cliwe \u2013 przetestowa\u0107. A p\u00f3\u017aniej wyci\u0105gnijmy wnioski.<br><br>Dzi\u0119ki temu b\u0119dziemy skupieni na konkretnej cz\u0119\u015bci, nie ca\u0142o\u015bci, na tym samym poziomie z\u0142o\u017cono\u015bci. Pomo\u017ce nam to wr\u00f3ci\u0107 do w\u0142a\u015bciwej refaktoryzacji z gotowym przepisem na sukces.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Narz\u0119dzia Everyday refactoring<\/strong><\/h3>\n\n\n\n<p>Rozpoznali\u015bmy ju\u017c cz\u0119\u015b\u0107 aplikacji i schodzimy ni\u017cej o kolejne poziomy. Na pocz\u0105tku, czytaj\u0105c kod, zastosujmy tymczasowe komentarze. Pozwol\u0105 nam lepiej zrozumie\u0107 ca\u0142o\u015b\u0107, spos\u00f3b dzia\u0142ania i zale\u017cno\u015bci.<br>Zastosujmy nowe nazwy dla metod, klas &#8211; tam, gdzie uwa\u017camy to za s\u0142uszne.<\/p>\n\n\n\n<p>Dekomponujmy d\u0142ugie metody na mniejsze cz\u0119\u015bci. Co to znaczy d\u0142ugie? Mo\u017ce takie, kt\u00f3re nie mieszcz\u0105 si\u0119 na ekranie komputera (nie, obracanie ekranu pionowo, nie jest rozwi\u0105zaniem).<br>Istnieje <strong>metoda szacowania z\u0142o\u017cono\u015bci kodu<\/strong> (Z\u0142o\u017cono\u015b\u0107 cyklomatyczna McCabe\u2019a).<\/p>\n\n\n\n<p>Dla ka\u017cdej instrukcji warunkowej, przekierowania, p\u0119tli (IF, ELSE, FOR, BREAK) dodajemy +1 do naszej z\u0142o\u017cono\u015bci. Przyjmijmy, \u017ce dla z\u0142o\u017cono\u015bci powy\u017cej 6, powinni\u015bmy rozdzieli\u0107 metod\u0119 na mniejsze cz\u0119\u015bci.<br><br>U\u0142atwi\u0107 ca\u0142y proces mo\u017ce tak\u017ce sortowanie metod w klasie \u2013 tematycznie, jedne obok drugich.<br>Id\u0105c krok dalej, oznaczmy metody publiczne, opiszmy je interfejsem. St\u0105d ju\u017c prosta droga do wydzielenia cz\u0119\u015bci do osobnych klas \u2013 odpowiedzialno\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Testy i metody prywatne do oddzielnych odpowiedzialno\u015bci<\/strong><\/h3>\n\n\n\n<p>Skupmy si\u0119 przez chwil\u0119 na szczeg\u00f3\u0142ach. Zauwa\u017cyli\u015bmy, \u017ce w danej refaktoryzowanej klasie jest metoda prywatna. Na tyle skomplikowana, \u017ce warto by\u0142oby j\u0105 przetestowa\u0107. Zamiast zmienia\u0107 j\u0105 na publiczn\u0105, proponuj\u0119 przenie\u015b\u0107 j\u0105 do nowej klasy i dopiero w\u00f3wczas dokona\u0107 zmiany.<br><br>Najprawdopodobniej jest to gotowa osobna odpowiedzialno\u015b\u0107. Stara klasa staje si\u0119 coraz prostsza. Od tego momentu mo\u017cemy du\u017co \u0142atwiej przeprowadzi\u0107 test wcze\u015bniejszej metody. Przetestowa\u0107 mo\u017cemy manualnie, a najlepiej napisa\u0107 test (jednostkowy, integracyjny). W ten spos\u00f3b zweryfikujemy poprawno\u015b\u0107 dzia\u0142ania partii kodu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Anti-corruption layer<\/strong><\/h2>\n\n\n\n<p>Zastosowali\u015bmy wszystkie techniki i znane nam chwyty, ale jednak w pewnym momencie utkn\u0119li\u015bmy. Logika biznesowa, cho\u0107 legacy, to dzia\u0142a.<br><br>A mo\u017ce problemem jest biblioteka zewn\u0119trzna, kt\u00f3rej nie mo\u017cemy aktualizowa\u0107? Postaraj si\u0119 ograniczy\u0107 u\u017cywanie kodu legacy poprzez warstwy abstrakcji tak, aby rodzaj biblioteki by\u0142 jedynie implementacj\u0105, a jej elementy nie by\u0142y przekazywany pomi\u0119dzy innymi cz\u0119\u015bciami aplikacji.<br><br>W takiej sytuacji zastosowa\u0107 mo\u017cemy anti-corruption layer. Czyli warstw\u0119 po\u015bredni\u0105, odcinaj\u0105c\u0105 nas od kodu legacy. B\u0119dzie komunikowa\u0107 nasz nowy kod ze starym. Budujemy warstw\u0119 abstrakcji wywo\u0142uj\u0105c\u0105 funkcje starej cz\u0119\u015bci.<br><br>Pami\u0119tajmy jednak, aby nie przekazywa\u0107 dalej poza anti-corruption layer \u017cadnych element\u00f3w z kodu legacy. Dodajmy w\u0142asne implementacje obiekt\u00f3w. W ten spos\u00f3b zamykamy kod legacy \u201epod pokrywk\u0105\u201d. Nadal tam jest, ale nie musimy si\u0119 ju\u017c zastanawia\u0107, jak on dzia\u0142a. Mamy w\u0142asn\u0105 warstw\u0119 komunikacji.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/2021-07-20_19h35_52.png\"><img decoding=\"async\" width=\"710\" height=\"304\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/2021-07-20_19h35_52.png\" alt=\"Refaktoryzacja z u\u017cyciem anti-corruption layer\" class=\"wp-image-16394\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/2021-07-20_19h35_52.png 710w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/2021-07-20_19h35_52-300x128.png 300w\" sizes=\"(max-width: 710px) 100vw, 710px\" \/><\/a><figcaption>Ryc. 2&nbsp;<a href=\"http:\/\/www.bnsit.pl\/szkolenie,wzorce-projektowe-i-refaktoryzacja-do-wzorcow\" rel=\"nofollow\" >Refaktoryzacja z u\u017cyciem anti-corruption layer<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Refaktoryzacja to proces wprowadzania zmian w kodzie \u2013 zasadniczo nie zmienia funkcjonalno\u015bci, a poprawia jako\u015b\u0107 kodu. W tym artykule poznali\u015bmy kilka sposob\u00f3w radzenia sobie z refaktoryzacj\u0105 kodu.<br>Z pewno\u015bci\u0105 ka\u017cdy znajdzie dla siebie konkretne zastosowanie, nie zawsze b\u0119dzie konieczne wykorzystanie wszystkich jednocze\u015bnie.<\/p>\n\n\n\n<p>Poznaj\u0105c dany problem, nale\u017cy dobiera\u0107 odpowiednie narz\u0119dzia oraz cele. Ich obranie zawsze jest kluczowe, poniewa\u017c na tej podstawie stworzymy plan.<\/p>\n\n\n\n<p>Pami\u0119tajmy r\u00f3wnie\u017c o pracy zespo\u0142owej \u2013 konsultujmy plany z innymi i wspierajmy si\u0119 wiedz\u0105 o aplikacji. W ten spos\u00f3b mo\u017cna owocniej realizowa\u0107 za\u0142o\u017cone nadrz\u0119dne plany d\u0142ugoterminowe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/www.bnsit.pl\/szkolenie,wzorce-projektowe-i-refaktoryzacja-do-wzorcow\" rel=\"nofollow\" >Naturalny porz\u0105dek refaktoryzacji<\/a><\/li><li><a href=\"https:\/\/naturaily.com\/blog\/legacy-code-refactoring\" rel=\"nofollow\" >Blog Naturaily<\/a><\/li><li><a href=\"https:\/\/understandlegacycode.com\/blog\/5-coding-exercises-to-practice-refactoring-legacy-code\/\" rel=\"nofollow\" >Blog&nbsp;Understandlegacycode<\/a><\/li><\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;16389&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;7&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 7)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Podej\u015bcie do refaktoryzacji w projekcie ze starymi technologiami&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 7)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Pewnie ka\u017cdy z nas \u2013 programist\u00f3w i in\u017cynier\u00f3w oprogramowania \u2013 od czasu do czasu, a mo\u017ce nieustannie, pracuje z \u201eLegacy &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/podejscie-do-refaktoryzacji-w-projekcie-ze-starymi-technologiami\/\">Continued<\/a><\/p>\n","protected":false},"author":237,"featured_media":19826,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[1544,560,1178],"class_list":["post-16389","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-legacy-code","tag-architektura-it","tag-refaktoryzacja"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Podejscie-do-refaktoryzacji-w-projekcie-ze-starymi-technologiami-1.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16389"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/237"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=16389"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16389\/revisions"}],"predecessor-version":[{"id":16401,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16389\/revisions\/16401"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19826"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=16389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=16389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=16389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}