<?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>Wzorce projektowe &#8211; Strona Szoguna</title>
	<atom:link href="https://szogun1987.pl/show/tag/wzorce-projektowe/feed/" rel="self" type="application/rss+xml" />
	<link>https://szogun1987.pl</link>
	<description>Jeszcze wstawię tutaj jakiś głęboki cytat</description>
	<lastBuildDate>Mon, 16 Sep 2019 20:02:50 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.3.2</generator>
	<item>
		<title>Niezmienny obiekt i budowniczy</title>
		<link>https://szogun1987.pl/show/niezmienny-obiekt-i-budowniczy/544/</link>
					<comments>https://szogun1987.pl/show/niezmienny-obiekt-i-budowniczy/544/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Mon, 16 Sep 2019 20:02:47 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=544</guid>

					<description><![CDATA[Niespodziewana zmiana stanu obiektu jest jedną z częstszych przyczyn błędów programistów.]]></description>
										<content:encoded><![CDATA[
<p>Niespodziewana zmiana stanu obiektu jest jedną z częstszych przyczyn błędów programistów. Dwoma, moim zdaniem, najczęstszymi przypadkami, w których zmiana może być zaskoczeniem są:</p>



<ul><li>Zmiana stanu obiektu gdy jest on przekazany do metody, zwłaszcza funkcji, której nazwa sugeruje że jest to bezpieczne</li><li>Zmiana stanu w wyniku współbieżnego dostępu do jednego obiektu</li></ul>



<span id="more-544"></span>



<p>Z pierwszym przypadkiem można sobie poradzić przez bardzo restrykcyjne pilnowanie innych członków zespołu na przeglądach kodu, to rozwiązanie zawodzi gdy korzystamy z zewnętrznych bibliotek.</p>



<p>Drugi problem nie występuje do puki nie współdzielimy obiektów między wątkami. Z taką sytuacją mamy do czynienia na początku rozwoju każdej aplikacji. Wystarczy jednak wprowadzić dodatkowy wątek (np. przez użycie niektórych metod asynchronicznych), albo dodać statyczne pole do kontrolera aby się na niego narazić.</p>



<p>Rozwiązaniem obu problemów są obiekty niezmienne, czyli takie, czyli takie których pola nie ulegają zmianie po utworzeniu. W C# i Javie aby stworzyć klasę, której instancje będą niezmienne należy zadeklarować wszystkie pola jako prywatne, ustawić je w konstruktorze i nie udostępnić żadnej metody je modyfikujące.</p>



<pre class="wp-block-code"><code>public class Address 
{
	private readonly string addressLine1;
	private readonly string addressLine2;
	private readonly string zipCode;
	private readonly string city;
	private readonly string stateArea;
	private readonly string country;

	public Address(string addressLine1, string addressLine2, string zipCode, string city, string stateArea, string country)
	{
		 this.addressLine1 = addressLine1;
		 this.addressLine2 = addressLine2;
		 this.zipCode = zipCode;
		 this.city = city;
		 this.stateArea = stateArea;
		 this.country = country;
	}

	public string AddressLine1 { get { return addressLine1; } }
	public string AddressLine2 { get { return addressLine2; } }
	public string ZipCode { get { return zipCode; } }
	public string City { get { return city; } }
	public string StateArea { get { return stateArea; } }
	public string Country { get { return country; } }
}</code></pre>



<h2 class="wp-block-heading">Problemy językowe</h2>



<p>Obiekty niezmienne są jednak słabo wspierane przez C# i Javę.</p>



<p>Pierwszym problemem są pola opcjonalne, domyślnie konstruktor musi ustawić wszystkie, więc albo użytkownik takiego obiektu musi przekazać wartości domyślne do takiego obiektu.</p>



<p>Jeżeli obiekt ma wiele pól to konstruktor staje się długi, a pomyłki związane z przekazaniem wartości do złego pola trudno zauważalne. Poniższy kod zawiera błąd, jednak wcale nie wygląda podejrzanie:</p>



<pre class="wp-block-code"><code>var address = new Address (
	"Konwaliowa 31/20",
	"20036",
	"Lublin",
	"",
	"",
	"");</code></pre>



<p>Jakimś rozwiązaniem jest zastosowanie przeciążeń konstruktora i wartości domyślnych dla jego parametrów, to rozwiązanie sprawdza się gdy klasa ma do 3-4 opcjonalnych pól, przy większej ilości szybko prowadzi do eksplozji kombinatorycznej ilości konstruktorów.</p>



<p>Problem staje się jeszcze bardziej dotkliwy gdy pojawia się potrzeba &#8222;zmodyfikowania&#8221; takiego obiektu, ponieważ obiektu nie da się zmienić, należy utworzyć nowy obiekt i przekazać do niego zarówno wartości zmienionych pól jak i tych, które zostają bez zmian.</p>



<pre class="wp-block-code"><code>var templateAddress = new Address(
	"Konwaliowa 31/20",
	"",
	"20036",
	"Lublin",
	"Lubelskie",
	"Polska");

var modifedAddress = new Address(
	"Konwaliowa 31/21",
	templateAddress.AddressLine2,
	templateAddress.ZipCode,
	templateAddress.City,
	templateAddress.StateArea,
	templateAddress.Country);</code></pre>


]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/niezmienny-obiekt-i-budowniczy/544/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Wrażenia po wizycie na 4Developers</title>
		<link>https://szogun1987.pl/show/wrazenia-po-wizycie-na-4developers/13/</link>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Mon, 04 Apr 2011 22:00:00 +0000</pubDate>
				<category><![CDATA[Konferencje]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=13</guid>

					<description><![CDATA[4 kwietnia odbyła się w Warszawie konferencja 4 Developers. Z racji że uczestniczyłem w niej w poprzednich latach postanowiłem że nie opuszczę jej także w tym roku.

Monika Koniecz]]></description>
										<content:encoded><![CDATA[<p>4 kwietnia odbyła się w Warszawie konferencja 4 Developers. Z racji że uczestniczyłem w niej w poprzednich latach postanowiłem że nie opuszczę jej także w tym roku.</p>
</p>
<p><b>Monika Konieczny &#8211; Gramification</b></p>
<p>Ciekawy temat, niezbyt ciekawe wykonanie. Wykład dotyczył kolejnej metody motywacji pracownik&oacute;w, w tym programist&oacute;w. Metoda ta polega na wprowadzeniu element&oacute;w gry podczas realizacji projektu, tak aby pracownicy czerpali radość z pracy. Jako przykład podany zostało rozgrywanie jakiejś gry w określonych odstępach czasu przy czym warunki początkowe gracza zależą od jego tygodniowych wynik&oacute;w (np. liczba kulek do Paintboala rozdawanych w comiesięcznej rozgrywce zależy od części projektu jaki wykonał pracownik). Według prelentki powinno się jednak szybko z gier indywidualnych przechodzić do zespołowych.  Og&oacute;lnie prezentację oceniam na dobry minus.</p>
</p>
<p><b>Greg Young &#8211; zapomnij o szczeg&oacute;łach liczy się efekt</b></p>
<p>O autorze tej prezentacji przeczytałem na blogu <a href="http://art-of-software.blogspot.com/2011/03/greg-young-w-polsce-uwaga-konkurs.html" target="_blank">Sławka Sob&oacute;tki</a>. Początkowo sądziłem że Sławek przesadza z m&oacute;wiąc że wysłuchanie Grega powoduje efekt &quot;I know kung-fu&quot;. Jednak p&oacute;źniej się przekonałem, że ma rację. Prelekcja była skierowana gł&oacute;wnie do programist&oacute;w Java, dlatego skrytykował on na samym początku używanie potężnych Framewok&oacute;w i bibliotek w projektach w kt&oacute;rych samo ich skonfigurowanie zajmuje więcej czasu niż wykonanie projektu, dodatkowo powodując całą masę dziwnych błęd&oacute;w. Jak to określił &quot;Frameworks are DSLs to converting XML into exceptions&quot;. Przez dłuższy czas było precyzowane stwierdzenie że klasa rozwiązań powinna być dobrana do klasy problemu. Że zupełnie inne rozwiązania powinno się stosować pisząc pamiętnik dla młodszej siostry, a inne tworząc aplikację nadzorującą działanie układu chłodzącego rdzeń elektrowni atomowej. Greg poruszył też zagadnienie zaciągania &quot;technologicznego długu&quot; podczas pracy nad projektem. Zastosował on sformuowania &quot;Dobry dług&quot; i &quot;Zły dług&quot; zaczerpnięte z publikacji Roberta Kiyosaki. Jedna z wypowiedzi m&oacute;wiła o zasadności (nie)stosowania test&oacute;w jednostkowych w projektach kt&oacute;re będą rozwijane nie dłużej niż 2-5 lat. Według programist&oacute;w pisanie test&oacute;w jest dobrym zachowaniem, jednak wg. kadry zarządzającej powoduje całą masę pracy, kt&oacute;ra kosztuje i zmniejsza dochodowość projektu. Greg bardzo trafniej por&oacute;wnał stosowanie Test&oacute;w jednostkowych do wzięcia na kredyt Lamborgini. Dla os&oacute;b dla kt&oacute;rych kluczowym elementem sukcesu jest wizerunek (np. gwiazdy sportu i filmowe, prezesi dużych przedsiębiorstw) jest to z pewnością inwestycja(&quot;Dobry dług&quot;), jednak dla przeciętnego zjadacza chleba koszty kredytu i utrzymania samochodu tej klasy przewyższają zar&oacute;wno potencjalny wzrost zarobk&oacute;w a nawet same zarobki(&quot;zły dług&quot;) i analogicznie stosowanie test&oacute;w jednostkowych ma sens w systemie bankowym gdzie pomyłka w algorytmie naliczania odsetek może kosztować zar&oacute;wno bank jak i producenta oprogramowania miliony złotych, jednak mija się z celem w aplikacji napisanej dla sklepu ze skarpetkami gdzie na upartego można w ciągu jednej nocy wprowadzić ponownie wszystkie wystawione i odebrane faktury z ostatniego miesiąca. Kolejną kwestią poruszoną przez Grega była kwestia wzorc&oacute;w projektowych i sensu ich stosowania. Skrytykował on podejście w kt&oacute;rym na siłę pr&oacute;buje się stosować wzorce projektowe (tylko po to by je stosować). Podkreślił jednak ich rolę w komunikacji między proramistami (podając jako przykład Fabrykę Fabryk Fabryk kt&oacute;rej opisanie bez znajomości wzorc&oacute;w zajęłoby więcej niż ten wpis na blogu).</p>
<p>Ciekawostką jest fakt iż Greg nie posiadał przygotowanej prezentacji także nawet nie włączył projektora.</p>
</p>
<p><b>Michał Gruchała &#8211; Architektura skalowalnych system&oacute;w Webowych</b></p>
<p>Prezentacja dotyczyła zagadnienia optymalizacji prostych serwis&oacute;w poddawanych bardzo dużemu obciążeniu (rzędu kilku milion&oacute;w wejść na godzinę). Z racji że nie zajmuje się tym zagadnieniem nie specjalnie słuchałem prelegenta.</p>
</p>
<p><b>Sławomir Sob&oacute;tka &#8211; Nowe bardziej racjonalne podejście do warstw</b></p>
<p>Prezentacja Sławka dotyczyła CQRS (Command Query Responsibility Segregation) kt&oacute;ra jest rozwinięciem Domain Driven Design. Podejście to zaleca oddzielenie serwisu zwracającego dane od serwisu je zmieniającego, co w dużym uproszczeniu oznacza rezygnację ze zwracania jakiś wartości przez metody kt&oacute;re dokonują jakichkolwiek zmian w składowanych danych, oraz rezygnację z modyfikowania danych w metodach dane zwracające. Sławek podobnie jak Greg zwracał uwagę na zastosowanie na dostosowanie rozwiązania do problemu oraz że Domain Driver Design ma zastosowanie gł&oacute;wnie przy pisaniu złożonych aplikacji biznesowych, z resztą wyraźnie widać było że Sławek przesiąkł myślą techniczną Greg&#039;a. Nie czuję się na siłach aby przekazać ideę całego wykładu ponieważ sam muszę ją zgłębić. </p>
</p>
<p><b>Stephan Hochd&ouml;erfer &#8211; DDD jeszcze raz ale inaczej</b></p>
<p>Podobnie jak pierwsza prelekcja Ciekawy temat nieciekawe wykonanie.</p>
</p>
<p><b>Greg Young &#8211; Uwolnij swoją domenę</b></p>
<p>Wykład ten można potraktować jako rozwinięcie wcześniejszego wykładu Grega i wykładu Sławka Sob&oacute;tki. Podobnie jak w przykładzie prezentacji Sławka nie podejmuje się analizy tego wystąpienia.</p>
</p>
<p>Og&oacute;lnie konferencję oceniam bardzo dobrze, a napewno lepiej niż zeszłoroczną. Lepiej dobrano lokalizację (Hotel w Poznaniu śmierdział według mnie komuną, a budynek Wyższej Szkoły Menagerskiej w Warszawie nawet jeżeli nie był nowy to był bardzo dobrze odnowiony), do zalet należy też zaliczyć fakt iż w tym roku posiłek był wliczony w koszt konferencji, oraz że nie zabrakło przystawek. Do wad lokalizacji należy zaliczyć dużą odległość od centrum Warszawy oraz brak ścieżki .Net oraz przedstawicieli firm Adobe, Microsoft i Oracle (może i byli ale ich widać nie było).</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP Cast patern</title>
		<link>https://szogun1987.pl/show/php-cast-patern/5/</link>
					<comments>https://szogun1987.pl/show/php-cast-patern/5/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Fri, 17 Sep 2010 22:00:00 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=5</guid>

					<description><![CDATA[Podczas prac w PHP(z którego na szczęście rzadko korzystam) bardzo wkurza mnie fakt iż nie jestem w stanie zdefiniować (przy pomocy PHP Doca) iż jakaś funkcja zwraca tablicę element?]]></description>
										<content:encoded><![CDATA[<p>Podczas prac w PHP(z kt&oacute;rego na szczęście rzadko korzystam) bardzo wkurza mnie fakt iż nie jestem w stanie zdefiniować (przy pomocy PHP Doca) iż jakaś funkcja zwraca tablicę element&oacute;w określonego typu. Przez co chcąc prze-iterować po wyniku takiej funkcji mam lekko utrudniony dostęp do p&oacute;l i metod danej klasy (uzupełnianie kodu Eclipse nie radzi sobie z taką sytuacją zupełnie). Dlatego jakiś czas temu wpadłem na pomysł dodawania do każdej (a właściwie prawie każdej) nowej klasy statycznej metody Cast:</p>
<div class="code">
<pre class="prettyprint lang-php">class&nbsp;Moja {

	/**
	 * 
	 * Pseudorzutowanie na typ
	 * @param mixed $item
	 * @return Moja
	 */
	public static function Cast($item) {
		return $item;
	}

	public function JakasFunkcja() {
		;
	}	
}
</pre>
</div>
<p>Teraz mogę sobie w kodzie spokojnie zwracać wyniku typu tablicowego i iterować po nim:</p>
<p><img decoding="async" src="http://static.szogun1987.pl/pictures/Code.jpg" alt="pictures/Code.jpg"/></p>
<p>W tej chwili jedyną wadą tego rozwiązania jaka mi przychodzi do głowy jest dodatkowa ilość generowanego kodu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/php-cast-patern/5/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
