<?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/tag/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>Wed, 10 Mar 2010 21:42:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<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>AspectJ &#8211; pierwsze starcie</title>
		<link>http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/</link>
		<comments>http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 21:52:39 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[OCP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[SRP]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1513</guid>
		<description><![CDATA[Zaczynamy mini kurs programowania aspektwego z ApectJ i Eclipse. Nie chcę wnikać w spinanie projektów z mavenem (tak z lenistwa), a zatem będzie tylko w eclipse.
Instalacja softu
Z tej strony pobieramy odpowiedni dla nas pakiecik i restartujemy Eclipse. Zakładam, że wiesz jak instalować plugin eclipsowy za pomocą Update Site. Jeżeli nie to sorry Winnetou. Kurs będzie [...]]]></description>
			<content:encoded><![CDATA[<p>Zaczynamy mini kurs programowania aspektwego z ApectJ i Eclipse. Nie chcę wnikać w spinanie projektów z mavenem (tak z lenistwa), a zatem będzie tylko w eclipse.</p>
<h4>Instalacja softu</h4>
<p>Z <a href="http://www.eclipse.org/ajdt/downloads/">tej strony</a> pobieramy odpowiedni dla nas pakiecik i restartujemy Eclipse. Zakładam, że wiesz jak instalować plugin eclipsowy za pomocą Update Site. Jeżeli nie to sorry Winnetou. Kurs będzie mocno Eclipse only.<br />
Następnie tworzymy nowy projekt AspectJ. Zostaniemy zapytani czy chcemy włączyć mechanizm weaveringu i zrestartować Eclipse. Oczywiście włączamy go i restartujemy IDE.</p>
<h4>Podstawowe pojęcia</h4>
<p>W tradycyjnym modelu obiektowym gdy zaczynamy pisać program to okazuje się, że w pewnym momencie należy do naszego kodu dodać kilkanaście różnych ciekawych czy nie, ale wymaganych funkcjonalności. Zazwyczaj jest to logowanie, kontrola dostępu, jakieś duperele związane z profilowaniem. Robiąc to za pomocą klasycznych metod zazwyczaj łamiemy dwie zasady. Po pierwsze <a href="http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/">SRP</a> ponieważ nasza klasa zaczyna mieć wiele odpowiedzialności. A to logowanie, a to security, a tu jeszcze admin mówi, żeby włączyć profilowanie w jednym miejscu i natłuc raportów. Poza tym robi się burdel w kodzie. Oczywiście w pewnym momencie dochodzimy do wniosku, że większość z tych bajerów nie jest nam potrzebna i łamiemy <a href="http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/">OCP</a>. Ponieważ by je wyłączyć zaczynamy grzebać w oryginalnym kodzie. Tu z pomocą przychodzą nam aspekty. Aspekt jest to moduł aplikacji zawierający jakąś funkcjonalność, która jest wtłaczana do kodu za pomocą kompilatora aspektowego. Aspekt jest opisany za pomocą specjalnego języka, na którego podstawie kompilator odpowiednio modyfikuje kod wynikowy w procesie kompilacji. Poniżej kilka ważnych pojęć<br />
Punkt dostępu &#8211; ang. Join Point &#8211; dowolny punkt w kodzie, w którym kompilator aspektowy może wstawić kod aspektu. To czym jest ten punkt zależy od konkretnej implementacji języka aspektowego. W przypadku AspectJ są to metody, klasy, pola.<br />
Punkt przecięcia &#8211; ang. Pointcut &#8211; konkretny punkt dostępu do którego stosowany jest dany aspekt.<br />
Porada &#8211; ang. advice &#8211; kod który jest wstawiany.<br />
Wiem, że osoby, które miały do czynienia z programowaniem aspektowym uznają ten opis za uproszczony, ale KISS MY ASS (Keep Is Simple Stupid. Mayby You Are Support Soft). </p>
<h4>Co to jest AspectJ?</h4>
<p>Znowu upraszczając jest to rozszerzenie języka Java o kilka słów kluczowych i mechanizm weaveringu, czyli właśnie wkompilowywania kodu. Inaczej rzecz ujmując jest to biblioteka, która zawiera specjalny kompilator, będący rozszerzeniem kompilatora javy o funkcjonalność jaką jest obsługa aspektów. Zawiera specjalnego agenta JVM, który może wykonać pracę kompilatora w trakcie ładowania kodu. Jest to zacne i przydatne rozwiązanie.<br />
AspectJ wspiera dwa rodzaje składni. Pliki .aj, które są &#8220;naturalne&#8221; w jego środowisku oraz mechanizm oparty o adnotacje i zwykłe klasy javy. Przy czym każdy prawidłowy plik java jest prawidłowym plikiem aspektowym. Koniec końców AspectJ jest tylko rozszerzeniem języka (trochę jak C++ do C), a nie czymś całkowicie nowym.</p>
<h4>Zajawka</h4>
<p>Dzisiejszą część poświęcimy tylko na prostą aplikację w tylu &#8220;hello world&#8221;, ale pozwoli ona załapać Ci jak działa programowanie aspektowe. Na początek mamy kod taki jak poniżej:</p>
<p class="listing">Listing 1. Bazowa aplikacja</p>
<pre name="code" class="java">
package pl.koziolekweb.blog.aspectj;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Service service = new Service();
		service.welcome();
		service.welcome("Koziołek");
	}

}
//....
package pl.koziolekweb.blog.aspectj;

public class Service {
	public void welcome() {
		System.out.println("Witamy w systemie");
	}

	public void welcome(String name) {
		System.out.println("Witaj " + name);
	}
}
</pre>
<p>Naszym zadaniem jest zabezpieczyć aplikację przed niepożądanymi wywołaniami. Posłuży nam do tego specjalna klasa <samp>NKWD</samp>:</p>
<p class="listing">Listing 2. Klasa <samp>NKWD</samp> &#8211; odpowiada za bezpieczeństwo</p>
<pre name="code" class="java">
package pl.koziolekweb.blog.aspectj;

import java.util.Scanner;

public class NKWD {

	private boolean isAuth = false;

	public void auth() {
		if (isAuth) {
			return;
		} else {
			System.out.print("podaj hasło: ");
			Scanner scanner = new Scanner(System.in);
			String password = scanner.next();
			if ("dupa".equals(password)) {
				isAuth = true;
			}
			else{
				throw new RuntimeException("Wypad na Łubiankę");
			}
		}
	}
}
</pre>
<p>Pytanie co zrobimy w klasycznym podejściu? Pewno wystarczy utworzyć fabrykę obiektów NKWD, która będzie dbała o to by do każdego wątku był przyporządkowany odpowiedni obiekt NKWD. Będziemy go pobierać w każdej metodzie i w razie czego sprawdzać&#8230; no cóż&#8230; chłopaki od php zapewne by na tym poprzestali, ale mają łatwiej, bo jest u nich funkcja <samp>require_once</samp> i przetwarzanie skryptu zatem można takie sztuki robić. My niestety używamy języka programowania i zastosujemy programowanie aspektowe.<br />
Stworzymy zatem aspekt, który będzie przed każdym wywołaniem metody <samp>welcome</samp> sprawdzał czy wszystko śmiga.</p>
<p class="listing">Listing 3. Nasz pierwszy aspekt
<pre name="code" class="java">
package pl.koziolekweb.blog.aspectj;

public aspect SecurityAspect {
	private NKWD nkwd = new NKWD();

	pointcut auth() : call( * Service.welcome(..));

	before() : auth() {
		System.out.println("NKWD działa");
		nkwd.auth();
	}
}
</pre>
<p>Kompilujemy i uruchamiamy jako aplikację AspectJ. Efekt:</p>
<p class="listing">Listing 4. wyniki działania naszego pierwszego aspektu</p>
<pre name="code" class="bash">
NKWD działa
podaj hasło: dupa
Witamy w systemie
NKWD działa
Witaj Koziołek
</pre>
<h4>Chwila ze składnią</h4>
<p>Za pomocą słowa <strong>pointcut</strong> definiujemy miejsce przecięcia. Format jest dość swobodny w przypadku AspectJ zazwyczaj używamy składni bardzo zbliżonej do UMLowego definiowania sygnatur metod. Znak <strong>*</strong> oznacza dowolne słowo, a <strong>..</strong> dowolną ilość słów.<br />
Słowo <strong>before</strong> wskazuje, że dana porada będzie uruchamiana przed wywołaniem dowolnej metody pasującej do wskazanego punktu przecięcia.</p>
<h4>Podsumowanie</h4>
<p>Czytam &#8220;AspectJ in Action&#8221; i mam nadzieję, że powstanie kacusiowa recenzja.</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/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Del.icio.us" alt="dodaj 'AspectJ &#8211; pierwsze starcie' 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/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do digg" alt="dodaj 'AspectJ &#8211; pierwsze starcie' 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/12/27/aspectj-pierwsze-starcie/" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Technorati" alt="dodaj 'AspectJ &#8211; pierwsze starcie' 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/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Stumble Upon" alt="dodaj 'AspectJ &#8211; pierwsze starcie' 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/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Google Bookmarks" alt="dodaj 'AspectJ &#8211; pierwsze starcie' 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.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do wykop.pl" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/feed/</wfw:commentRss>
		<slash:comments>3</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 pierwszą myślą jest po kiego wała [...]]]></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.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ć problemów. 
Let q(x) be a [...]]]></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.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 obiektowy powinien [...]]]></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.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 rację. Mężczyzna [...]]]></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.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>2</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 i dlaczego są ważne. 
OOP i [...]]]></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.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>
