{"id":2048,"date":"2016-03-30T10:02:36","date_gmt":"2016-03-30T08:02:36","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=2048"},"modified":"2026-05-07T13:38:21","modified_gmt":"2026-05-07T11:38:21","slug":"solid-dobre-praktyki-programowania","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/solid-dobre-praktyki-programowania\/","title":{"rendered":"SOLID \u2013 dobre praktyki programowania"},"content":{"rendered":"\n<p>Ka\u017cdy programista w pewnym momencie swojej kariery zawodowej dojdzie do takiego momentu, w kt\u00f3rym zechce poprawi\u0107 jako\u015b\u0107 tworzonego przez siebie kodu. Co mo\u017ce wp\u0142yn\u0105\u0107 na taki stan rzeczy? Z pewno\u015bci\u0105 odpowiedzi na powy\u017csze pytanie jest wiele. Je\u015bli chodzi o mnie, powodem dla kt\u00f3rego zacz\u0105\u0142em interesowa\u0107 si\u0119 dobrymi praktykami programowania, by\u0142o zetkni\u0119cie si\u0119 z niezwykle nieuporz\u0105dkowanym kodem, nad kt\u00f3rym trzeba by\u0142o siedzie\u0107 godzinami, \u017ceby mo\u017cna by\u0142o \u2013 po pierwsze go w miar\u0119 zrozumie\u0107, a po drugie \u2013 wprowadzi\u0107 w nim takie zmiany, aby nie zaburzy\u0142y dotychczas dzia\u0142aj\u0105cych funkcjonalno\u015bci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dlaczego czytelno\u015b\u0107 kodu jest taka wa\u017cna?<\/h2>\n\n\n\n<p>Gdy stawia\u0142em swoje pierwsze kroki jako programista, powiem szczerze \u2013 nie bardzo zwraca\u0142em uwagi na to jaki kod wytwarza\u0142em. Wa\u017cne by\u0142o dla mnie jedno \u2013 zrobi\u0107 tak, aby dzia\u0142a\u0142o. Jednak\u017ce z czasem, w miar\u0119 poprawiania defekt\u00f3w, czy te\u017c dodawania nowych funkcjonalno\u015bci do systemu, da\u0142o mi si\u0119 we znaki moje niedbalstwo. Gdy po jakim\u015b czasie wraca\u0142 do mnie kawa\u0142ek kodu mojego autorstwa, kt\u00f3ry kiedy\u015b dla mnie by\u0142 prosty do zrozumienia, po znacz\u0105cym up\u0142ywie czasu okazywa\u0142 si\u0119 praktycznie nie do rozszyfrowania.<\/p>\n\n\n\n<p>Wtedy m\u00f3j bardziej do\u015bwiadczony kolega da\u0142 mi jedn\u0105 rad\u0119: \u201e<strong>kod powinien by\u0107 tak pisany, aby mo\u017cna by\u0142o go czyta\u0107 bez komentarzy<\/strong>\u201d. Tak, to by\u0142 dok\u0142adnie ten moment, w kt\u00f3rym postanowi\u0142em zg\u0142\u0119bi\u0107 tajniki dobrych praktyk programowania oraz wzorc\u00f3w projektowych. Postanowi\u0142em wtedy zrobi\u0107 ma\u0142e rozeznanie i podpyta\u0107 bardziej do\u015bwiadczonych koleg\u00f3w o tytu\u0142y ksi\u0105\u017cek, kt\u00f3re pomog\u0142yby mi poprawi\u0107 jako\u015b\u0107 pisanego przeze mnie kodu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Czym jest SOLID?<\/h2>\n\n\n\n<p>W miar\u0119 zg\u0142\u0119biania tematu pozna\u0142em <a href=\"https:\/\/pl.wikipedia.org\/wiki\/SOLID_(programowanie_obiektowe)\" rel=\"nofollow\" >5 podstawowych regu\u0142<\/a>, kt\u00f3re odmieni\u0142y moje podej\u015bcie do wytwarzania kodu, oto one:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zasada pojedynczej odpowiedzialno\u015bci (ang. <em>Single-Responsibility Principle \u2013 SRP<\/em>),<\/li>\n\n\n\n<li>Zasada otwarte \u2013 zamkni\u0119te (ang. <em>Open\/Closed Principle \u2013 OCP<\/em>),<\/li>\n\n\n\n<li>Zasada podstawiania Liskov (ang. <em>Liskov Substitution Principle \u2013 LSP<\/em>),<\/li>\n\n\n\n<li>Zasada segregacji interfejs\u00f3w (ang. <em>Interface Segregation Principle \u2013 ISP<\/em>),<\/li>\n\n\n\n<li>Zasada odwracania zale\u017cno\u015bci (ang. <em>Dependency Inversion Principle \u2013 DIP<\/em>).<\/li>\n<\/ul>\n\n\n\n<p>\u0141atwo mo\u017cna zauwa\u017cy\u0107, i\u017c po po\u0142\u0105czeniu pierwszych liter skr\u00f3t\u00f3w wy\u017cej wymienionych regu\u0142 otrzymamy <em>SOLID<\/em>. <strong>SOLID jest zatem skr\u00f3tem opisuj\u0105cym podstawowe za\u0142o\u017cenia programowania obiektowego.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zasada pojedynczej odpowiedzialno\u015bci<\/h2>\n\n\n\n<p>Zasad\u0119 pojedynczej odpowiedzialno\u015bci mo\u017cna w sumie opisa\u0107 jednym prostym zdaniem, a brzmi ono nast\u0119puj\u0105co: <em>\u201e<\/em><strong>\u017badna klasa nie mo\u017ce by\u0107 modyfikowana z wi\u0119cej ni\u017c jednego powodu<\/strong>\u201d.<\/p>\n\n\n\n<p>Z mojego do\u015bwiadczenia wynika, i\u017c je\u015bli jaka\u015b klasa jest odpowiedzialna za wi\u0119cej ni\u017c jeden obszar naszego projektu, jest to bardzo niekorzystne. Mo\u017ce si\u0119 zdarzy\u0107 bowiem, \u017ce modyfikuj\u0105c jeden obszar mimowolnie wp\u0142yniemy na zupe\u0142nie inny, kt\u00f3ry nie jest w \u017caden spos\u00f3b zwi\u0105zany z pierwszym. Dodatkowo, ka\u017cdy taki zwi\u0105zek wp\u0142ywa negatywnie na ca\u0142y projekt poprzez zmniejszenie jego elastyczno\u015bci, a co za tym idzie \u2013 prowadzi do nieoczekiwanych rezultat\u00f3w wprowadzanych przez nas zmian.<\/p>\n\n\n\n<p>Zasada pojedynczej odpowiedzialno\u015bci w teorii jest jedn\u0105 z najprostszych ze wszystkich wymienionych przeze mnie regu\u0142. Jednak\u017ce, je\u015bli chodzi o praktyk\u0119, jest najtrudniejsza. Musz\u0119 przyzna\u0107, \u017ce sporo czasu min\u0119\u0142o, zanim w 100% nauczy\u0142em si\u0119 j\u0105 wykorzystywa\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zasada otwarte \u2013 zamkni\u0119te<\/h2>\n\n\n\n<p>Zasada otwarte \u2013 zamkni\u0119te brzmi nast\u0119puj\u0105co: <em>\u201e<\/em><strong>Sk\u0142adniki oprogramowania (klasy, modu\u0142y, funkcje itp.) powinny by\u0107 otwarte na rozbudow\u0119, ale zamkni\u0119te dla modyfikacji\u201d.<\/strong><\/p>\n\n\n\n<p>Rozbijaj\u0105c powy\u017csz\u0105 definicj\u0119 na mniejsze cz\u0119\u015bci, mo\u017cna wydoby\u0107 dwa kluczowe atrybuty, kt\u00f3rymi powinny si\u0119 charakteryzowa\u0107 tworzone przez nas modu\u0142y, s\u0105 nimi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201eotwarte na rozbudow\u0119\u201d<\/li>\n\n\n\n<li>oraz \u201ezamkni\u0119te dla modyfikacji\u201d.<\/li>\n<\/ul>\n\n\n\n<p>Co nale\u017cy rozumie\u0107 przez stwierdzenie, \u017ce modu\u0142 musi by\u0107 \u201eotwarty na rozbudow\u0119\u201d? Mianowicie to, \u017ce musi istnie\u0107 stosunkowo prosty spos\u00f3b rozbudowy zachowa\u0144 takiego modu\u0142u.<\/p>\n\n\n\n<p>\u201eZamkni\u0119te dla modyfikacji\u201d oznacza z kolei, \u017ce rozbudowa modu\u0142u nie mo\u017ce by\u0107 przeprowadzona w spos\u00f3b, kt\u00f3ry spowoduje zmian\u0119 istniej\u0105cego kodu \u017ar\u00f3d\u0142owego.<\/p>\n\n\n\n<p>Jestem pewien, \u017ce ka\u017cdy z nas podczas swojej pracy mia\u0142 do czynienia ze zmieniaj\u0105cymi si\u0119 wymaganiami aplikacji. Zgodno\u015b\u0107 naszego projektu z t\u0105 zasad\u0105 jest jednym z warunk\u00f3w, kt\u00f3re <strong>zagwarantuj\u0105 nam takie korzy\u015bci jak: elastyczno\u015b\u0107, mo\u017cliwo\u015b\u0107 wielokrotnego wykorzystywania istniej\u0105cego kodu, czy \u0142atwo\u015b\u0107 konserwacji naszego projektu.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zasada podstawiania Liskov<\/h2>\n\n\n\n<p>Mo\u017cna powiedzie\u0107, \u017ce Zasada podstawiania Liskov jest jednym z warunk\u00f3w zasady otwarte \u2013 zamkni\u0119te. Jej definicja wygl\u0105da nast\u0119puj\u0105co: <strong>\u201eMusi istnie\u0107 mo\u017cliwo\u015b\u0107 zast\u0119powania typ\u00f3w bazowych ich podtypami\u201d.<\/strong><\/p>\n\n\n\n<p>Dlaczego uwa\u017cam, \u017ce zasada podstawiania Liskov jest jednym z warunk\u00f3w zasady otwarte \u2013 zamkni\u0119te? Mi\u0119dzy innymi dlatego, \u017ce mo\u017cliwo\u015b\u0107 zast\u0119powania podtyp\u00f3w umo\u017cliwia rozbudow\u0119 modu\u0142\u00f3w (klas, typ\u00f3w bazowych) bez konieczno\u015bci ich bezpo\u015bredniego modyfikowania.<\/p>\n\n\n\n<p>W celu zobrazowania dzia\u0142ania zasady podstawiania Liskov, pos\u0142u\u017c\u0119 si\u0119 prostym przyk\u0142adem. Za\u0142\u00f3\u017cmy, \u017ce posiadamy dwie klasy, w kt\u00f3rych znajdujemy wiele wsp\u00f3lnych sk\u0142adowych. Wsp\u00f3lnymi sk\u0142adowymi mog\u0105 by\u0107: zbi\u00f3r w\u0142a\u015bciwo\u015bci, metod itd. Co w takiej sytuacji nale\u017ca\u0142oby zrobi\u0107? Zgodnie z zasad\u0105 podstawiania Liskov, wypada\u0142oby wyodr\u0119bni\u0107 wsp\u00f3lne elementy obu klas do jednej klasy \u2013 najlepiej abstrakcyjnej.<\/p>\n\n\n\n<p>Wyodr\u0119bnianie sk\u0142adowych jest niezwykle siln\u0105 broni\u0105 ka\u017cdego programisty. Je\u017celi bowiem istnieje mo\u017cliwo\u015b\u0107 wyodr\u0119bnienia identycznych sk\u0142adowych z dw\u00f3ch lub wi\u0119kszej ilo\u015bci klas, to jest wielce prawdopodobne, \u017ce przyjdzie taki moment, w kt\u00f3rym inne klasy b\u0119d\u0105 do tych sk\u0142adowych si\u0119 odwo\u0142ywa\u0142y.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zasada segregacji interfejs\u00f3w<\/h2>\n\n\n\n<p>Zasada segregacji interfejs\u00f3w ma za zadanie przede wszystkich <strong>wyeliminowanie niepor\u0119cznych, niepotrzebnie rozbudowanych interfejs\u00f3w.<\/strong> Do tej grupy mo\u017cna zaliczy\u0107 nadmiernie rozbudowane i niesp\u00f3jne interfejsy klas. Ka\u017cdy taki interfejs zgodnie z t\u0105 zasad\u0105 powinien zosta\u0107 podzielony na mniejsze grupy metod.<\/p>\n\n\n\n<p>Przeanalizujmy teraz ma\u0142y przyk\u0142ad. Za\u0142\u00f3\u017cmy, \u017ce posiadamy pewien interfejs oraz dwie klasy, kt\u00f3re go implementuj\u0105. Klasa <em>A<\/em> implementuje nasz przyk\u0142adowy interfejs w ca\u0142o\u015bci \u2013 wszystkie funkcje, natomiast klasa <em>B <\/em>posiada pe\u0142n\u0105 implementacj\u0119 tylko cz\u0119\u015bci z nich, pozosta\u0142e, kt\u00f3re s\u0105 niepotrzebne pozostaj\u0105 puste lub zwracaj\u0105 domy\u015ble warto\u015bci. Je\u015bli mamy do czynienia z tak\u0105 sytuacj\u0105, powinni\u015bmy rozwa\u017cy\u0107 rozdzielenie interfejsu na mniejsze tak, aby ka\u017cdy z nich deklarowa\u0142 tylko te funkcje, kt\u00f3re rzeczywi\u015bcie s\u0105 wywo\u0142ywane przez danego klienta lub grup\u0119 klient\u00f3w (klasa\/grupy klas implementuj\u0105ce dany interfejs).<\/p>\n\n\n\n<p>Opisany powy\u017cej model eliminuje zale\u017cno\u015b\u0107 obiekt\u00f3w klienckich od metod, kt\u00f3rych nie wywo\u0142uj\u0105. Umo\u017cliwia to zapewnianie wzajemnej niezale\u017cno\u015bci samych klient\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zasada odwracania zale\u017cno\u015bci<\/h2>\n\n\n\n<p>Zasada odwracania zale\u017cno\u015bci sk\u0142ada si\u0119 z dw\u00f3ch nast\u0119puj\u0105cych cz\u0119\u015bci:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Modu\u0142y wysokopoziomowe nie powinny zale\u017ce\u0107 od modu\u0142\u00f3w niskopoziomowych. Obie grupy modu\u0142\u00f3w powinny zale\u017ce\u0107 od abstrakcji.<\/strong><\/li>\n\n\n\n<li><strong>Abstrakcje nie powinny zale\u017ce\u0107 od szczeg\u00f3\u0142owych rozwi\u0105za\u0144. To szczeg\u00f3\u0142owe rozwi\u0105zania powinny zale\u017ce\u0107 od abstrakcji.<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Wydaje mi si\u0119, \u017ce powy\u017csza definicja zasady odwracania zale\u017cno\u015bci powinna by\u0107 \u0142atwa do zrozumienia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zale\u017cno\u015b\u0107 modu\u0142\u00f3w wysokopoziomowych od niskopoziomowych<\/h3>\n\n\n\n<p>Zastan\u00f3wmy si\u0119 jednak przez chwile, jakie mog\u0105 by\u0107 skutki zale\u017cno\u015bci modu\u0142\u00f3w wysokopoziomowych od niskopoziomowych, czyli co by si\u0119 dzia\u0142o, gdyby\u015bmy nie post\u0119powali wed\u0142ug pierwszej cz\u0119\u015bci definicji zasady odwracania zale\u017cno\u015bci.<\/p>\n\n\n\n<p>Modu\u0142y wysokiego poziomu z natury rzeczy zawieraj\u0105 wa\u017cne decyzje strategiczne i modele biznesowe danej aplikacji. My\u015bl\u0119, \u017ce wszyscy si\u0119 ze mn\u0105 zgodz\u0105, i\u017c te w\u0142a\u015bnie modu\u0142y w najwi\u0119kszym stopniu odpowiadaj\u0105 za funkcjonowanie aplikacji. Gdyby okaza\u0142o si\u0119, i\u017c zale\u017c\u0105 one od modu\u0142\u00f3w niskiego poziomu, to zmiany element\u00f3w niskiego poziomu mog\u0142yby mie\u0107 wp\u0142yw na funkcjonowanie modu\u0142\u00f3w wysokopoziomowych, a co za tym idzie wymusza\u0142yby zmiany na wy\u017cszych poziomach.<\/p>\n\n\n\n<p>Dodatkowo, gdy modu\u0142y wysokopoziomowe zale\u017c\u0105 od niskopoziomowych, ponowne ich wykorzystanie staje si\u0119 niezwykle trudne. Je\u015bli jednak odwr\u00f3cimy t\u0119 zale\u017cno\u015b\u0107 w drug\u0105 stron\u0119, to bardzo \u0142atwo b\u0119dzie mo\u017cna wielokrotnie je wykorzystywa\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zale\u017cno\u015b\u0107 abstrakcji od szczeg\u00f3\u0142owych rozwi\u0105za\u0144<\/h3>\n\n\n\n<p>Je\u015bli chodzi o zale\u017cno\u015b\u0107 od abstrakcji, mo\u017cna to zamkn\u0105\u0107 w jednej prostej formule: <strong>pisany przez nas kod nie powinien by\u0107 uzale\u017cniony od konkretnej klasy, zale\u017cno\u015bci takie powinny ko\u0144czy\u0107 si\u0119 na klasach abstrakcyjnych b\u0105d\u017a interfejsach<\/strong>. Zasad\u0119 zale\u017cno\u015bci od abstrakcji (ang. <em>depend on abstractions)<\/em> mo\u017cna r\u00f3wnie\u017c stre\u015bci\u0107 w trzech prostych punktach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u017badna zmienna nie powinna zawiera\u0107 referencji do konkretnej klasy.<\/li>\n\n\n\n<li>\u017badna klasa nie powinna dziedziczy\u0107 po konkretnej klasie.<\/li>\n\n\n\n<li>\u017badna metoda nie powinna przykrywa\u0107 metody zaimplementowanej w kt\u00f3rejkolwiek z klas bazowych.<\/li>\n<\/ul>\n\n\n\n<p>Podstawowymi zaletami zasady odwracania zale\u017cno\u015bci jest to, \u017ce w\u0142a\u015bciwe jej stosowanie jest kluczowe, je\u015bli chcemy tworzy\u0107 frameworki wielokrotnego u\u017cytku. Ma ona r\u00f3wnie\u017c du\u017cy wp\u0142yw na odporno\u015b\u0107 kodu \u017ar\u00f3d\u0142owego na przysz\u0142e zmiany, poniewa\u017c zgodnie z t\u0105 zasad\u0105 abstrakcje, a tak\u017ce szczeg\u00f3\u0142owe mechanizmy s\u0105 od siebie odizolowane, co z kolei wp\u0142ywa na to, \u017ce tworzony kod jest du\u017co prostszy w konserwacji.<\/p>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-ITO-Desktop.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-ITO-Mob_.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-ITO-Desktop.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\">IT Infrastructure<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                Przejmiemy opiek\u0119 24\/7 nad ca\u0142\u0105 infrastruktur\u0105 IT w Twojej firmie, zapewniaj\u0105c bezpiecze\u0144stwo, wydajno\u015b\u0107 i brak przestoj\u00f3w.\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/oferta\/it-infrastructure\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>Oferta IT Infrastructure<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>W artykule tym przedstawi\u0142em w wielkim skr\u00f3cie zasady, kt\u00f3re kryj\u0105 si\u0119 pod skr\u00f3con\u0105 nazw\u0105 SOLID. Mam \u015bwiadomo\u015b\u0107, \u017ce tak naprawd\u0119 ka\u017cda z wy\u017cej wymienionych regu\u0142 zas\u0142uguje na odr\u0119bny artyku\u0142 na jej temat. Jestem pewien, \u017ce ka\u017cdemu programi\u015bcie <strong>du\u017co przyjemniej pracowa\u0142oby si\u0119 w projekcie, w kt\u00f3rym zasady SOLID by\u0142y stosowane<\/strong>. U\u0142atwia\u0142oby to bowiem odnalezienie si\u0119 w projekcie, co z pewno\u015bci\u0105 wp\u0142yn\u0119\u0142o by na zwi\u0119kszenie wydajno\u015bci zespo\u0142\u00f3w projektowych. Ze swojej strony mog\u0119 jedynie zach\u0119ci\u0107 do zg\u0142\u0119biania tego typu wiedzy, traktujmy pisany przez nas kod jak swoj\u0105 wizyt\u00f3wk\u0119, a poskutkuje to tym, \u017ce wszyscy, kt\u00f3rzy b\u0119d\u0105 mieli z nim do czynienia b\u0119d\u0105 nam wdzi\u0119czni &#8211; po pierwsze &#8211; za przejrzysto\u015b\u0107, jak i r\u00f3wnie\u017c \u0142atwo\u015b\u0107 rozwijania czy te\u017c utrzymywania aplikacji.<\/p>\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;2048&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;37&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;SOLID \u2013 dobre praktyki programowania&quot;,&quot;width&quot;:&quot;127&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&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: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 127px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            4\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ka\u017cdy programista w pewnym momencie swojej kariery zawodowej dojdzie do takiego momentu, w kt\u00f3rym zechce poprawi\u0107 jako\u015b\u0107 tworzonego przez siebie &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/solid-dobre-praktyki-programowania\/\">Continued<\/a><\/p>\n","protected":false},"author":76,"featured_media":2424,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":5,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[287,90,288,286],"class_list":["post-2048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-software-development","tag-agile","tag-inzynieria","tag-solid"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/03\/dobre-praktyki-programowania.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2048"}],"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\/76"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=2048"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2048\/revisions"}],"predecessor-version":[{"id":33807,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2048\/revisions\/33807"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/2424"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=2048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=2048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=2048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}