<?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>@rek online</title>
	<atom:link href="http://www.benedykt.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.benedykt.net</link>
	<description>czyli z komputerem przez życie</description>
	<lastBuildDate>Sat, 19 May 2012 08:00:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Coś niesamowitego na weekend</title>
		<link>http://www.benedykt.net/2012/05/19/cos-niesamowitego-na-weekend/</link>
		<comments>http://www.benedykt.net/2012/05/19/cos-niesamowitego-na-weekend/#comments</comments>
		<pubDate>Sat, 19 May 2012 08:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>
		<category><![CDATA[coś na weekend]]></category>
		<category><![CDATA[Wideo]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=767</guid>
		<description><![CDATA[Hmm&#8230; nie wiedziałem że mam w domu statystyka&#8230; &#160; Podobne wpisy: Coś na weekend Coś na weekend Coś lekkiego na weekend Coś lekkiego na weekend
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/28/cos-na-weekend/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/05/05/cos-na-weekend-2/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/05/12/cos-lekkiego-na-weekend/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/04/21/cos-lekkiego-na-weekend-2/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Hmm&#8230; nie wiedziałem że mam w domu statystyka&#8230;</p>
<p><object width="526" height="374" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="bgColor" value="#ffffff" /><param name="flashvars" value="vu=http://video.ted.com/talk/stream/2010X/Blank/PatriciaKuhl_2010X-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PatriciaKuhl-2010X.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1075&amp;lang=pl&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=patricia_kuhl_the_linguistic_genius_of_babies;year=2010;theme=how_the_mind_works;theme=words_about_words;event=TEDxRainier;tag=brain;tag=children;tag=language;tag=science;tag=technology;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" /><param name="pluginspace" value="http://www.macromedia.com/go/getflashplayer" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="526" height="374" type="application/x-shockwave-flash" src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" bgColor="#ffffff" flashvars="vu=http://video.ted.com/talk/stream/2010X/Blank/PatriciaKuhl_2010X-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PatriciaKuhl-2010X.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1075&amp;lang=pl&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=patricia_kuhl_the_linguistic_genius_of_babies;year=2010;theme=how_the_mind_works;theme=words_about_words;event=TEDxRainier;tag=brain;tag=children;tag=language;tag=science;tag=technology;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" pluginspace="http://www.macromedia.com/go/getflashplayer" allowfullscreen="true" allowscriptaccess="always" /></object></p>
<p>&nbsp;</p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/28/cos-na-weekend/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/05/05/cos-na-weekend-2/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/05/12/cos-lekkiego-na-weekend/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/04/21/cos-lekkiego-na-weekend-2/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/19/cos-niesamowitego-na-weekend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Closure Principle &#8211; czyli o coś porządkowaniu</title>
		<link>http://www.benedykt.net/2012/05/16/common-closure-principle-czyli-o-cos-porzadkowaniu/</link>
		<comments>http://www.benedykt.net/2012/05/16/common-closure-principle-czyli-o-cos-porzadkowaniu/#comments</comments>
		<pubDate>Wed, 16 May 2012 20:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[Common Closure Principle]]></category>
		<category><![CDATA[Principle]]></category>
		<category><![CDATA[programowanie podstawy]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=771</guid>
		<description><![CDATA[Sporo czasu poświęciłem na elektronikę i mimo tego, że nie byłem i nie jestem przesadnie pedantyczny to tranzystory i rezystory zawsze miałem uporządkowane w klasterach z posklejanych pudełek po zapałkach lub woreczkach strunowych. Takie postępowanie powodowało, że zawsze wiedziałem gdzie szukać tego jednego rezystora, który właśnie potrzebowałem. Takie segregowanie nie ma znaczenia przy 10-20-50 elementach, [...]
Brak podobnych wpisów]]></description>
			<content:encoded><![CDATA[<p>Sporo czasu poświęciłem na elektronikę i mimo tego, że nie byłem i nie jestem przesadnie pedantyczny to tranzystory i rezystory zawsze miałem uporządkowane w klasterach z posklejanych pudełek po zapałkach lub woreczkach strunowych. Takie postępowanie powodowało, że zawsze wiedziałem gdzie szukać tego jednego rezystora, który właśnie potrzebowałem. Takie segregowanie nie ma znaczenia przy 10-20-50 elementach, można to jeszcze ogarnąć jednak przy 100 i więcej zaczyna być problemem. Dokładnie to samo dzieje się z klasami. Wraz ze wzrostem ilości klas rośnie potrzeba segregowania ich i dlatego klasy segreguje się w namespaceach, katalogach, bibliotekach etc. Common Closure Principle mówi, że klasy w ramach jednego assembly (lub jednostki publikacji czyli dll) powinny posiadać wspólne zamknięcie (closure) – wspólny sensowny obszar. Rozumiem to tak, że wszystkie klasy dzielące wspólną dziedzinę powinny znaleźć się w tej same bibliotece. Zasada ta ma głęboki sens. Bo przecież nie jest zbyt wygodne, że aby użyć jakiegoś zewnętrznego elementu (np. kontrolki) należy dodać dziesiąt różnych referencji. Najwygodniej było by gdyby należało by dodać jedną referencję. Z drugiej strony wprowadzając zmiany w jakiejś części systemu nie jest dobre jeśli musimy przegrzebać 3/4 budowanej aplikacji i wprowadzić zmiany w każdej jednej bibliotece. W przeciwnym wypadku zmiana jakiegoś założenia biznesowego spowoduje zmiany w np. 20 bibliotekach, a projekty wykorzystujące takie cudo… no cóż, również wymagają zmiany wszystkich 20 referencji. Więc dla własnej wygody i komfortu konsumentów naszych bibliotek warto pomyśleć przy porządkowaniu klas a należy pamiętać, że SOLID a w szczególności S czyli Single Responsibility Principle generuje dużo więcej klas niż to zwykle bywa przy kodowaniu nie SOLIDnym.</p>
<p>Brak podobnych wpisów</p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/16/common-closure-principle-czyli-o-cos-porzadkowaniu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reuse Release Equivalence Principle czyli  dlaczego nie kopiujemy kodu</title>
		<link>http://www.benedykt.net/2012/05/15/reuse-release-equivalence-principle-czyli-dlaczego-nie-kopiujemy-kodu/</link>
		<comments>http://www.benedykt.net/2012/05/15/reuse-release-equivalence-principle-czyli-dlaczego-nie-kopiujemy-kodu/#comments</comments>
		<pubDate>Tue, 15 May 2012 10:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie podstawy]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=761</guid>
		<description><![CDATA[W poprzednich częściach przeszliśmy przez zasady SOLID. S – Single Responsibility Principle (oraz cz. 2) O – Open Close Principle (oraz cz. 2) L – Liskov Substitution Principle I – Inversion Segregation Principle D – Dependency Inversion Principle Słowo SOLID bardzo dobrze odzwierciedla to, do czego te zasady prowadzą czyli do budowania solidnego kodu. Przez [...]
Brak podobnych wpisów]]></description>
			<content:encoded><![CDATA[<p>W poprzednich częściach przeszliśmy przez zasady SOLID. </p>
<p>S – <a href="http://www.benedykt.net/2012/04/25/lekcja-jezyka-polskiego-w-programowaniu/">Single Responsibility Principle</a> (oraz <a href="http://www.benedykt.net/?p=651">cz. 2</a>)</p>
<p>O – <a href="http://www.benedykt.net/?p=738">Open Close Principle</a> (oraz <a href="http://www.benedykt.net/2012/05/10/klasyczne-naruszenie-open-close-principle/">cz. 2</a>)</p>
<p>L – <a href="http://www.benedykt.net/?p=715">Liskov Substitution Principle</a></p>
<p>I – <a href="http://www.benedykt.net/2012/05/07/interface-segregation-principle-czyli-interfejs-powinien-byc-jak-modelkaprzerazliwie-chudy/">Inversion Segregation Principle</a> </p>
<p>D – <a href="http://www.benedykt.net/?p=668">Dependency Inversion Principle</a> </p>
<p>Słowo SOLID bardzo dobrze odzwierciedla to, do czego te zasady prowadzą czyli do budowania solidnego kodu. Przez solidny kod rozumiem taki, który jest łatwy w modyfikacji i który szybko można dostosować do zmieniających się wymagań. Nie są to jednak wszystkie zasady programowania obiektowego, które warto znać i stosować. </p>
<p>Na tapetę bierzemy zatem Reuse Release Equivalence Principle czyli zasadę, która mówi, że kod, który chcemy ponownie wykorzystać, powinien być w paczce, czarnej skrzynce, która jest dostarczalnym modułem czyli po ludzku biblioteką czy też assembly (w .necie). </p>
<p>A jeszcze bardziej po ludzku, zasada ta mówi po prostu, że ponownie użycie kodu to nie jest skopiowanie klasy z jednego projektu do drugiego. Jeżeli chcemy użyć ponownie raz napisany kod to należy go wydzielić do biblioteki czy modułu, który później możemy użyć ponownie. </p>
<p>Takie podejście powoduje, że gdy autor oryginalnego kodu wprowadzi zmianę – w szczególności poprawi jakiś błąd – wówczas możemy łatwo korzystać z dobrodziejstw takich zmian pobierając nową wersję biblioteki. W zespołach korzystających z automatyzacji (Continious Integration/Delivery) nawet nic nie trzeba robić – build server zrobi za nas wszystko. </p>
<p>To co powyżej napisałem może wydawać się oczywistą oczywistością jednak niestety nie jest. Jest wielu programistów (serio!), którzy “ponowne użycie kodu” rozumieją jako kopiowanie z jednego pliku do innego pliku. Dzięki czemu odcinają się od jakiejkolwiek możliwości rozsądnej aktualizacji kodu poza spisaniem na kartce wszystkich takich kopii i regularnie przeglądanie repozytorium w poszukiwaniu zmian – <strong>POWODZENIA</strong></p>
<p>Zasada ta ma szczególne znaczenie w grupach, gdzie pracuje więcej niż jedna osoba lub gdy jedna osoba pracuje nad więcej niż jednym projektem – czyli praktycznie zawsze. </p>
<p>Jedyne ewentualne odstępstwo od tej zasady jakie widzę, to kopiowanie kodu, który jest podobny jednak logicznie posiadający inny kontekst.</p>
<p>Aby korzystać z dobrodziejstw zasady Reuse Release Equivalence Principle dobrze stosować się do wcześniejszych – tych z SOLID-a bo wyobraź sobie, że w metodzie CalculateInvoiceValue nagle ktoś zmieni obliczanie faktury na obliczanie różnicy pomiędzy dwiema datami. </p>
<p>Brak podobnych wpisów</p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/15/reuse-release-equivalence-principle-czyli-dlaczego-nie-kopiujemy-kodu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coś lekkiego na weekend</title>
		<link>http://www.benedykt.net/2012/05/12/cos-lekkiego-na-weekend/</link>
		<comments>http://www.benedykt.net/2012/05/12/cos-lekkiego-na-weekend/#comments</comments>
		<pubDate>Sat, 12 May 2012 08:00:12 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>
		<category><![CDATA[Wideo]]></category>
		<category><![CDATA[ted]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[wideo]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=579</guid>
		<description><![CDATA[Na weekend małe wideo. &#8222;Zwierzęta&#8221; z rurek Podobne wpisy: Coś lekkiego na weekend Coś na weekend Coś na weekend Coś lekkiego na sobotni poranek – Heineken vs damskie torebki Jak zamienić małe litery na duże lub duże litery na małe w programie Word 2007 &#8211; uzupełnienie
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/21/cos-lekkiego-na-weekend-2/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/04/28/cos-na-weekend/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/05/05/cos-na-weekend-2/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2009/01/10/cos-lekkiego-na-sobotni-poranek-%e2%80%93-heineken-vs-damskie-torebki/' rel='bookmark' title='Coś  lekkiego na sobotni poranek – Heineken vs damskie torebki'>Coś  lekkiego na sobotni poranek – Heineken vs damskie torebki</a></li>
<li><a href='http://www.benedykt.net/2008/04/08/jak-zamienic-male-litery-na-duze-lub-duze-litery-na-male-w-programie-word-2007-uzupelnienie/' rel='bookmark' title='Jak zamienić małe litery na duże lub duże litery na małe w programie Word 2007 &#8211; uzupełnienie'>Jak zamienić małe litery na duże lub duże litery na małe w programie Word 2007 &#8211; uzupełnienie</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Na weekend małe wideo. &#8222;Zwierzęta&#8221; z rurek <img src='http://www.benedykt.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<object width="526" height="374" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="bgColor" value="#ffffff" /><param name="flashvars" value="vu=http://video.ted.com/talk/stream/2007/Blank/TheoJansen_2007-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TheoJansen-2007.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=162&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=theo_jansen_creates_new_creatures;year=2007;theme=tales_of_invention;theme=animals_that_amaze;theme=inspired_by_nature;theme=evolution_s_genius;theme=art_unusual;theme=the_creative_spark;event=TED2007;tag=animals;tag=art;tag=arts;tag=biomechanics;tag=creativity;tag=demo;tag=design;tag=entertainment;tag=short+talk;tag=technology;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" /><param name="pluginspace" value="http://www.macromedia.com/go/getflashplayer" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="526" height="374" type="application/x-shockwave-flash" src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" bgColor="#ffffff" flashvars="vu=http://video.ted.com/talk/stream/2007/Blank/TheoJansen_2007-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TheoJansen-2007.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=162&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=theo_jansen_creates_new_creatures;year=2007;theme=tales_of_invention;theme=animals_that_amaze;theme=inspired_by_nature;theme=evolution_s_genius;theme=art_unusual;theme=the_creative_spark;event=TED2007;tag=animals;tag=art;tag=arts;tag=biomechanics;tag=creativity;tag=demo;tag=design;tag=entertainment;tag=short+talk;tag=technology;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" pluginspace="http://www.macromedia.com/go/getflashplayer" allowfullscreen="true" allowscriptaccess="always" /></object></p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/21/cos-lekkiego-na-weekend-2/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/04/28/cos-na-weekend/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/05/05/cos-na-weekend-2/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2009/01/10/cos-lekkiego-na-sobotni-poranek-%e2%80%93-heineken-vs-damskie-torebki/' rel='bookmark' title='Coś  lekkiego na sobotni poranek – Heineken vs damskie torebki'>Coś  lekkiego na sobotni poranek – Heineken vs damskie torebki</a></li>
<li><a href='http://www.benedykt.net/2008/04/08/jak-zamienic-male-litery-na-duze-lub-duze-litery-na-male-w-programie-word-2007-uzupelnienie/' rel='bookmark' title='Jak zamienić małe litery na duże lub duże litery na małe w programie Word 2007 &#8211; uzupełnienie'>Jak zamienić małe litery na duże lub duże litery na małe w programie Word 2007 &#8211; uzupełnienie</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/12/cos-lekkiego-na-weekend/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Klasyczne naruszenie Open Close Principle</title>
		<link>http://www.benedykt.net/2012/05/10/klasyczne-naruszenie-open-close-principle/</link>
		<comments>http://www.benedykt.net/2012/05/10/klasyczne-naruszenie-open-close-principle/#comments</comments>
		<pubDate>Thu, 10 May 2012 19:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie podstawy]]></category>
		<category><![CDATA[s.o.l.i.d]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=755</guid>
		<description><![CDATA[Bardzo lubię konstrukcję enum. Dzięki niej i wsparciu IDE mogę bardzo łatwo zautomatyzować sobie pracę. Po dodaniu nowej wartości w SomeEnum wystarczy tylko…. poprawić wszystkie kawałki kodu, które wykorzystują SomeEnum – w głównej mierze trzeba przeglądnąć wszystkie switche i kaskady ifów. Zamiast stosować Open Close Principle i np. wzorzec Visitor z każdym kolejnym dodaniem do [...]
Brak podobnych wpisów]]></description>
			<content:encoded><![CDATA[<p>Bardzo lubię konstrukcję enum. Dzięki niej i wsparciu IDE mogę bardzo łatwo zautomatyzować sobie pracę.</p>
<pre class="brush: csharp; title: ; notranslate">
public enum SomeEnum
{
    Dog,
    Cat,
    Lion
}

public class SomeAnimals
{
    public void Sounds(SomeAnimals animal)
    {
        switch (animal)
        {
            case SomeEnum.Cat :
                Console.WriteLine(&quot;Meow&quot;);
                break;
            case SomeEnum.Dog :
                Console.WriteLine(&quot;Wof&quot;);
                break;

               ...
         }
    }
}
</pre>
<p>Po dodaniu nowej wartości w SomeEnum wystarczy tylko…. poprawić wszystkie kawałki kodu, które wykorzystują SomeEnum – w głównej mierze trzeba przeglądnąć wszystkie switche i kaskady ifów. Zamiast stosować Open Close Principle i np. wzorzec Visitor z każdym kolejnym dodaniem do enuma miałem sporo pracy. Teraz coraz częściej dochodzę do wniosku, że enum mógł by nie istnieć. Wiele złego kodu by nie powstało. Czasem enum jest dobry jak w przypadku ustawiania klas do szyfrowania czy określania dostępu w FileStreamie ale pisząc kod częściej lepiej unikać ich niż z nich korzystać.</p>
<p>Brak podobnych wpisów</p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/10/klasyczne-naruszenie-open-close-principle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Open Close Principle czyli jak zarobić ale się nie narobić.</title>
		<link>http://www.benedykt.net/2012/05/09/open-close-principle-czyli-jak-zarobic-ale-sie-nie-narobic/</link>
		<comments>http://www.benedykt.net/2012/05/09/open-close-principle-czyli-jak-zarobic-ale-sie-nie-narobic/#comments</comments>
		<pubDate>Wed, 09 May 2012 21:00:05 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie podstawy]]></category>
		<category><![CDATA[s.o.l.i.d]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=738</guid>
		<description><![CDATA[Wyobraźmy sobie taką sytuację: jest sklep internetowy, podczas składania zamówienia system wylicza rabat – przy zamówieniach 500-1000 zł 5%, powyżej 1000 zł 10%, powyżej 5000 dodatkowo darmowa przesyłka. Brzmi znajomo? Napisane, przetestowane, zapłacone. Ale teraz klient (zleceniodawca/kierownik/project owner/właściciel tego sklepu) mówi, że chce dodać jeszcze jedną opcję: 30tego listopada darmowa przesyłka dla wszystkich (taki dzień [...]
Brak podobnych wpisów]]></description>
			<content:encoded><![CDATA[<p>Wyobraźmy sobie taką sytuację: jest sklep internetowy, podczas składania zamówienia system wylicza rabat – przy zamówieniach 500-1000 zł 5%, powyżej 1000 zł 10%, powyżej 5000 dodatkowo darmowa przesyłka. Brzmi znajomo?</p>
<pre class="brush: csharp; title: ; notranslate">
public double CalculateDiscount(IOrder order)
{

    if (order.Total &gt;= 500 &amp;&amp; order.Total &lt; 1000)
    {
        return order.Total*0.05;
    }
    if (order.Total &gt; 1000)
    {
        return order.Total*0.1;
    }

    if (order.Total &gt; 5000)
    {
        order.SippingFee = 0;
        return order.Total*0.1;
    }

    return 0;
}
</pre>
<p>Napisane, przetestowane, zapłacone. Ale teraz klient (zleceniodawca/kierownik/project owner/właściciel tego sklepu) mówi, że chce dodać jeszcze jedną opcję: 30tego listopada darmowa przesyłka dla wszystkich (<a href="http://www.dziendarmowejdostawy.pl/">taki dzień darmowej dostawy</a>). Nic trudnego dodamy trochę kodu:</p>
<pre class="brush: csharp; title: ; notranslate">
public double CalculateDiscount(IOrder order)
{

    if (order.Total &gt;= 500 &amp;&amp; order.Total &lt; 1000)
    {
        return order.Total*0.05;
    }
    if (order.Total &gt; 1000)
    {
        return order.Total*0.1;
    }

    if (DateTime.UtcNow.Month == 11 &amp;&amp; DateTime.UtcNow.Day == 30)
    {
        order.SippingFee = 0;
    }

    if (order.Total &gt; 5000)
    {
        order.SippingFee = 0;
        return order.Total*0.1;
    }

    return 0;
}
</pre>
<p>I miesiąc później nasz klient chce mieć obsługę kuponów rabatowych:</p>
<pre class="brush: csharp; title: ; notranslate">

...
if (order.HasCoupon &amp;&amp; CouponIsValid(order.Coupon))
{
    return order.Total*order.Coupon.Discount;
}
...
</pre>
<p>Kolejny miesiąc i kolejny pomysł – jakaś promocja w zakupach grupowych:</p>
<pre class="brush: csharp; title: ; notranslate">

// miejmy nadzieję że wcześniejszy kod pozwoli korzystać z wielu różnych kuponów
</pre>
<p>…. widać w jakim kierunku to idzie. Kod rośnie szybciej niż ciasto drożdżowe na kaloryferze i równie szybko co ryba na kaloryferze zaczyna pachnieć.</p>
<p>Na takie bolączki przychodzi Open Close Principle. Zamiast małymi kroczkami <a href="http://www.benedykt.net/2012/04/24/podstawy-programowania/">psuć kod i z każdą iteracją zwiększać złożoność przypadkową</a> , czyli tą złą, możemy zastosować Open Close Principle, która mówi: Klasa powinna być zamknięta na modyfikacje ale jednocześnie otwarta na rozszerzanie.</p>
<p>A gdyby tak nasza metoda wyglądała mniej więcej tak ?</p>
<pre class="brush: csharp; title: ; notranslate">
public double CalculateDiscount(IOrder order)
{
    var discounts = GetAllAvaliableDiscountsInPropperOrder();

    foreach (var discount in discounts)
    {
        discount.Recalculate(order);
    }

    return order.Discount;
}
</pre>
<p>Taki kod jak powyżej jest zamknięty na modyfikacje ale otwarty na rozszerzanie. Dodawanie kolejnego sposobu obliczania zniżki nie wymaga modyfikowania powyższego kodu. Co więcej, możemy zniżki ładować dynamicznie np. za pomocą MEF-a a przez to w zależności od klienta dystrybuować aplikacje z różnymi modelami obliczania zniżki &#8211; bez rekompilacji czy dziwnych, skomplikowanych konfiguratoró. Prawie pewne jest, że po 5-10 klientach zbuduje nam się pokaźna biblioteka <del>wymysłów</del> pomysłów, która zaspokoi 90% potrzeb przyszłych klientów.  Czyż nie jest to piękne? Każdy kolejny klient nie kosztuje nas praktycznie nic.</p>
<p>Brak podobnych wpisów</p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/09/open-close-principle-czyli-jak-zarobic-ale-sie-nie-narobic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O krytyce</title>
		<link>http://www.benedykt.net/2012/05/07/o-krytyce/</link>
		<comments>http://www.benedykt.net/2012/05/07/o-krytyce/#comments</comments>
		<pubDate>Mon, 07 May 2012 17:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=735</guid>
		<description><![CDATA[“Most humans seem to be much better at critiquing than creating. We can channel this wisely thru feedbacks for a greater good” Źródło: http://twitter.com/venkat_s/status/198771575573585920 Krytykowanie jest łatwe bo nie wymaga wiedzy i nie wymaga takiego wysiłku jak przy tworzeniu. Brak podobnych wpisów
Brak podobnych wpisów]]></description>
			<content:encoded><![CDATA[<p>“Most humans seem to be much better at critiquing than creating. We can channel this wisely thru feedbacks for a greater good”</p>
<p><em>Źródło:</em> <a href="http://twitter.com/venkat_s/status/198771575573585920">http://twitter.com/venkat_s/status/198771575573585920</a></p>
<p>Krytykowanie jest łatwe bo nie wymaga wiedzy i nie wymaga takiego wysiłku jak przy tworzeniu. </p>
<p>Brak podobnych wpisów</p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/07/o-krytyce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interface Segregation Principle czyli interfejs powinien być jak modelka&#8211;przeraźliwie chudy</title>
		<link>http://www.benedykt.net/2012/05/07/interface-segregation-principle-czyli-interfejs-powinien-byc-jak-modelkaprzerazliwie-chudy/</link>
		<comments>http://www.benedykt.net/2012/05/07/interface-segregation-principle-czyli-interfejs-powinien-byc-jak-modelkaprzerazliwie-chudy/#comments</comments>
		<pubDate>Mon, 07 May 2012 10:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie podstawy]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=732</guid>
		<description><![CDATA[Jestem fanem interfejsów jak to wcześniej już pisałem, zatem dzisiaj będzie temat łatwy i przyjemny o interfejsach właśnie. W sam raz na ciężki po długo weekendowy poniedziałek. Interface Segregation Principle mówi, że klient nie powinien być zmuszany do implementowania interfejsów, których nie używa. Z tego wynika, że interfejs powinien być minimalistyczny lub po prostu możliwie [...]
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/05/04/kwadrat-jest-prostokatem-czyli-liskov-substitution-principle-lsp/' rel='bookmark' title='Kwadrat jest prostokątem czyli Liskov Substitution Principle (LSP)'>Kwadrat jest prostokątem czyli Liskov Substitution Principle (LSP)</a></li>
<li><a href='http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/' rel='bookmark' title='Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego'>Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/' rel='bookmark' title='Architektura czyli jedna z najbardziej niedocenianych umiejętności'>Architektura czyli jedna z najbardziej niedocenianych umiejętności</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Jestem fanem interfejsów jak to wcześniej już pisałem, zatem dzisiaj będzie temat łatwy i przyjemny o interfejsach właśnie. W sam raz na ciężki po długo weekendowy poniedziałek.</p>
<p>Interface Segregation Principle mówi, że klient nie powinien być zmuszany do implementowania interfejsów, których nie używa. Z tego wynika, że interfejs powinien być minimalistyczny lub po prostu możliwie chudy. Idealnie by było, gdyby miał jedną metodę <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Uśmiech" src="http://www.benedykt.net/content/repository/2012/05/wlEmoticon-smile.png" /> a poważnie, można by tutaj parafrazować Single Responsibility Principle i powiedzieć, że interfejs powinien definiować jedną czynność (logiczną czynność – nie metodę/funkcję). </p>
<p>Dlaczego to jest ważne? Dlaczego wielkie grube interfejsy są nie fajne? Dlatego, że ktoś kto będzie musiał zaimplementować wielki barokowy interfejs najprawdopodobniej większość metod pozostawi pustych (lub z NotImplementedException) a zaimplementuje te, które są dla niego niezbędne. To znowu może prowadzić do dziwnych wyjątków i dziwnego działania aplikacji, jeśli taki “niedoimplementowany” obiekt zostanie ponownie użyty w innym miejscu. Wszak przy dużych systemach nikt nie czyta całego kodu każdego obiektu tylko go używa mając nadzieję, że jego nazwa i metody rzeczywiście robią to na co wskazują. Zatem nie wprowadzajmy siebie i innych w błąd i nie utrudniajmy sobie życia, twórzmy małe chude interfejsy, które reprezentują jedną spójną i logiczną czynność. </p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/05/04/kwadrat-jest-prostokatem-czyli-liskov-substitution-principle-lsp/' rel='bookmark' title='Kwadrat jest prostokątem czyli Liskov Substitution Principle (LSP)'>Kwadrat jest prostokątem czyli Liskov Substitution Principle (LSP)</a></li>
<li><a href='http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/' rel='bookmark' title='Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego'>Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/' rel='bookmark' title='Architektura czyli jedna z najbardziej niedocenianych umiejętności'>Architektura czyli jedna z najbardziej niedocenianych umiejętności</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/07/interface-segregation-principle-czyli-interfejs-powinien-byc-jak-modelkaprzerazliwie-chudy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Coś na weekend</title>
		<link>http://www.benedykt.net/2012/05/05/cos-na-weekend-2/</link>
		<comments>http://www.benedykt.net/2012/05/05/cos-na-weekend-2/#comments</comments>
		<pubDate>Sat, 05 May 2012 08:00:42 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>
		<category><![CDATA[Wideo]]></category>
		<category><![CDATA[ted]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[wideo]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=602</guid>
		<description><![CDATA[Oto film o &#8222;kompleksie boga&#8221; &#8211; czymś co dość często zauważam u programistów. Podobne wpisy: Coś na weekend Coś lekkiego na weekend
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/28/cos-na-weekend/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/04/21/cos-lekkiego-na-weekend-2/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Oto film o &#8222;kompleksie boga&#8221; &#8211; czymś co dość często zauważam u programistów.</p>
<p><object width="526" height="374" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="bgColor" value="#ffffff" /><param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011G/Blank/TimHarford_2011G-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TimHarford-2011G.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1190&amp;lang=pl&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=tim_harford;year=2011;theme=not_business_as_usual;theme=unconventional_explanations;theme=tales_of_invention;event=TEDGlobal+2011;tag=business;tag=creativity;tag=culture;tag=society;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" /><param name="pluginspace" value="http://www.macromedia.com/go/getflashplayer" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="526" height="374" type="application/x-shockwave-flash" src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" bgColor="#ffffff" flashvars="vu=http://video.ted.com/talk/stream/2011G/Blank/TimHarford_2011G-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TimHarford-2011G.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1190&amp;lang=pl&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=tim_harford;year=2011;theme=not_business_as_usual;theme=unconventional_explanations;theme=tales_of_invention;event=TEDGlobal+2011;tag=business;tag=creativity;tag=culture;tag=society;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" pluginspace="http://www.macromedia.com/go/getflashplayer" allowfullscreen="true" allowscriptaccess="always" /></object></p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/28/cos-na-weekend/' rel='bookmark' title='Coś na weekend'>Coś na weekend</a></li>
<li><a href='http://www.benedykt.net/2012/04/21/cos-lekkiego-na-weekend-2/' rel='bookmark' title='Coś lekkiego na weekend'>Coś lekkiego na weekend</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/05/cos-na-weekend-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kwadrat jest prostokątem czyli Liskov Substitution Principle (LSP)</title>
		<link>http://www.benedykt.net/2012/05/04/kwadrat-jest-prostokatem-czyli-liskov-substitution-principle-lsp/</link>
		<comments>http://www.benedykt.net/2012/05/04/kwadrat-jest-prostokatem-czyli-liskov-substitution-principle-lsp/#comments</comments>
		<pubDate>Fri, 04 May 2012 11:00:02 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[Pozostałe]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[Liskov Substitution Principle]]></category>
		<category><![CDATA[lsp]]></category>
		<category><![CDATA[programowanie podstawy]]></category>
		<category><![CDATA[s.o.l.i.d]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=715</guid>
		<description><![CDATA[Od młodego uczą nas, że każdy kwadrat jest prostokątem. Później uczymy się programować i zaczyna się tragedia. Matematycznie kwadrat jest specyficznym  przypadkiem prostokąta programistycznie już nie bardzo. Metoda ustawiająca szerokość wywołana dla prostokąta powinno ustawić jego szerokość a w przypadku kwadratu? W przypadku kwadratu oczekujemy, że ustawienie szerokości ustawi również wysokość. Zobaczmy zatem taki kod: [...]
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/' rel='bookmark' title='Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego'>Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/05/02/koncepcja-elastycznej-architektury/' rel='bookmark' title='Koncepcja elastycznej architektury'>Koncepcja elastycznej architektury</a></li>
<li><a href='http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/' rel='bookmark' title='Architektura czyli jedna z najbardziej niedocenianych umiejętności'>Architektura czyli jedna z najbardziej niedocenianych umiejętności</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Od młodego uczą nas, że każdy kwadrat jest prostokątem. Później uczymy się programować i zaczyna się tragedia. Matematycznie kwadrat jest specyficznym  przypadkiem prostokąta programistycznie już nie bardzo. Metoda ustawiająca szerokość wywołana dla <strong>prostokąta</strong> powinno ustawić jego szerokość a w przypadku <strong>kwadratu?</strong> W przypadku kwadratu oczekujemy, że ustawienie szerokości ustawi również wysokość. Zobaczmy zatem taki kod:</p>
<p>Prostokąt:</p>
<pre class="brush: csharp; title: ; notranslate">
        public class Rectangle
        {
            internal double _width;
            internal double _height;

            public double Width
            {
                get { return _width; }
                set { _width = value; }
            }

            public double Height
            {
                get { return _height; }
                set { _height = value; }
            }
        }
</pre>
<p>i kwadrat dziedziczący z prostokąta (wszak każdy kwadrat jest prostokątem):</p>
<pre class="brush: csharp; title: ; notranslate">
        public class Square : Rectangle
        {
            public new double Width
            {
                get { return _width; }
                set
                {
                    _width = value;
                    _height = value;
                }
            }
        }
</pre>
<p>Za pomocą operatora <strong>new</strong> nadpisaliśmy property Width tak aby pasowała do naszej teorii. Wszystko ładnie i pięknie &#8211; należało by jeszcze tak samo potraktować Height i już jest pięknie&#8230;.</p>
<p><a title="Barbara Liskov" href="http://en.wikipedia.org/wiki/Barbara_Liskov">Barbara Liskov</a> mówi, że nie. Powyższy kod jest książkowym przykładem na złamanie zasady podstawiania &#8211; Liskov Substitution Principle (LSP). Zasada ta mówi, że funkcje, które używają referencji do klas bazowych, muszą być wstanie użyć również klas dziedziczących z klasy bazowej bez dokładnej znajomości tych obiektów. Po ludzku oznacza to tyle, że funkcja powinna działać przewidywalnie bez względu na to czy jako parametr przekażemy klasę bazową czy też klasę, która po niej dziedziczy.</p>
<p>Dlaczego to jest ważne? Co zrobi poniższy kod?</p>
<pre class="brush: csharp; title: ; notranslate">

Rectangle rectangle = new Square();

rectangle.Width = 10;
</pre>
<p>Ustawiając szerokość spodziewałbym się, że wysokość również będzie 10 (w końcu mamy <strong>new Square()</strong>) ale nie&#8230;</p>
<p>Złamanie zasady LSP powoduje, że pośród innych powodujemy sporo trudnych do znalezienia błędów. Jeżeli chcemy pracować szybko i wygodnie to niestety lepiej nie łamać tej zasady a kwadraty i prostokąty nie powinny dziedziczyć z siebie a z bardziej ogólnego typu np.: kształt.</p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/' rel='bookmark' title='Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego'>Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/05/02/koncepcja-elastycznej-architektury/' rel='bookmark' title='Koncepcja elastycznej architektury'>Koncepcja elastycznej architektury</a></li>
<li><a href='http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/' rel='bookmark' title='Architektura czyli jedna z najbardziej niedocenianych umiejętności'>Architektura czyli jedna z najbardziej niedocenianych umiejętności</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/04/kwadrat-jest-prostokatem-czyli-liskov-substitution-principle-lsp/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Koncepcja elastycznej architektury</title>
		<link>http://www.benedykt.net/2012/05/02/koncepcja-elastycznej-architektury/</link>
		<comments>http://www.benedykt.net/2012/05/02/koncepcja-elastycznej-architektury/#comments</comments>
		<pubDate>Wed, 02 May 2012 10:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[architektura]]></category>
		<category><![CDATA[koncepcja]]></category>
		<category><![CDATA[programowanie podstawy]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=703</guid>
		<description><![CDATA[Wyobraźmy sobie, że cała aplikacja nad którą chcemy pracować zbudowana jest tak, że nie ma żadnych referencji do bazy danych, żadnych referencji związanych ze sposobem wyświetlania, żadnych okienek, stron www… nic. Tylko klasę, która mogła by wyglądać tak: Plus takiego podejścia to możliwość wymiany sposobu przechowywania danych na dowolne inne w bardzo krótkim czasie. Wzorzec [...]
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/' rel='bookmark' title='Architektura czyli jedna z najbardziej niedocenianych umiejętności'>Architektura czyli jedna z najbardziej niedocenianych umiejętności</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2010/11/18/konkurs-%e2%80%9edaj-sie-poznac%e2%80%9d-podsumowanie/' rel='bookmark' title='Konkurs „Daj się poznać” &#8211; podsumowanie'>Konkurs „Daj się poznać” &#8211; podsumowanie</a></li>
<li><a href='http://www.benedykt.net/2012/04/25/lekcja-jezyka-polskiego-w-programowaniu/' rel='bookmark' title='Lekcja języka polskiego w programowaniu'>Lekcja języka polskiego w programowaniu</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Wyobraźmy sobie, że cała aplikacja nad którą chcemy pracować zbudowana jest tak, że nie ma żadnych referencji do bazy danych, żadnych referencji związanych ze sposobem wyświetlania, żadnych okienek, stron www… nic. Tylko klasę, która mogła by wyglądać tak:</p>
<pre class="brush: csharp; title: ; notranslate">
    public class MyGreatApplication
    {
        public IAbout About()
        {
            // zwraca informacje na temat aplikacji
        }

        public void LoadData(IApplicationData applicationData)
        {
            // wczytanie danych aplikacji
        }

        public ICalculatedTax CalculateTax(IDataToCalculateFrom inputData)
        {
            // obliczenie podatku
        }

    }
</pre>
<p>Plus takiego podejścia to możliwość wymiany sposobu przechowywania danych na dowolne inne w bardzo krótkim czasie. Wzorzec IRepository ułatwi zbudowanie czegoś, co będzie działało jako wewnętrzne źródło danych, to co znajduje się po drugiej stronie nie ma już znaczenia dla samej aplikacji. Również sposób komunikacji ze światem nie ma zupełnie znaczenia. Najbardziej podstawowym mogą być testy jednostkowe. Może to być również aplikacja okienkowa np. WPF w połączeniu z MVVM lub ASP.NET MVC. Tak długo jak aplikacja będzie czysta od sposobu prezentacji oraz sposobu przechowywania danych, tak długo będziemy mogli elastycznie nimi żonglować.</p>
<p><a class="thickbox" href="http://www.benedykt.net/content/repository/2012/05/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="image" src="http://www.benedykt.net/content/repository/2012/05/image_thumb.png" alt="image" width="240" height="239" border="0" /></a></p>
<p>Podstawową wartością biznesową jest nasza aplikacja. To tutaj jest miejsce na logikę biznesową i na umieszczenie wszystkiego tego co chcemy aby aplikacja robiła. To jak dostarczymy tą aplikację użytkownikowi jest sprawą wtórną – dostarczymy w sensie jak użytkownik będzie konsumował nasz produkt.</p>
<p>Zwróć uwagę, że kilka lat temu większość aplikacji była dostępna w formie aplikacji okienkowej i taka forma konsumpcji była dobra dla większości użytkowników (wcześniej była to jedyna forma). Później pojawiło się coś co się nazywa “aplikacja webowa” (to dlaczego pojawiły się tutaj ząbki opiszę kiedyś w osobnej notce) a obecnie instalowana dedykowana aplikacja wraca do łask i ponownie zyskuje na popularności tyle tylko, że w formie aplikacji na platformy mobilne (iOS, Android, WP7). Wyobrażasz sobie koszty stworzenia aplikacji prawie od nowa przy pojawieniu się nowej technologii?</p>
<p>Proponowane wyżej podejście do budowania aplikacji pozwala bardzo niskim kosztem stworzyć nowy mechanizm konsumpcji naszej aplikacji – nawet co kilka miesięcy. Tak jak pisałem już wcześniej, bardzo niskim kosztem możemy zbudować na tym samym rdzeniu zarówno usługę sieciową jak i WPF-a, WP7 i formsy i Silverlighta – a może potrzebny jest gadget do Visty lub Windows 7? Za kilka miesięcy wyjdzie Windows 8 więc może warto zastanowić się nad wykorzystaniem nowych możliwości. Widzisz przewagę konkurencyjną? Zamiast przepisywać część aplikacji aby użyć nowej technologii i najzwyczajniej w świecie gonić konkurentów można zaoszczędzić czas inteligentnie budując kod.</p>
<p>Mam nadzieję, że zainspirowałem Cię wystarczająco aby zmienić ciągle niestety najpopularniejszy sposób pisania aplikacji.</p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/' rel='bookmark' title='Architektura czyli jedna z najbardziej niedocenianych umiejętności'>Architektura czyli jedna z najbardziej niedocenianych umiejętności</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2010/11/18/konkurs-%e2%80%9edaj-sie-poznac%e2%80%9d-podsumowanie/' rel='bookmark' title='Konkurs „Daj się poznać” &#8211; podsumowanie'>Konkurs „Daj się poznać” &#8211; podsumowanie</a></li>
<li><a href='http://www.benedykt.net/2012/04/25/lekcja-jezyka-polskiego-w-programowaniu/' rel='bookmark' title='Lekcja języka polskiego w programowaniu'>Lekcja języka polskiego w programowaniu</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/02/koncepcja-elastycznej-architektury/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Architektura czyli jedna z najbardziej niedocenianych umiejętności</title>
		<link>http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/</link>
		<comments>http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/#comments</comments>
		<pubDate>Tue, 01 May 2012 10:00:00 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie podstawy]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=697</guid>
		<description><![CDATA[… na szczęście nie przez wszystkich. Intencją niniejszej serii jest przedstawienie podstaw programowania w trochę inny sposób, dlatego mówiąc najbardziej niedoceniana umiejętność w domyśle tyczy się to początkujących. Starsi albo sami dotarli do odpowiedniej wiedzy albo życie ich nauczyło. Jak wyglądają pierwsze kroki w programowaniu? Po opanowaniu pętli for i foreach, ifów i caseów, Console.WriteLineów [...]
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2010/10/16/architektura-aplikacji-w-sposob-latwy-i-przyjemny/' rel='bookmark' title='Architektura aplikacji w sposób łatwy i przyjemny'>Architektura aplikacji w sposób łatwy i przyjemny</a></li>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/' rel='bookmark' title='Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego'>Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/25/lekcja-jezyka-polskiego-w-programowaniu/' rel='bookmark' title='Lekcja języka polskiego w programowaniu'>Lekcja języka polskiego w programowaniu</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>… na szczęście nie przez wszystkich. Intencją niniejszej serii jest przedstawienie podstaw programowania w trochę inny sposób, dlatego mówiąc najbardziej niedoceniana umiejętność w domyśle tyczy się to początkujących. Starsi albo sami dotarli do odpowiedniej wiedzy albo życie ich nauczyło.</p>
<p>Jak wyglądają pierwsze kroki w programowaniu? Po opanowaniu pętli for i foreach, ifów i caseów, Console.WriteLineów oraz tych wszystkich klas i obiektów i nie zapominając o polimofizmach wielu rzuca się w wir poznawania meandrów standardowo dostępnych bibliotek a potem przychodzi czas na biblioteki zewnętrzne. </p>
<h3>Idylla trwa do czasu…</h3>
<p>… kiedy coś trzeba zmienić a to coś to integralna część naszego <strong>Dzieła</strong>. Wtedy często okazuje się, że całość sypie się niczym domek z kart. </p>
<h3>Dobra architektura to taka, która pozwala na przesunięcie decyzji biznesowych w czasie*</h3>
<p>No właśnie. Dobra architektura pozwala na przesunięcie decyzji biznesowych w czasie, w dodatku możliwie jak najdłużej. A co rozumiem przez decyzje biznesowe tutaj? Są to decyzje typu czy używamy takiej czy innej bazy danych – a może nie użyjemy bazy danych. Czy użyjemy tej czy innej biblioteki do logowania. Czy nasza aplikacja ma byś dostępna przez www czy jako aplikacja desktopowa. Tego typu decyzji trzeba podejmować bardzo dużo w czasie tworzenia aplikacji, architektura, która pozwoli odwlec tą decyzję w czasie to dobra architektura.</p>
<h3>Ale dlaczego odwlekanie w czasie jest dobre?</h3>
<p>Odwlekanie w czasie jest dobre ponieważ wiele aplikacji, szczególnie tych dużych buduje się bardzo długo. Może się okazać, że np. biblioteka prezentacji danych, której używamy na początku pod koniec budowania aplikacji <strike>nie będzie już modna</strike> nie będzie już rozwijana. Nie znaczy oczywiście, że należy tworzyć aplikacje zupełnie bez bazy danych, bez logowania, bez interfejsu – znaczy to tyle, że należy tworzyć aplikację tak, aby te elementy były łatwo wymienialne. </p>
<p>Rober C. Martin, na którego się często powołuję i który jest moją inspiracją między innymi również do tego cyklu, popełnił (pośród wielu) aplikację <a href="http://fitnesse.org/">FitNesse</a>. Podczas jej tworzenia stwierdzili, że ponieważ jest to projekt webowy to muszą użyć MySql-a. Jednak zamiast natychmiast implementować na hura zapisywanie danych w MySql-u na początek stworzyli zapisywanie danych w formie tablicy haszującej zapisywanej do plików (w dużym uproszczeniu). Implementacja zapisu do bazy danych miało nastąpić później. Jednak z czasem okazało się, że zapis do bazy danych jest niepotrzebny a zapis do plików w zupełności wystarcza. </p>
<p>Co więcej, pojawił się po jakimś czasie człowiek, który potrzebował zapisu do bazy danych i architektura jaką stworzyli była tak elastyczna, że stworzenie kodu do zapisu do bazy danych wymagało jedynie jednego dnia pracy. Wyobraźcie sobie, że Wasze aplikacje można przepisać na inną bazę w jeden dzień… dla wielu, którzy nie zwracali uwagi na architekturę odpowiednio wcześnie dzisiaj nie mogą tego zrobić. Dodanie wsparcia dla nowej bazy wymaga u “Nich” dość często przepisanie całej aplikacji. <strong>Nie idźmy tą drogą</strong>. Coraz częściej klienci chcą aby aplikacją współpracowała z inną bazą niż tą z której my korzystamy (powodów mogą być dziesiątki). I choć baza danych nie jest tu wyjątkiem to jest to chyba jedno z częstszych ograniczeń&#160; z jakim muszą walczyć programiści. </p>
<p>*) podobnej treści tekst powiedział Robert C. Martin, niestety nie pamiętam dosłownego brzmienia – jednak to On jest inspiracją.</p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2010/10/16/architektura-aplikacji-w-sposob-latwy-i-przyjemny/' rel='bookmark' title='Architektura aplikacji w sposób łatwy i przyjemny'>Architektura aplikacji w sposób łatwy i przyjemny</a></li>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/' rel='bookmark' title='Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego'>Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/25/lekcja-jezyka-polskiego-w-programowaniu/' rel='bookmark' title='Lekcja języka polskiego w programowaniu'>Lekcja języka polskiego w programowaniu</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/05/01/architektura-czyli-jedna-z-najbardziej-niedocenianych-umiejetnosci/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dependency Inversion Principle &#8211; czyli co powinno zależeć od czego</title>
		<link>http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/</link>
		<comments>http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 11:00:08 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[Dependency]]></category>
		<category><![CDATA[Dependency Inversion Principle]]></category>
		<category><![CDATA[Inversion]]></category>
		<category><![CDATA[Principle]]></category>
		<category><![CDATA[s.o.l.i.d]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=668</guid>
		<description><![CDATA[Po Single Responsiblity Principle najważniejsza (moim zdaniem) zasada programowania obiektowego – Dependency Inversion Principle. Mówi ona, że obiekty powinny być zależne od abstrakcji a nie od konkretnej klasy. A po ludzku, w żadnej definicji funkcji i w żadnej deklaracji zmiennej nie powinniśmy używać nazwy klasy. Zamiast tego powinniśmy używać interfejsy albo klasy abstrakcyjne czyli zamiast [...]
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Po Single Responsiblity Principle najważniejsza (moim zdaniem) zasada programowania obiektowego – Dependency Inversion Principle. Mówi ona, że obiekty powinny być zależne od abstrakcji a nie od konkretnej klasy. A po ludzku, <strong>w żadnej definicji funkcji i w żadnej deklaracji zmiennej nie powinniśmy używać nazwy klasy.</strong> Zamiast tego powinniśmy używać interfejsy albo klasy abstrakcyjne czyli zamiast</p>
<pre class="brush: csharp; title: ; notranslate">
private Person _owner;

public bool ValidateOwner(Person personToValidate)
{
//.....
}
</pre>
<p>piszemy</p>
<pre class="brush: csharp; title: ; notranslate">

private IPerson _owner;

public bool ValidateOwner(IPerson personToValidate)
{

//.....

}
</pre>
<p>Co to daje? Ano daje to możliwość podmieniania poszczególnych elementów programu. Powyższy przykład nie jest zależny już od klasy Person a od interfejsu IPerson. To jaki obiekt będziemy validować, nas zupełnie nie obchodzi. Ważne, żeby implementował nasz interfejs.</p>
<p>Co więcej, powyższe podejście pozwala na łatwe wyciągnięcie jakiejś klasy do osobnej biblioteki i użycie jej w innym projekcie. Jeżeli nie stosowalibyśmy Dependency Inversion Principle, wówczas wyciągnięcie klasy do zewnętrznej biblioteki wymagało by wyciągnięcia również wszystkich użytych przez nas klas albo byli byśmy zmuszeni ciągnąć za sobą masę referencji. DIP ułatwia wyciągnięcie klasy i interfejsów, które nas interesują. Zazwyczaj już nie potrzebujemy żadnych dodatkowych referencji.</p>
<p>Pamiętając, że chcemy pracować wydajniej i lepiej to czy nie było by pięknie, gdyby jakąkolwiek funkcjonalność, logikę biznesową czy algorytm pisalibyśmy <strong>tylko raz</strong>? Jak wydajna byłaby organizacja gdyby każdy taki pojedynczy klocek powstawał tylko i wyłącznie raz? Okazuje się, że bardzo. Okazuje się, że tak pracujące zespoły mogą bardzo szybko i co najważniejsze niskim kosztem potrafią w szybkim tempie dostarczyć nowe wersje czy nawet nowe produkty w mgnieniu oka. Elastyczna architektura pozwala na taką pracę. To co daje .net pozwala z jednego kodu bazowego zrobić usługę w WCF-ie, aplikację konsolową, bardzo bogatą graficznie aplikację w WPF-ie, albo klasyczną Formsową, można szybko dostarczyć stronę www w MVC, aplikację na telefon (WP7) czy nawet w formie gry na XBox-a. To wszystko jest możliwe z jednego kodu bazowego przy odpowiedniej architekturze. .NET nie jest tutaj wyjątkiem. Podobne możliwości daje prawie każdy nowoczesny język programowania. W Javie mamy możliwość tworzenia apletów na strony www, aplikacji również graficznie bogatych, usługi, telefony, telewizory i wiele innych.</p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/' rel='bookmark' title='Single Responsibility Principle &#8211; ciąg dalszy'>Single Responsibility Principle &#8211; ciąg dalszy</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/04/30/dependency-inversion-principle-czyli-co-powinno-zalezec-od-czego/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Coś na weekend</title>
		<link>http://www.benedykt.net/2012/04/28/cos-na-weekend/</link>
		<comments>http://www.benedykt.net/2012/04/28/cos-na-weekend/#comments</comments>
		<pubDate>Sat, 28 Apr 2012 08:00:03 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>
		<category><![CDATA[Wideo]]></category>
		<category><![CDATA[ted]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[wideo]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=600</guid>
		<description><![CDATA[Na ten weekend filmik o tym jak to szkoła zabija kreatywność, trudno się z tym nie zgodzić. Brak podobnych wpisów
Brak podobnych wpisów]]></description>
			<content:encoded><![CDATA[<p>Na ten weekend filmik o tym jak to szkoła zabija kreatywność, trudno się z tym nie zgodzić.</p>
<p><object width="398" height="374" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="bgColor" value="#ffffff" /><param name="flashvars" value="vu=http://video.ted.com/talk/stream/2006/Blank/SirKenRobinson_2006-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SirKenRobinson-2006.embed_thumbnail.jpg&amp;vw=384&amp;vh=288&amp;ap=0&amp;ti=66&amp;lang=pl&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=ken_robinson_says_schools_kill_creativity;year=2006;theme=how_we_learn;theme=how_the_mind_works;theme=the_creative_spark;theme=master_storytellers;theme=bold_predictions_stern_warnings;event=TED2006;tag=children;tag=creativity;tag=culture;tag=dance;tag=education;tag=parenting;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" /><param name="pluginspace" value="http://www.macromedia.com/go/getflashplayer" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="398" height="374" type="application/x-shockwave-flash" src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" bgColor="#ffffff" flashvars="vu=http://video.ted.com/talk/stream/2006/Blank/SirKenRobinson_2006-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SirKenRobinson-2006.embed_thumbnail.jpg&amp;vw=384&amp;vh=288&amp;ap=0&amp;ti=66&amp;lang=pl&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=ken_robinson_says_schools_kill_creativity;year=2006;theme=how_we_learn;theme=how_the_mind_works;theme=the_creative_spark;theme=master_storytellers;theme=bold_predictions_stern_warnings;event=TED2006;tag=children;tag=creativity;tag=culture;tag=dance;tag=education;tag=parenting;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" pluginspace="http://www.macromedia.com/go/getflashplayer" allowfullscreen="true" allowscriptaccess="always" /></object></p>
<p>Brak podobnych wpisów</p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/04/28/cos-na-weekend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Single Responsibility Principle &#8211; ciąg dalszy</title>
		<link>http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/</link>
		<comments>http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 11:00:28 +0000</pubDate>
		<dc:creator>Arkadiusz Benedykt</dc:creator>
				<category><![CDATA[podstawy programowania]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[Principle]]></category>
		<category><![CDATA[programowanie podstawy]]></category>
		<category><![CDATA[Responsibility]]></category>
		<category><![CDATA[s.o.l.i.d]]></category>
		<category><![CDATA[Single]]></category>
		<category><![CDATA[Single Responsibility Principle]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://www.benedykt.net/?p=651</guid>
		<description><![CDATA[Wczoraj mówiliśmy o single responsibility principle (SRP) czyli o zasadzie pojedynczej odpowiedzialności. Jest to zasada, która moim zdaniem najwięcej zmienia w dotychczasowych przyzwyczajeniach programistycznych. Na początku jest trochę męcząca ponieważ zgodnie z nią w klasie nie powinniśmy tworzyć innych obiektów. Jak to? Nie mogę używać słowa kluczowego new? Nie mogę tworzyć obiektów? No właściwie to [...]
Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2009/01/08/pobieranie-windows-7-%e2%80%93-ciag-dalszy%e2%80%a6/' rel='bookmark' title='Pobieranie Windows 7 – ciąg dalszy…'>Pobieranie Windows 7 – ciąg dalszy…</a></li>
<li><a href='http://www.benedykt.net/2008/05/14/macbook-air-%e2%80%93-nie-dziekuje%e2%80%a6-historii-ciag-dalszy/' rel='bookmark' title='MacBook Air – Nie dziękuję… historii ciąg dalszy'>MacBook Air – Nie dziękuję… historii ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2010/09/07/nikon-d7000-czyli-nastepca-nikona-d90-%e2%80%93-historii-ciag-dalszy/' rel='bookmark' title='Nikon D7000 czyli następca Nikona D90 – historii ciąg dalszy'>Nikon D7000 czyli następca Nikona D90 – historii ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/25/lekcja-jezyka-polskiego-w-programowaniu/' rel='bookmark' title='Lekcja języka polskiego w programowaniu'>Lekcja języka polskiego w programowaniu</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Wczoraj mówiliśmy o single responsibility principle (SRP) czyli o zasadzie pojedynczej odpowiedzialności. Jest to zasada, która moim zdaniem najwięcej zmienia w dotychczasowych przyzwyczajeniach programistycznych. Na początku jest trochę męcząca ponieważ zgodnie z nią w klasie nie powinniśmy tworzyć innych obiektów.</p>
<h3>Jak to? Nie mogę używać słowa kluczowego new? Nie mogę tworzyć obiektów?</h3>
<p>No właściwie to nie. Jeżeli chcesz w klasie tworzyć obiekty to to już jest odpowiedzialność. Wiec klasa nic poza tworzeniem obiektów nie powinna robić. Ale przecież klasa która nie robi nic poza tworzeniem obiektów to fabryka. Wszystko jak najbardziej się zgadza. Fabryka – wzorzec kreacyjny (hm… a może znacie jakieś bardziej odpowiednie słowo) <a href="http://www.dofactory.com/Patterns/Patterns.aspx">gangu czterech</a>.</p>
<p>Wydaje Ci się trochę za dużo pisania w porównaniu do starego sposobu? No cóż, na początek (i bez wprawy) pewnie tak ale popatrzmy po co to robić, co to nam da i dlaczego pozwoli pisać lepsze programy.</p>
<p>Wczorajszy przykład z zapisywaniem obiektu mógł by wyglądać tak:</p>
<pre class="brush: csharp; title: ; notranslate">
            private readonly IFactory _factory;

            public Employee(IFactory factory)
            {

                _factory = factory;

            }

            public void Save()
            {

                var persistingObject = _factory.PersistingObject();

                persistingObject.Save(this);

            }
</pre>
<p>Klasa pracownik już nie musi implememntować metod do zapisywania &#8211; ma od tego &#8222;ludzi&#8221;</p>
<pre class="brush: csharp; title: ; notranslate">
            public interface ISomeInterfaceToSaveObject
            {
                void Save(IEmployee employee);
            }

            public interface IFactory
            {
                ISomeInterfaceToSaveObject  PersistingObject();
            }

            public class SaveToXml : ISomeInterfaceToSaveObject
            {
                public void Save(IEmployee employee)
                {
                    //zapis do xml-a
                }
            }

            public class SaveToTextFile : ISomeInterfaceToSaveObject
            {
                public void Save(IEmployee employee)
                {
                    // zapis do pliku tekstowego
                }
            }

            public class SaveToMsSql : ISomeInterfaceToSaveObject
            {
                public void Save(IEmployee employee)
                {
                    // zapisz do sql-a
                }
            }
</pre>
<p>Pozostaje napisać fabrykę, która zwraca odpowiedną klasę &#8211; zapisującą czy to do sql-a czy pliku tekstowego czy innego.</p>
<p>a tak może wyglądać użycie powyższego cuda.</p>
<pre class="brush: csharp; title: ; notranslate">
            IEmplyee someEmployee = GetEmployeeFromSomewhere;

            someEmployee.Save();
</pre>
<p>Plusem takiego rozwiązania jest to, że możemy praktycznie w locie podmieniać kod odpowiedzialny za zapisywanie. Bez względu gdzie i jak chcemy zapisywać, klasa Pracownik nie zmienia się. Co więcej klasa ta nawet nie posiada świadomości gdzie i jak zapisywać – nie ma takiej potrzeby.</p>
<p>Jest też druga strona medalu, klasy do zapisywania możemy łatwo wykorzystać czy to w innym miejscu aplikacji lub nawet w innej aplikacji. To znowu skutkuje, że raz dobrze napisany kawałek kodu może być użyty wielokrotnie. Jeśli znowu nie stosujemy się do SRP to próbując wykorzystać kod w innym miejscu musimy ciągnąć całkiem sporo referencji i zbędnego kodu ze sobą.</p>
<p>Jest jeszcze jeden plus korzystania z SRP. Jeżeli np. zapis danych do bazy danych mamy w osobnej klasie, to co stoi na przeszkodzie aby napisać nową wersję korzystającą z innej bazy? Zamiast MS SQL-a Oracle-a albo MySql-a zamiast Oracle-a a może cos z NoSql. SRP ułatwi nam takie zadanie i nawet jeśli nie potrzebujemy takiej możliwości dzisiaj to jaką mamy pewność, że za miesiąc lub za rok jakiś klient lub nie będzie chciał (lub potrzebował) aby nasza aplikacja działała na innej bazie danych?</p>
<p>No i ostatni argument, jeżeli dodamy do konstruktora jakiś parametr to w przypadku korzystania z fabryki mamy jedno (słownie JEDNO) miejsce do poprawy – fabryka. Jeśli natomiast używamy operatora <strong>new</strong> to tu, to tam, wówczas po dodaniu parametru do konstruktora otrzymujemy kilkadziesiąt lub nawet kilkaset miejsc gdzie ten parametr należy dopisać. Niestety najczęściej kończy się to tak, że w wielu miejscach zamiast parametru wpisujemy null, a potem w metodach, które się sypią pojawia się warunek if(….. != null) i tak literka za literką i linijka za linijką kod zaczyna zmieniać się w potwora.</p>
<p>Potwór ten powoli spowalnia nas (jak na krzywej z wpisu <a href="http://www.benedykt.net/2012/04/24/podstawy-programowania/">Podstawy programowania</a>) aby na końcu <span style="text-decoration: line-through;">urwać dupę</span>  zmusić do rozpoczęcia pracy od początku.</p>
<p>Podobne wpisy:<ol>
<li><a href='http://www.benedykt.net/2012/04/26/single-responsibility-principle/' rel='bookmark' title='Single Responsibility Principle'>Single Responsibility Principle</a></li>
<li><a href='http://www.benedykt.net/2009/01/08/pobieranie-windows-7-%e2%80%93-ciag-dalszy%e2%80%a6/' rel='bookmark' title='Pobieranie Windows 7 – ciąg dalszy…'>Pobieranie Windows 7 – ciąg dalszy…</a></li>
<li><a href='http://www.benedykt.net/2008/05/14/macbook-air-%e2%80%93-nie-dziekuje%e2%80%a6-historii-ciag-dalszy/' rel='bookmark' title='MacBook Air – Nie dziękuję… historii ciąg dalszy'>MacBook Air – Nie dziękuję… historii ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2010/09/07/nikon-d7000-czyli-nastepca-nikona-d90-%e2%80%93-historii-ciag-dalszy/' rel='bookmark' title='Nikon D7000 czyli następca Nikona D90 – historii ciąg dalszy'>Nikon D7000 czyli następca Nikona D90 – historii ciąg dalszy</a></li>
<li><a href='http://www.benedykt.net/2012/04/25/lekcja-jezyka-polskiego-w-programowaniu/' rel='bookmark' title='Lekcja języka polskiego w programowaniu'>Lekcja języka polskiego w programowaniu</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.benedykt.net/2012/04/27/single-responsibility-principle-ciag-dalszy/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

