<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>KoziołekWeb &#187; S.O.L.I.D.ne programowanie</title>
	<atom:link href="http://koziolekweb.pl/category/inzynieria-oprogramowania/solidne-programowanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://koziolekweb.pl</link>
	<description>Sięgam tam gdzie wzrok nie sięga, a tam NullPointerException</description>
	<lastBuildDate>Tue, 07 Feb 2012 19:00:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<image>\n<url>http://koziolekweb.pl/icon.png</url>\n<title>KoziołekWeb</title>\n<link>http://koziolekweb.pl</link>\n<width></width>\n<height></height>\n</image>\n		<item>
		<title>Panie Majster&#8230;. teraz bangla!</title>
		<link>http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/</link>
		<comments>http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 09:43:47 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[Warsjawa]]></category>
		<category><![CDATA[Warsjawa 2011]]></category>
		<category><![CDATA[Wydarzenia]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[Warsjava2011]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2263</guid>
		<description><![CDATA[W sobotę była sobie czwarta już Warsjawa. Druga obok Confitury/Javarsowii konferencja javowa organizowana przez warszawskiego JUGa. Konferencja o tyle ciekawa, że nastawiona na praktyczne zastosowanie posiadanej wiedzy i generalnie silnie &#8220;uwarsztatowiona&#8221;. W tym roku były cztery ścieżki: Warsztaty &#8220;Google Web Toolkit krok po kroku&#8221;, prowadzący Paweł Cesar Sanjuan Szklarz. Warsztaty &#8220;Meet my Android&#8221;, prowadzący Mateusz [...]]]></description>
			<content:encoded><![CDATA[<p>W sobotę była sobie czwarta już <a href="https://github.com/warszawajug/warsjawa2011/wiki/Konferencja-warsjawa-2011">Warsjawa</a>. Druga obok Confitury/Javarsowii konferencja javowa organizowana przez warszawskiego JUGa. Konferencja o tyle ciekawa, że nastawiona na praktyczne zastosowanie posiadanej wiedzy i generalnie silnie &#8220;uwarsztatowiona&#8221;.</p>
<p>W tym roku były cztery ścieżki:</p>
<ul>
<li><a href="https://github.com/warszawajug/warsjawa2011/wiki/Warsztaty-GWT">Warsztaty &#8220;Google Web Toolkit krok po kroku&#8221;</a>, prowadzący Paweł Cesar Sanjuan Szklarz.</li>
<li><a href="https://github.com/warszawajug/warsjawa2011/wiki/Warsztaty-Android">Warsztaty &#8220;Meet my Android&#8221;</a>, prowadzący Mateusz Grzechociński </li>
<li><a href="https://github.com/warszawajug/warsjawa2011/wiki/Warsztaty-DDD-i-CqRS">Warsztaty z projektem Domain Driven Design i Command-query Responsibility Segregation Leaven</a>, prowadzący Sławek Sobótka i Rafał Jamróz</li>
<li>Ścieżka prezentacyjna w składzie:
<ul>
<li><a href="https://github.com/warszawajug/warsjawa2011/wiki/Warsztaty-Obiektowa-Gimnastyka">Warsztaty &#8220;Obiektowa gimnastyka&#8221;</a>, prowadzący Krzysztof Jelski i Paweł Lipiński</li>
<li><a href="https://github.com/warszawajug/warsjawa2011/wiki/WAS8-+-OSGi">&#8220;WebSphere Application Server v8.0 + OSGi&#8221;</a> Grzegorz Abramczyk, prezentacja</li>
<li><a href="https://github.com/warszawajug/warsjawa2011/wiki/Do-czego-jeszcze-biblioteki-testowe">Do czego jeszcze biblioteki testowe&#8221;</a> Bartek Kuczyński, prezentacja z kodowaniem na żywo</li>
<li><a href="https://github.com/warszawajug/warsjawa2011/wiki/Java-EE-6-Web-Profile-z-Apache-TomEE">&#8220;Java EE 6 Web Profile z Apache TomEE&#8221;</a> Jacek Laskowski, prezentacja</ul>
</li>
</li>
</ul>
<p>Ze względów organizacyjnych wybrałem ścieżkę numer cztery (jakoś głupio wyjść w środku warsztatów i z bananem na mordzie stwierdzić &#8220;wszystko OK, ale mam swoją prezentację, na która zapraszam&#8221;). Na tej ścieżce się zatem skupię. </p>
<h4><a href="https://github.com/warszawajug/warsjawa2011/wiki/Warsztaty-Obiektowa-Gimnastyka">Warsztaty &#8220;Obiektowa gimnastyka&#8221;</a></h4>
<p>Krzysztof Jelski i Paweł Lipiński zaprezentowali najciekawszą część w całej ścieżce. Przedstawili nam proste zadanie &#8211; napisać obsługę konta w banku. Żeby jednak nie było za prosto dostaliśmy też dziewięć zasad tworzenia kodu, których należało przestrzegać:</p>
<ul>
<li>Tylko jeden poziom zagłębienia na metodę</li>
<li>Nie używaj słowa kluczowego else</li>
<li>Opakowuj wszystkie prymitywy i Stringi (w klasy o specyficznej dla zastosowania nazwie)</li>
<li>Używaj tylko jednej kropki na linię</li>
<li>Nie skracaj nazw</li>
<li>Pilnuj wszystkie encje by były małe</li>
<li>Nie używaj klas o więcej niż dwóch polach</li>
<li>Klasa której polem jest kolekcja nie powinna mieć żadnych innych pól (opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania)</li>
<li>Nie używaj getterów/setterów/własności</li>
</ul>
<p>Niby proste&#8230; ale są haczyki i haki. Zadania było realizowane w parach (co mi się podoba) i dzięki temu było łatwiej. Na przykład dowiedzieć się można, że odejmowanie liczby ujemnej to to samo co dodawanie. Niestety forma warsztatowa wymaga czasu, a tu nam go trochę zabrakło.<br />
Z tych zajęć wyniosłem jednak kilka pomysłów, przemyśleń i naprawdę ogromną ilość wiedzy. Chłopaki spisali się na medal.</p>
<h4><a href="https://github.com/warszawajug/warsjawa2011/wiki/WAS8-+-OSGi">&#8220;WebSphere Application Server v8.0 + OSGi&#8221;</a></h4>
<p>Grzegorz Abramczyk na co dzień pracuje w IBM i zaprezentował nam jak przeprowadzić integrację WAS 8 z OSGi 4.3. Prezentacja ciekawa, na równym poziomie i bez zacięć. Co więcej można o niej powiedzieć? Chyba niewiele więcej, ponieważ była to prezentacja taka jak każda inna przeciętna prezentacja. Bez fajerwerków, ale i bez wpadek. Kawał solidnej roboty, który przyda się tym, którzy będę musieli zagłębić się w dany temat.</p>
<h4>Tera byłem ja</h4>
<p>I czekam na ocenę w komentarzach <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h4><a href="https://github.com/warszawajug/warsjawa2011/wiki/Java-EE-6-Web-Profile-z-Apache-TomEE">&#8220;Java EE 6 Web Profile z Apache TomEE&#8221;</a></h4>
<p>Jacek tym razem zaprezentował <a href="http://openejb.apache.org/3.0/apache-tomee.html">TomEE</a>, czyli Tomcata 7 podrasowanego by spełniać Web Profile z Javy EE6. Sama prezentacja była o tyle ciekawa, że Jacek podszedł dość luźno do tematu, bo jak sam stwierdził, cytując z pamięci:</p>
<blockquote><p>Nie przejmuję się tym z jakim nastawieniem wyjdziecie.</p></blockquote>
<p>co spowodowało duże rozluźnienie, a w efekcie super efekt. W ramach przykładów było nie tylko pokazanie, że Web Profile na TomEE działa prawidłowo, ale też otrzymaliśmy przegląd tego co niespodziewanego może nam się przydarzyć w trakcie pracy nad projektem w NetBeans 7.1. Całość okraszona humorem &#8220;z naszego potworka&#8221;.</p>
<h4>Podsumowanie</h4>
<p>Tegoroczna Warsjawę uważam, za udaną. Jedyne do czego można się przyczepić to brak nagrywania prezentacji, ale z drugiej strony Jacek &#8220;do it yourself&#8221;, a ja też jestem baran, bo zapomniałem kamery <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Jak obiadek była pizza na koszt sponsorów, a na zakończenie rozlosowano nagrody (w końcu coś wygrałem). I tym pozytywnym akcentem kończę relację.</p>
<p>ps. o zasadach przedstawionych przez Pawła i Krzyśka pewno będę jeszcze pisał, ponieważ po tym krótkim teście wiem, że są bardzo pomocne. </p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/&amp;title=Panie+Majster%26%238230%3B.+teraz+bangla%21" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Del.icio.us" alt="dodaj 'Panie Majster&#8230;. teraz bangla!' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/&amp;title=Panie+Majster%26%238230%3B.+teraz+bangla%21" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do digg" alt="dodaj 'Panie Majster&#8230;. teraz bangla!' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Technorati" alt="dodaj 'Panie Majster&#8230;. teraz bangla!' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/&amp;title=Panie+Majster%26%238230%3B.+teraz+bangla%21" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Stumble Upon" alt="dodaj 'Panie Majster&#8230;. teraz bangla!' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/&amp;title=Panie+Majster%26%238230%3B.+teraz+bangla%21" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do Google Bookmarks" alt="dodaj 'Panie Majster&#8230;. teraz bangla!' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/&amp;t=Panie+Majster%26%238230%3B.+teraz+bangla%21" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do FaceBook" alt="dodaj 'Panie Majster&#8230;. teraz bangla!' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/&amp;title=Panie+Majster%26%238230%3B.+teraz+bangla%21" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Panie Majster&#8230;. teraz bangla!' do wykop.pl" alt="dodaj 'Panie Majster&#8230;. teraz bangla!' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/10/17/panie-majster-teraz-bangla/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>S.O.L.I.D.ne programowanie – część 4, czyli apartheid</title>
		<link>http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/</link>
		<comments>http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 15:59:59 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[Interfeace Segregation Principle]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1434</guid>
		<description><![CDATA[S.O.L.I.D.ne programowanie – część 0, czyli wstęp S.O.L.I.D.ne programowanie – część 1, czyli monogamia S.O.L.I.D.ne programowanie – część 2, czyli spoufalamy się S.O.L.I.D.ne programowanie – część 3, czyli podkładamy świnię Witam w czwartej części cyklu S.O.L.I.D.ne Programowanie. Dzisiejszy temat zajęć to Interface Segregation Principle (ISP). Co mnie to obchodzi? Często gdy trafiamy na jakiś interfejs [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/">S.O.L.I.D.ne programowanie – część 0, czyli wstęp</a><br />
<a href="http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/">S.O.L.I.D.ne programowanie – część 1, czyli monogamia</a><br />
<a href="http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/">S.O.L.I.D.ne programowanie – część 2, czyli spoufalamy się</a><br />
<a href="http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/">S.O.L.I.D.ne programowanie – część 3, czyli podkładamy świnię</a></p>
<p>Witam w czwartej części cyklu <a href="http://koziolekweb.pl/tag/solidne-programowanie/">S.O.L.I.D.ne Programowanie</a>. Dzisiejszy temat zajęć to Interface Segregation Principle (ISP).</p>
<h4>Co mnie to obchodzi?</h4>
<p>Często gdy trafiamy na jakiś interfejs pierwszą myślą jest po kiego wała oni tu wpakowali tyle metod? Nadmiernie rozbudowana lista metod zaciemnia interfejs i powoduje, że jest on trudny w użyciu. ISP mówi nam, że:</p>
<blockquote><p>Klient nie powinien być uzależniony od interfejsów z których nie korzysta.</p></blockquote>
<p>Mówiąc prościej klient powinien operować na interfejsie zawierającym tylko potrzebne mu metody. </p>
<h4>Nietzscheańska idea nad interfejsu</h4>
<p>Jako, że sam popełniam ten błąd to zacznę od określenia czym jest super interfejs.<br />
Super Interfejs jest to interfejs, który skupia w sobie wszystkie potrzebne w danej chwili metody i nie uwzględnia ich zadań. Inaczej mówiąc jest to interfejs, który łamie zasadę <a href="http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/">SRP</a>. Zdefiniujmy przykładowy interfejs <samp>Robotnik</samp>:</p>
<p class="listing">Listing 1. Super interfejs &#8211; <samp>Robotnik</samp></p>
<pre name="code" class="java">
package pl.koziolekweb.solid.isp;

public interface Robotnik {

	public void pracuj();

	public void pobierzWyplatę();

}
</pre>
<p>Przyjrzyjmy się teraz dwóm innym interfejsom, które korzystaja z naszego robotnika. <samp>Manager</samp> i <samp>Księgowy</samp>.</p>
<p class="listing">Listing 2. Interfejsy klienckie &#8211; <samp>Manager</samp> i <samp>Księgowy</samp></p>
<pre name="code" class="java">
package pl.koziolekweb.solid.isp;

public interface Manager {

	public void dodajPracownika(Robotnik robotnik);

	public void zarządzaj();
}
// .... //
package pl.koziolekweb.solid.isp;

public interface Księgowy {

	public void przyjmijNaStan(Robotnik robotnik);

	public void wypłaćPensję();

}
</pre>
<p>Od razu widać co jest nie tak?</p>
<h4>Czy roboty mają uczucia?</h4>
<p>Dobre pytanie. Przypowieść programistyczna na temat ISP. Dawno dawno temu była sobie fabryka. W fabryce pracowali robotnicy, managerowie i księgowi. Robotnicy wykonywali swoje zadania, managerowie kontrolowali robotników i zlecali księgowym wypłacanie pensji. Jednak któregoś dnia prezes postanowił, że część prac wykonywać będzie robot. Zgodnie z procedurą robot został wciągnięty na listę nadzoru managerskiego i był pod opieką jednego z managerów. Gdy nadszedł dzień wypłaty manager przekazał listę swoich pracowników do księgowych, a ci rozpoczęli wykonywanie przelewów. Nastąpiła jednak konsternacja wielka wśród księgowych bo nikt nie wiedział jak poradzić sobie z problemem robota. Z jednej strony był on pracownikiem i należało mu się wynagrodzenie, a z drugiej jednak był tylko maszyną&#8230; konsternacja trwała tak długo, że inni robotnicy nie otrzymali swych wypłat, spalili opony przed siedzibą zarządu fabryki, a ta upadła.<br />
Jedynie robot zaśmiał by się z zaistniałej sytuacji oczywiście gdyby miał uczucia.</p>
<h4>Zmiana punku widzenia</h4>
<p>Gdy zapytasz się twórcy interfejsu co miał na myśli tworząc interfejs <samp>Robotnik</samp> najprawdopodobniej usłyszysz, że robotnik przecież pracuje i otrzymuje wypłatę. Jeżeli jednak popatrzymy na ten problem z punktu widzenia managera to ważna jest tylko praca, ale znowu punkt widzenia księgowego bierze pod uwagę tylko wypłatę wynagrodzenia. Interfejs powinien definiować metody związane z zadaniem, ale z punktu widzenia użytkownika tego zadania, a nie klasy implementującej. Bardzo dobrym przykładem jest tu interfejs <samp>Comparable</samp> i jego użycie w narzędziach do sortowania kolekcji. Metoda sortująca żąda tylko czegoś co jest <samp>Comparable</samp>, czyli ma tylko jedną metodę <samp>compareTo</samp>. Nie jest dla narzędzia istotne jakie inne zadania ma obiekt. Ma tylko mieć możliwość porównania się z innym obiektem. </p>
<h4>Naprawiamy świat</h4>
<p>Interfejs <samp>Robotnik</samp> jest zły. Ponieważ klasa, która będzie go implementować MUSI uwzględniać zarówno fakt, że robotnik pracuje jak i fakt, że otrzymuje pensję. Jeżeli na stan wprowadzimy klasę <samp>Robot</samp>, której obiekty nie będą wymagały pensji, ale będą pracowały to albo księgowy będzie musiał jakoś sobie poradzić z błędami albo programista będzie musiał jakoś tak zaprojektować robota, żeby ten przyjmował bezpieczną pensję (np. 0). Rodzi to kolejne trudności jak na przykład uwzględnienie przy wypłacie grupy zaszeregowania, wysługi lat, amortyzacji itp. Problem taki będzie propagował się na inne części systemu, a lokalnie tworzone obejścia będą tylko utrudniały utrzymanie kodu.<br />
Prawidłowym rozwiązaniem jest rozbicie interfejsu <samp>Robotnik</samp> na dwa interfejsy. <samp>Pracujący</samp> i <samp>Opłacany</samp>:</p>
<p class="listing">Listing 3. Interfejsy &#8211; <samp>Pracujący</samp> i <samp>Opłacany</samp></p>
<pre name="code" class="java">package pl.koziolekweb.solid.isp;

public interface Pracujący {

	public void pracuj();

}
// .... //package pl.koziolekweb.solid.isp;

public interface Opłacany {

	public void pobierzWyplatę();

}
</pre>
<p>Zmianie ulegną oczywiście interfejsy <samp>Manager</samp> i <samp>Księgowy</samp>.</p>
<p class="listing">Listing 4. Interfejsy klienckie &#8211; <samp>Manager</samp> i <samp>Księgowy</samp>, nowa wersja</p>
<pre name="code" class="java">
package pl.koziolekweb.solid.isp;

public interface Manager {

	public void dodajPracownika(Pracujący robotnik);

	public void zarządzaj();
}
// .... //
package pl.koziolekweb.solid.isp;

public interface Księgowy {

	public void przyjmijNaStan(Opłacany robotnik);

	public void wypłaćPensję();

}
</pre>
<p>Oczywiście te zmiany to tylko początek. Kolejnymi powinno być pozmienianie klas fabrykujących poszczególne rodzaje obiektów tak by roboty i ludzie trafiali do odpowiednich kolejek. Refaktoryzacja kodu, którą powoduje ISP zazwyczaj jest bardzo głęboka. Dlatego też należy stosować segregację interfejsów już na samym początku, a jeżeli zachodzi konieczność podziału interfejsu należy robić to natychmiast po zauważeniu tak by zmiany dotknęły jak najmniejszą część systemu.</p>
<h4>Inne zalety</h4>
<p>ISP powoduje tworzenie dużej ilości małych interfejsów (w skrajnym przypadku jedna metoda na interfejs) oraz rozwlekanie się definicji metod o kolejne elementy do implementacji. Choć wydaje się to głupie to takie rozwiązanie ma same zalety. Po pierwsze kod kliencki zawsze dostanie to czego potrzebuje w danej chwili. Po drugie nic nie broni łączyć interfejsów:</p>
<p class="listing">Listing 4. Interfejs połączony &#8211; <samp>RobotnikCzłowiek</samp></p>
<pre name="code" class="java">
package pl.koziolekweb.solid.isp;

public interface RobotnikCzłowiek extends Pracujący, Opłacany {
}
</pre>
<p>Jeżeli zachodzi taka potrzeba. Jest to szczególnie przydatne w klasach fabrykujących, które pracują według wzorca budowniczego. Dostarczają one potrzebny element zachowując jednocześnie wszystkie właściwości jego części. Po trzecie znacznie ułatwia to pisanie testów jednostkowych. Testowaniu podlega wtedy prosty interfejs co pozwala na znacznie lepsze napisanie przypadków testowych uwzględnienie różnych danych skrajnych i uzyskanie lepszego pokrycia kodu. Test staje się prawdziwie jednostkowy ponieważ testuje najmniejszą jednostkę kodu jaką jest metoda. Po czwarte podobnie jak z testami sprawa ma się z dokumentacją. Łatwiej jest udokumentować działanie pojedynczej metody. Można dokładnie opisać co robi, niż napisać dokumentację dla złożonego interfejsu w której uwzględniamy kontekst wywołania czy wpływ innych nie powiązanych metod (opis jak działa wypłacanie pensji dla robota skoro nie powinien on w ogóle pensji dostawać).<br />
ISP jest jedną z najprzydatniejszych zasad programowania obiektowego i warto ją stosować zawsze i wszędzie.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/&amp;title=S.O.L.I.D.ne+programowanie+%E2%80%93+cz%C4%99%C5%9B%C4%87+4%2C+czyli+apartheid" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Del.icio.us" alt="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/&amp;title=S.O.L.I.D.ne+programowanie+%E2%80%93+cz%C4%99%C5%9B%C4%87+4%2C+czyli+apartheid" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do digg" alt="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Technorati" alt="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/&amp;title=S.O.L.I.D.ne+programowanie+%E2%80%93+cz%C4%99%C5%9B%C4%87+4%2C+czyli+apartheid" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Stumble Upon" alt="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/&amp;title=S.O.L.I.D.ne+programowanie+%E2%80%93+cz%C4%99%C5%9B%C4%87+4%2C+czyli+apartheid" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Google Bookmarks" alt="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/&amp;t=S.O.L.I.D.ne+programowanie+%E2%80%93+cz%C4%99%C5%9B%C4%87+4%2C+czyli+apartheid" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do FaceBook" alt="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/&amp;title=S.O.L.I.D.ne+programowanie+%E2%80%93+cz%C4%99%C5%9B%C4%87+4%2C+czyli+apartheid" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do wykop.pl" alt="dodaj 'S.O.L.I.D.ne programowanie – część 4, czyli apartheid' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/11/16/s-o-l-i-d-ne-programowanie-%e2%80%93-czesc-4-czyli-apartheid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię</title>
		<link>http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/</link>
		<comments>http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 19:01:46 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[Liskov Substitution Principle]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=726</guid>
		<description><![CDATA[S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się Witam w trzeciej części cyklu S.O.L.I.D.ne Programowanie. Dziś na warsztat bierzemy Liskov Substitution Principle (LSP). Nie kijem go to pałą Efekt powinien być ten sam. Zasada Podstawienia Liskowa jest prosta, ale może przysporzyć [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/">S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp</a><br />
<a href="http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/">S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia</a><br />
<a href="http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/">S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się</a></p>
<p>Witam w trzeciej części cyklu <a href="http://koziolekweb.pl/tag/solidne-programowanie/">S.O.L.I.D.ne Programowanie</a>. Dziś na warsztat bierzemy Liskov Substitution Principle (LSP).</p>
<h4>Nie kijem go to pałą</h4>
<p>Efekt powinien być ten sam. Zasada Podstawienia Liskowa jest prosta, ale może przysporzyć problemów. </p>
<blockquote><p>Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T.</p></blockquote>
<p>Względnie znacznie szerzej znana definicja matematyczna tego problemu:</p>
<blockquote><p>Dla każdego X i Y należącego do zbioru R, takich że X = Y, jeżeli F(X) odwzorowuje X w zbiorze R to F(Y) też odwzorowuje Y w zbiorze R tak, że F(X) = F(Y)</p></blockquote>
<p>Jednym zdaniem wymiana implementacji nie powinna wpływać na kod klienta. </p>
<h4>Kij</h4>
<p>LSP jest, jak już pisałem, dość prosta. Jednocześnie należy zwrócić uwagę na fakt, że czasami realizacja tej zasady jest niemożliwa. Co ciekawe są to dość częste przypadki i należy pamiętać o nich.<br />
Do rzeczy. Po pierwsze co mów nam ta zasada to to, że jeżeli klasę A zamienimy klasą B, która <strong>dziedziczy</strong> z A to klient nie powinien otrzymać innych wyników. Ważna rzecz, o której wszyscy zapominamy LSP dotyczy tylko klas dziedziczących po sobie, a nie implementacji interfejsów. Szczególnie interfejsów uogólnionych, czyli takich które pozwalają na realizację wielu funkcjonalności za pomocą jednego spójnego API.</p>
<h5>Przykład 1. Filtr tekstu</h5>
<p>Przykładem kodu, który nie podpada pod LSP jest kod filtrujący. Załóżmy, że użytkownik wywołuje zdalnie metodę <samp>procced(String):String</samp>. Ciężko jest wymagać, by wszystkie filtry działały w ten sam sposób i wykonywały takie same operacje. Dlatego też wybór konkretnej implementacji spada na użytkownika. To on wykonuje wymianę implementacji i ponosi wszelkie konsekwencje tej zmiany.</p>
<p class="listing">Listing 1. Kod niepodlegający LSP</p>
<pre name="code" class="java">package pl.koziolekweb.solid.lsp;

public class App {
	public static void main(String[] args) {
		// kod użytkownika
		String abc = "abc";
		TextFilter filter = new AFilter();
		System.out.println(filter.procced(abc));
		filter = new BFilter();
		System.out.println(filter.procced(abc));
	}
}

// nasz kod
interface TextFilter {

	public String procced(String text);

}

class AFilter implements TextFilter {

	public String procced(String text) {
		return text.replaceAll("a", "");
	}
}

class BFilter implements TextFilter {

	public String procced(String text) {
		return text.replaceAll("b", "");
	}
}</pre>
<p>W kodzie klienta nastąpiła wymiana implementacji i pociągnęła ona za sobą zmianę zachowania. Klient może mieć pretensje tylko do siebie ponieważ z pełną świadomością wymienił implementację na inną.</p>
<h4>Pała</h4>
<p>Skoro istnieje kod, który po d LSP nie podpada to muszą istnieć też miejsca dla których LSP ma zastosowanie. Powróćmy do naszego przykładu i załóżmy, że zmieniamy implementację <samp>AFilter</samp>.</p>
<p class="listing">Listing 2. LSP w praktyce &#8211; poprawnie</p>
<pre name="code" class="java">
package pl.koziolekweb.solid.lsp;

public class App {
	public static void main(String[] args) {
		// kod użytkownika
		String abc = "abc";
		TextFilter filter = new AFilter();
		System.out.println(filter.procced(abc));
		filter = new BFilter();
		System.out.println(filter.procced(abc));
	}
}

// nasz kod
interface TextFilter {

	public String procced(String text);

}

class AFilter implements TextFilter {

	public String procced(String text) {
		try{
			//coś ekstra liczymy
		}catch (Exception e) {

		}
		return text.replaceAll("a", "");
	}
}

class BFilter implements TextFilter {

	public String procced(String text) {
		return text.replaceAll("b", "");
	}
}</pre>
<p class="listing">Listing 3. LSP w praktyce &#8211; niepoprawnie</p>
<pre name="code" class="java">
package pl.koziolekweb.solid.lsp;

public class App {
	public static void main(String[] args) {
		// kod użytkownika
		String abc = "abc";
		TextFilter filter = new AFilter();
		System.out.println(filter.procced(abc));
		filter = new BFilter();
		System.out.println(filter.procced(abc));
	}
}

interface TextFilter {

	public String procced(String text) throws Exception;

}

class AFilter implements TextFilter {

	public String procced(String text) throws Exception{

			//coś ekstra liczymy

		return text.replaceAll("a", "");
	}
}

class BFilter implements TextFilter {

	public String procced(String text) throws Exception{
		return text.replaceAll("b", "");
	}
}</pre>
<p>tu leży pies pogrzebany. Zmieniliśmy implementację kodu. Na listing 2. zrobiliśmy to w prawidłowy sposób zamykając nowe ciekawe możliwości wewnątrz metody. Na listingu 3. zmiany nie dość, że spowodowały zmianę API to dodatkowo kod klienta nie kompiluje się. Czyli jest źle.<br />
W javie mamy <samp>@Deprecated</samp>, która służy od oznaczania kodu przestarzałego. Jedyną możliwością wycofania metody lub klasy z API oznaczenie jej jako przestarzałej. LSP chroni użytkownika przed niepodziewanymi zmianami w działaniu kodu jak i zmianami API. </p>
<p class="listing">Listing 4. LSP w praktyce &#8211; poprawnie</p>
<pre name="code" class="java">package pl.koziolekweb.solid.lsp;

public class App {
	public static void main(String[] args) {
		// kod użytkownika
		String abc = "abc";
		TextFilter filter = new AFilter();
		System.out.println(filter.procced(abc));
		filter = new BFilter();
		System.out.println(filter.procced(abc));
	}
}

// nasz kod
interface TextFilter {

	@Deprecated
	public String procced(String text);

	public String proccedAndThrow(String text) throws Exception;

}

class AFilter implements TextFilter {

	@Deprecated
	public String procced(String text) {
		return text.replaceAll("a", "");
	}

	public String proccedAndThrow(String text) throws Exception {
		// coś ekstra liczymy
		return text.replaceAll("a", "");
	}
}

class BFilter implements TextFilter {

	@Deprecated
	public String procced(String text) {
		return text.replaceAll("b", "");
	}

	public String proccedAndThrow(String text) throws Exception {
		return procced(text);
	}
}</pre>
<p>Prawidłowe rozwiązanie, które zachowując LSP pozwala na wprowadzenie nowego inaczej zachowującego się kodu. </p>
<h4>Podsumowanie</h4>
<p>Choć LSP jest bardzo prosta w zrozumieniu i użyciu to należy pamiętać, że istnieje kod, który tej zasadzie nie podlega. LSP należy używać mądrze, a nie zawsze.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+3%2C+czyli+podk%C5%82adamy+%C5%9Bwini%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Del.icio.us" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+3%2C+czyli+podk%C5%82adamy+%C5%9Bwini%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do digg" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Technorati" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+3%2C+czyli+podk%C5%82adamy+%C5%9Bwini%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Stumble Upon" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+3%2C+czyli+podk%C5%82adamy+%C5%9Bwini%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Google Bookmarks" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/&amp;t=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+3%2C+czyli+podk%C5%82adamy+%C5%9Bwini%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do FaceBook" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+3%2C+czyli+podk%C5%82adamy+%C5%9Bwini%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do wykop.pl" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 3, czyli podkładamy świnię' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/03/28/solidne-programowanie-czesc-3-czyli-podkladamy-swinie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się</title>
		<link>http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/</link>
		<comments>http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 22:28:37 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[Open Close Principle]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=583</guid>
		<description><![CDATA[S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia Witam w drugiej części cyklu &#8220;S.O.L.I.D.ne programowanie&#8221;, poświęconego zasadom S.O.L.I.D. Dziś przyjrzymy się bliżej Open-Close Principle (OCP). Ciężko było mi wyszukać jakiś elegancki przykład no i czasu było mało, ale przepraszam za opóźnienia. Jedziemy. Drogie panie otwieram nasz kram&#8230; Dobry kod [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/">S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp </a><br />
<a href="http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/">S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia </a></p>
<p>Witam w drugiej części cyklu <a href="http://koziolekweb.pl/tag/solidne-programowanie/">&#8220;S.O.L.I.D.ne programowanie&#8221;</a>, poświęconego zasadom S.O.L.I.D. Dziś przyjrzymy się bliżej Open-Close Principle (OCP). </p>
<p class="offtopic">
Ciężko było mi wyszukać jakiś elegancki przykład no i czasu było mało, ale przepraszam za opóźnienia. Jedziemy.</p>
<h4>Drogie panie otwieram nasz kram&#8230;</h4>
<p>Dobry kod obiektowy powinien cechować się dużą elastycznością. Elastyczność to przede wszystkim umiejętność szybkiego dostosowania się do nowych wymagań. Szybkie dostosowanie oznacza przede wszystkim małą liczbę zmian. Wynika to z faktu, że zmieniany kod trzeba testować. W dodatku zmiany wpływają na inne elementy aplikacji i je też trzeba testować. Zasada OCP mówi:</p>
<blockquote><p>SOFTWARE ENTITIES (CLASSES, MODULES, FUNCTIONS, ETC.) SHOULD BE OPEN FOR EXTENSION, BUT CLOSED FOR MODIFICATION.</p></blockquote>
<p>Jako, że zmiany są jedyną pewną i niezmienną rzeczą z jaka mamy do czynienia w programowaniu, więc kod, który nie umie się zmieniać jest do wyrzucenia. Sama zasada jest przewrotna, bo cóż oznacza otwartość na zmiany i jednoczesna niemożliwość modyfikacji?<br />
Ta przewrotność jest jednocześnie pewną filozofią. Wraz z kolejnymi zasadami odkryjemy, że celem S.O.L.I.D. jest takie konstruowanie kodu by zmiany w jego działaniu nie wpływały na kod klienta.<br />
OCP można realizować w kilku aspektach. Przyjrzymy się wszystkim po kolei. Każdy z nich dotyczy innego zagadnienia, ale wszystkie należą do zagadnień związanych z organizacją kodu.</p>
<h4>Dziedziczenie nie jest złe</h4>
<p>Od wielu lat wbija się do głowy kolejnym pokoleniom programistów Java, że nie powinni używać dziedziczenia, ale implementować interfejsy. Jest to o tyle słuszne, że mało kto potrafi zaproponować odpowiedni sposób dziedziczenia. Przez sposób rozumiem tu zarówno realizację dziedziczenia w aplikacji jak i motywację i uzasadnienie tejże.<br />
Powróćmy do naszego przykładu z <a href="http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/">pierwszej części</a>. Przedstawiony tam przykład modemu będzie nam służył w tym artykule. Załóżmy, że chcemy rozszerzyć funkcjonalność modemu o obsługę WiFi. Co powinniśmy zatem zrobić? Najprościej jest zmienić tak implementację by możliwe było przyjmowanie połączeń nowym kanałem. Zmiany tej dokonujemy przez stworzenie dekoratora, który otoczy standardową implementację i doda odpowiednią funkcjonalność. To jest dobre OCP. Nie zmieniamy już gotowego kodu, a tylko nieinwazyjnie dodajemy do niego odpowiednie funkcjonalności.<br />
Złym OCP będzie grzebanie bezpośrednio w kodzie, ale najgorszym będzie pisanie wszystkiego od nowa.<br />
Na tym poziomie mówimy o OCP w odniesieniu do funkcjonalności kodu. Przyjrzyjmy się teraz samym obiektom.</p>
<h4>Gettery i Settery to nie hermetyzacja</h4>
<p>Co tu dużo mówić, jeżeli w naszych obiektach wszystkie pola mają metody ustawiające to nie możemy mówić o OCP. Kod tego typu nie jest zamknięty na modyfikacje ponieważ w pełni został ujawniony. Publikować należy zatem tylko to co jest naprawdę niezbędne i robimy to w sposób bezpieczny wielowątkowo.</p>
<h4>Pakiet</h4>
<p>Poruszyliśmy już temat funkcjonalności kodu i API klasy. Ostatnim zagadnieniem jest odpowiednie publikowanie modułów. Zazwyczaj moduły mają bardzo dużo klas publicznych. OCP jest przeciwnikiem publikowania elementów zmiennych. Prawidłowo skonstruowany moduł powinien umożliwiać jego rozszerzenie w dowolnym punkcie, ale bez możliwości zmiany kodu modułu. Oznacza to, że należy ograniczyć możliwość takiego rozszerzania klas, które realizują zadania wewnątrz modułu, że ingerujemy w moduł np. zmianiając konfigurację fabryk. </p>
<h4>Podsumowanie</h4>
<p>OCP jest bardzo dziwną zasadą, która nie jest oczywista do puki czegoś nie popsujemy. Zapraszam zatem do dyskusji o różnych aspektach OCP.</p>
<p class="offtopic">co ja mam dziś z tymi aspektami</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+2%2C+czyli+spoufalamy+si%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Del.icio.us" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+2%2C+czyli+spoufalamy+si%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do digg" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Technorati" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+2%2C+czyli+spoufalamy+si%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Stumble Upon" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+2%2C+czyli+spoufalamy+si%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Google Bookmarks" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/&amp;t=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+2%2C+czyli+spoufalamy+si%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do FaceBook" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+2%2C+czyli+spoufalamy+si%C4%99" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do wykop.pl" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 2, czyli spoufalamy się' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia</title>
		<link>http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/</link>
		<comments>http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 13:07:27 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=578</guid>
		<description><![CDATA[S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp Witam na pierwszym spotkaniu z zasadami S.O.L.I.D. Temat zajęć Single Responsibility Principle. Ok koniec oficjalnego języka&#8230; Kod jest rodzaju męskiego Czytałem gdzieś ostatnio, że mężczyzna jest istotą zdolną do wykonywania jednej czynności naraz. Książka była o tym jak tworzyć udany związek i pisała ją jakaś anarcho-feministka. Ma jednak [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/"> S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp</a></p>
<p>Witam na pierwszym spotkaniu z zasadami S.O.L.I.D. Temat zajęć Single Responsibility Principle. Ok koniec oficjalnego języka&#8230;</p>
<h4>Kod jest rodzaju męskiego</h4>
<p>Czytałem gdzieś ostatnio, że mężczyzna jest istotą zdolną do wykonywania jednej czynności naraz. Książka była o tym jak tworzyć udany związek i pisała ją jakaś anarcho-feministka. Ma jednak rację. Mężczyzna nie potrafi robić kilku rzeczy naraz. Wynika to z tego prostego faktu, że chcemy nasza pracę wykonywać dobrze to się na niej skupiamy.<br />
Podobnie ma się rzecz dobrym kodem. </p>
<blockquote><p>THERE SHOULD NEVER BE MORE THAN ONE REASON FOR A CLASS TO CHANGE</p></blockquote>
<p>Ten cytat jest zazwyczaj podawany jako clou jeśli chodzi o regułę SRP. Oznacza ona, że zamiany w kodzie mogą być spowodowane tylko przez jedną i tylko jedną przyczynę. Ma to bardzo dobre uzasadnienie w praktycznych rozwiązaniach. Pojedyncza odpowiedzialność pozwala na separację poszczególnych modułów i tym samym utrzymanie kodu staje się łatwiejsze. Sięgając po jakąś klasę od razu wiemy kto zacz.<br />
<a href="http://koziolekweb.pl/2009/02/25/refaktoryzacja-extract-and-move-something-i-srp/">Wspominałem</a> o tym, że jeżeli działania kodu nie można opisać w trzech zdaniach to należy go refaktoryzować. Pojawia się tam też odniesienie do poziomu abstrakcji w ramach którego działamy. No właśnie&#8230;</p>
<h4>Jeden powód do zmian != jedna czynność</h4>
<p>SRP jest prostą regułą, którą wprowadzają osoby, które trochę programują. Jest to samo narzucająca się zasada. Pozwala na unikanie duplikacji kodu, tworzenie modułów Jest to jedna z najbardziej intuicyjnych rzeczy w projektowaniu. Podobnie jak w przypadku <a href="http://koziolekweb.pl/tag/singleton/">singletona</a> można jednak popaść w poważne tarapaty jeżeli nie rozumie się do końca zasady działania. Mam doskonały przykład jak nie stosować SRP. Zaprogramujmy Modem.</p>
<h5>Złe SRP</h5>
<p>Modem powinien posiadać następujące funkcje:</p>
<ul>
<li>Powinien umożliwiać nawiązanie połączenia.</li>
<li>Powinien umożliwiać zerwanie połączenia</li>
<li>Powinien umożliwiać wysłanie wiadomości</li>
<li>Powinien umożliwiać odbieranie wiadomości</li>
</ul>
<p>Te cztery funkcjonalności składają się na modem. Warto zauważyć, że nie są one ze sobą sztywno powiązane. Jedyne zależności wynikają z przymusu zachowania kolejności wywołania metod (najpierw połączenie potem komunikacja i na końcu rozłączenie). Tworzą one dwie grupy. Pierwsza odpowiada za połączenie, druga za komunikację. Mamy już zatem dwa interfejsy. Pierwszy będzie zawierał metody <samp>connect()</samp> i <samp>disconnect()</samp>, a drugi <samp>send()</samp> i <samp>receive()</samp>. Programista będzie używał tych dwóch interfejsów, ręcznie nawiązywał i zrywał połączenie wysyłał dane i je odbierał. Pakujemy nasz kod do biblioteki nazywamy modem i zgarniamy kasiorkę&#8230; a tu dupa. Generalnie takie podejście jest przykładem złego SRP. Na pierwszy rzut oka odseparowaliśmy odpowiedzialności. Każda z klas ma tylko jeden powód do zmian. Są to odpowiednio zmiana sposobu komunikacji dla klasy <samp>Connector</samp> i zmiana formatu komunikatów dla klasy <samp>Communicator</samp>. Jednak nie wykonaliśmy głównego zadania. Nie mamy modemu! Mamy zestaw luźno powiązanych klas, które wrzuciliśmy do jednego wora i nazwaliśmy modem.<br />
Problemem okazuje się zachowanie poziomu abstrakcji przy jednoczesnym stosowaniu SRP. Reguła prowadzi do rozdrobnienia kodu. Jednocześnie zanika nam główny problem. To tak jakbyśmy zamiast na pustynię patrzyli na zbiór ziarenek piachu.</p>
<h5>Dobre SRP</h5>
<p>Dobre rozwiązanie tego problemu polega na zastosowaniu odpowiedniego poziomu abstrakcji dla modemu. W pierwszym kroku musimy zmodyfikować nasze wymagania:</p>
<ul>
<li>Modem umożliwia komunikację z X</li>
</ul>
<p>Modem jak widać ma z definicji jedno zadanie. Umożliwić komunikację. Sposób realizacji tego zadania jest na niższym poziomie. Nadal jedynym powodem zmian jest zmiana sposobu komunikacji, ale nie jest tu już istotne który element się zmienił. W praktyce modem powinien mieć tylko dwie metody <samp>send()</samp> i <samp>setMessageTarget()</samp>. Pierwsza powinna pozwalać na wysłanie wiadomości, a druga na ustawienie miejsca, w które powinny być przekazane wiadomości przychodzące. Klient jest zadowolony, modem ma jedną odpowiedzialność, a w szczegóły nie wnikamy.</p>
<h4>Praktyka</h4>
<p>Przykład z modemem może wydawać się błędny. W drugim przypadku modem ma wiele odpowiedzialności, ale tylko z punktu widzenia kombinatora. Z punktu widzenia klienta realizuje on dwa zadania w ramach jednej odpowiedzialności &#8211; wysyła i pobiera komunikaty. Klienta nie interesują szczegóły. W samym modemie realizowany jest odpowiedni algorytm i jego zmiana jest jedynym powodem zmiany w klasie. Oczywiście poszczególne elementy algorytmu są realizowane przez kolejne podzespoły &#8211; klasy i metody, które odpowiadają za coraz węższą działkę.<br />
Zasada jednej odpowiedzialności w praktyce oznacza umiejętne delegowanie bardziej szczegółowych zadań do osobnych klas i metod. Dana klasa realizuje tylko abstrakcyjne zadanie nie wnikają w szczegóły kolejnych kroków.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+1%2C+czyli+monogamia" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Del.icio.us" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+1%2C+czyli+monogamia" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do digg" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Technorati" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+1%2C+czyli+monogamia" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Stumble Upon" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+1%2C+czyli+monogamia" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Google Bookmarks" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/&amp;t=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+1%2C+czyli+monogamia" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do FaceBook" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+1%2C+czyli+monogamia" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do wykop.pl" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 1, czyli monogamia' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp</title>
		<link>http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/</link>
		<comments>http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 20:05:54 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=573</guid>
		<description><![CDATA[Krzysiek Jelski natchnął mnie do napisania serii postów o zasadach programowania obiektowego. Występują one pod nazwą S.O.L.I.D., która to nazwa pochodzi od pierwszych liter tych zasad: Single Responsibility Principle Open-Close Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle Ten wpis będzie tylko wstępem w którym omówię czym są te zasady, skąd się wzięły [...]]]></description>
			<content:encoded><![CDATA[<p>Krzysiek Jelski natchnął mnie do napisania serii postów o zasadach programowania obiektowego. Występują one pod nazwą S.O.L.I.D., która to nazwa pochodzi od pierwszych liter tych zasad:</p>
<ul>
<li><strong>S</strong>ingle Responsibility Principle</li>
<li><strong>O</strong>pen-Close Principle</li>
<li><strong>L</strong>iskov Substitution Principle</li>
<li><strong>I</strong>nterface Segregation Principle</li>
<li><strong>D</strong>ependency Inversion Principle</li>
</ul>
<p>Ten wpis będzie tylko wstępem w którym omówię czym są te zasady, skąd się wzięły i dlaczego są ważne. </p>
<h4>OOP i programiści</h4>
<p>Jeżeli zapytamy statystycznego programistę z czym kojarzy mu się dobry kod OO to najprawdopodobniej będzie mówił o wzorcach projektowych. Co poniektórzy wspomną o zasadach projektowania, enkapsulacji i hermetyzacji, dziedziczeniu, interfejsach. Niewielu wspomni o zasadach S.O.L.I.D.<br />
Nic w tym dziwnego, bo zasady te nie są sformalizowane tak jak wzorce. Dobrze określił je Krzysiek na spotkaniu mówiąc, że są raczej przysłowiami. Ja bym raczej nazwał je powiedzeniami informatyków. Każda z tych zasad odnosi się do jakiegoś bardzo ogólnego zagadnienia czy to projektowego, czy to architektonicznego czy też funkcjonalnego. Zazwyczaj do wszystkiego po trochu.<br />
Jako, że nie ma tu formalizacji więc nie można mówić o miejscach i sposobach stosowania czy problemach, które można rozwiązać. Jeżeli jednak przyjrzymy się wzorcom projektowym, to dojdziemy do wniosku, że wszystkie one zawierają w sobie te nieformalne zasady.</p>
<h4>Plan pracy</h4>
<p>Przez kolejne dni będę omawiał poszczególne zasady. Jedna zasada na jeden wpis.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+0%2C+czyli+wst%C4%99p" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Del.icio.us" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+0%2C+czyli+wst%C4%99p" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do digg" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Technorati" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+0%2C+czyli+wst%C4%99p" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Stumble Upon" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+0%2C+czyli+wst%C4%99p" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Google Bookmarks" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/&amp;t=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+0%2C+czyli+wst%C4%99p" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do FaceBook" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/&amp;title=S.O.L.I.D.ne+programowanie+%26%238211%3B+cz%C4%99%C5%9B%C4%87+0%2C+czyli+wst%C4%99p" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do wykop.pl" alt="dodaj 'S.O.L.I.D.ne programowanie &#8211; część 0, czyli wstęp' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/02/25/solidne-programowanie-czesc-0-czyli-wstep/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

