<?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>The Explorer</title>
	<atom:link href="http://blog.wsoczynski.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.wsoczynski.pl</link>
	<description>Programming, designing, exploring</description>
	<lastBuildDate>Fri, 30 Mar 2012 07:27:42 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Gambling with Scala pt.1</title>
		<link>http://blog.wsoczynski.pl/2012/03/27/gambling-with-scala-pt-1/</link>
		<comments>http://blog.wsoczynski.pl/2012/03/27/gambling-with-scala-pt-1/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 10:57:45 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[akka]]></category>
		<category><![CDATA[gambling with scala]]></category>
		<category><![CDATA[play]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=723</guid>
		<description><![CDATA[For some time I was eager to write some sample application that will be using Scala and the Akka actors framework. The main problem was to pick up an example, that would make sense to apply both technologies. The idea for the example came to me all of sudden, when I was sitting with my [...]]]></description>
			<content:encoded><![CDATA[<p>For some time I was eager to write some sample application that will be using Scala and the Akka actors framework. The main problem was to pick up an example, that would make sense to apply both technologies. The idea for the example came to me all of sudden, when I was sitting with my friends after a soccer game. Usually, when you play a game, you are talking about it right after it ends, but this time it was different. My colleagues were talking about poker !<span id="more-723"></span>When I heard their talk, I was enlightened ! I decided to write a sample application similar to the on-line poker sites like <a href="http://pl.partypoker.com/">PartyPoker.com</a>.</p>
<p>Before I start coding, I will outline my idea for the application:</p>
<ol>
<li>the application will be written in Scala</li>
<li>it will be implementing the simplest poker flavor &#8211; the five-card draw with 24 cards</li>
<li>there will be 4 player limit for each game</li>
<li>it will have an HTML front-end</li>
<li>the Akka actors library will be used</li>
<li>the Play! framework will be used</li>
</ol>
<p>The architecture design will be as follows:</p>
<p>The application will be divided into two tiers:</p>
<ul>
<li>Tier 1 &#8211; will be based on the PLAY! framework and will be responsible for rendering the UI</li>
<li>Tier 2 &#8211; will be the actual game engine</li>
<li>the communication between T1 and T2 will be handled by the Akka actors library</li>
</ul>
<p>Before starting the development, we must set up the environment. To set up the environment, we need to:</p>
<ol>
<li>download and install the <a href="http://typesafe.com/stack/download">Typesafe 2.0 stack</a></li>
<li>download and install the latest <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK6</a> and add the Java bin directory to the path</li>
<li>you may need also a Scala IDE, I&#8217;am personally using the <a href="http://scala-ide.org/">Scala IDE for Eclipse</a></li>
</ol>
<p>The development will start from the T1. To create a Play! Framework application one must:</p>
<ol>
<li>open the console, <em>cd</em> to a suitable location and execute: <em>g8 typesafehub/play-scala</em></li>
<li>you will be prompted to enter the application name after the sources download is finished, type &#8222;poker&#8221;</li>
<li>after the process is finished <em>cd</em> to the poker directory and type <em>sbt</em></li>
</ol>
<p>The SBT (Simple Build Tool) is a console tool that will help us to manage the project. To start the application, type <em>run</em>. The application will be started and it is accessible under localhost:9000. More options for the sbt play console are available under the <em>help play</em> command.</p>
<p>The real coding will start from pt.2, so stay tuned <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2012/03/27/gambling-with-scala-pt-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wiedz, że coś się dzieje&#8230;</title>
		<link>http://blog.wsoczynski.pl/2012/03/21/wiedz-ze-cos-sie-dzieje/</link>
		<comments>http://blog.wsoczynski.pl/2012/03/21/wiedz-ze-cos-sie-dzieje/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 12:59:20 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[architektura]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=633</guid>
		<description><![CDATA[Ostatnimi czasy, mam okazję tworzyć dość duże ilości testów jednostkowych. Zwykle tworze je do cudzego kodu, co pozwala mi w pewnym sensie ocenić jego jakość. Zapytacie może, jak proces pisania testów jednostkowych do istniejącego kodu pozwala ocenić jego jakość ? Otóż, pewna stara programistyczna fama głosi, że gdy kod jest łatwo testowalny, to prawdopodobnie jego [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnimi czasy, mam okazję tworzyć dość duże ilości testów jednostkowych. Zwykle tworze je do cudzego kodu, co pozwala mi w pewnym sensie ocenić jego jakość. Zapytacie może, jak proces pisania testów jednostkowych do istniejącego kodu pozwala ocenić jego jakość ?</p>
<p><span id="more-633"></span>Otóż, pewna stara programistyczna fama głosi, że gdy kod jest łatwo testowalny, to prawdopodobnie jego jakość, a przynajmniej architektura będzie wysokiej jakości. Automatycznie na myśl przychodzi takie proste rozwiązanie, że skoro kod ma być łatwo testowalny, to najlepiej by było zacząć jego tworzenie od napisania testów. Takie podejście nazywa się TDD (Test Driven Development). Pewnie wielu z Was słyszało o takim podejściu, natomiast jeżeli pracujecie w typowej firmie wytwarzającej &#8222;stronki&#8221;, to pewnie nie mieliście wielu okazji by zastosować takie podejście.</p>
<p>Oczywiście nie koniecznie jest to grzech &#8211; w prostych projektach zastosowanie TDD może być dyskusyjne ze względu na narzut czasowy jaki generuje. Znając jednak życie, prosty projekt zwykle przeradza się w projekt skomplikowany, którego skali nikt nie przewidział.</p>
<p>Abstrahując jednak od TDD, chciałbym się podzielić z Wami, moimi spostrzeżeniami na temat typowych &#8222;wzorców&#8221; w kodzie, które znacząco obniżają jego testowalność. Przy okazji zaproponuje sposoby ich rozwiązania poprzez refaktoring kodu oraz omówię konsekwencje jakie niosą za sobą poszczególne antypatterny.</p>
<p>Tak więc, jeżeli spotkasz jeden z podanych poniżej przypadków &#8211; wiedz, że coś się dzieje <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<ol>
<li>Testując dany obiekt sprawdzam jego stan po wywołaniu danej metody:</li>
<li>Testując dany obiekt tworzymy mocki obiektów od których jest zależny w sposób łańcuchowy</li>
<li>Testując dany obiekt łapiemy się na tym, że testując metodę publiczną w istocie chcielibyśmy przetestować metody prywatne z których ona korzysta</li>
</ol>
<p>Kilka przykładów kodu, żeby było wiadomo o co chodzi:</p>
<p>Przykład nr. 1:</p>
<div id="gist-2146039" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">Bar</span><span class="o">(</span><span class="k">var</span> <span class="n">i</span><span class="k">:</span> <span class="kt">Int</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'><span class="o">}</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'><span class="k">class</span> <span class="nc">TestSubject1</span> <span class="o">{</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">doFoo</span><span class="o">(</span><span class="n">bar</span><span class="k">:</span> <span class="kt">Bar</span><span class="o">){</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">bar</span><span class="o">.</span><span class="n">i</span> <span class="k">=</span> <span class="mi">10</span></div><div class='line' id='LC9'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC10'>&nbsp;&nbsp;</div><div class='line' id='LC11'><span class="o">}</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'><span class="k">def</span> <span class="n">testCase1</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">bar</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Bar</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">testedObject</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TestSubject1</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">testedObject</span><span class="o">.</span><span class="n">doFoo</span><span class="o">(</span><span class="n">bar</span><span class="o">)</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">bar</span><span class="o">.</span><span class="n">i</span> <span class="o">==</span> <span class="mi">10</span><span class="o">){</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;true&quot;</span><span class="o">)</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span> <span class="k">else</span> <span class="o">{</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;false&quot;</span><span class="o">)</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC24'>&nbsp;&nbsp;<span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2146039/7d69ca94d9c48c92d20b9c4fd538dcc0cd50a199/gistfile1.scala" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2146039#file_gistfile1.scala" style="float:right;margin-right:10px;color:#666">gistfile1.scala</a>
            <a href="https://gist.github.com/2146039">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Mamy zdefiniowane dwie klasy &#8211; Bar, która ma property &#8222;i&#8221; oraz klasę TestSubject1 która jest testowana przy użyciu funkcji testCase1. Co jest złego w tego rodzaju kodzie ? Przede wszystkim następuje niejawna manipulacja obiektem klasy Bar. Poza tym, jako, że metoda ma typ void (w tym przypadku w Scali jest to Unit), programista, który chce użyć takiego kodu, tak naprawdę nie wie jaki jest efekt jego działania. Kod po refaktoringu:</p>
<div id="gist-2146098" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">TestCase1refactored</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;</div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">doFoo</span><span class="o">(</span><span class="n">bar</span><span class="k">:</span> <span class="kt">Bar</span><span class="o">)</span><span class="k">:</span> <span class="kt">Bar</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">result</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Bar</span><span class="o">(</span><span class="n">bar</span><span class="o">.</span><span class="n">i</span> <span class="o">+</span> <span class="mi">10</span><span class="o">)</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">result</span></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC7'>&nbsp;&nbsp;</div><div class='line' id='LC8'><span class="o">}</span></div><div class='line' id='LC9'><br/></div><div class='line' id='LC10'><span class="k">def</span> <span class="n">testCase1refactored</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">bar</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Bar</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">testedObject</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TestSubject1refactored</span><span class="o">()</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">result</span> <span class="k">=</span> <span class="n">testedObject</span><span class="o">.</span><span class="n">doFoo</span><span class="o">(</span><span class="n">bar</span><span class="o">)</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="n">i</span> <span class="o">==</span> <span class="mi">10</span><span class="o">){</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;true&quot;</span><span class="o">)</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span> <span class="k">else</span> <span class="o">{</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;false&quot;</span><span class="o">)</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC21'>&nbsp;&nbsp;<span class="o">}</span> </div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2146098/e4eb7f18c776a0d06806b7c4875d4e8d35e369d4/gistfile1.scala" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2146098#file_gistfile1.scala" style="float:right;margin-right:10px;color:#666">gistfile1.scala</a>
            <a href="https://gist.github.com/2146098">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Jak widać, metoda po refaktoringu zwraca jakąś konkretną wartość, poza tym zamiast zmieniać stan obiektu, tworze nowy ze zmienioną wartością, dzięki czemu unikam modyfikowania globalnego stanu.</p>
<p>Przykład nr.2:</p>
<div id="gist-2146191" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">Bar</span><span class="o">(</span><span class="k">var</span> <span class="n">i</span><span class="k">:</span> <span class="kt">Int</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;</div><div class='line' id='LC3'><span class="o">}</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'><span class="k">class</span> <span class="nc">Baz</span><span class="o">(</span><span class="n">bar</span><span class="k">:</span> <span class="kt">Bar</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="k">var</span> <span class="n">barProperty</span> <span class="k">=</span> <span class="n">bar</span></div><div class='line' id='LC7'><span class="o">}</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'><span class="k">class</span> <span class="nc">TestSubject2</span> <span class="o">{</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">doFoo</span><span class="o">(</span><span class="n">baz</span><span class="k">:</span> <span class="kt">Baz</span><span class="o">)</span><span class="k">:</span><span class="kt">Int</span> <span class="o">={</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">someUsefulValue</span> <span class="k">=</span> <span class="n">baz</span><span class="o">.</span><span class="n">barProperty</span><span class="o">.</span><span class="n">i</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">doRealyFoo</span><span class="o">(</span><span class="n">someUsefulValue</span><span class="o">)</span></div><div class='line' id='LC14'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC15'>&nbsp;&nbsp;</div><div class='line' id='LC16'>&nbsp;&nbsp;<span class="k">private</span> <span class="k">def</span> <span class="n">doRealyFoo</span><span class="o">(</span><span class="n">input</span><span class="k">:</span> <span class="kt">Int</span><span class="o">)</span><span class="k">:</span><span class="kt">Int</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">input</span> <span class="o">+</span> <span class="mi">10</span></div><div class='line' id='LC18'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC19'>&nbsp;&nbsp;</div><div class='line' id='LC20'><span class="o">}</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'><span class="k">def</span> <span class="n">testCase2</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">bar</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Bar</span><span class="o">(</span><span class="mi">10</span><span class="o">)</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">baz</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Baz</span><span class="o">(</span><span class="n">bar</span><span class="o">)</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">testedObject</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TestCase2</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">result</span> <span class="k">=</span> <span class="n">testedObject</span><span class="o">.</span><span class="n">doFoo</span><span class="o">(</span><span class="n">baz</span><span class="o">)</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">20</span><span class="o">){</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;true&quot;</span><span class="o">)</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span> <span class="k">else</span> <span class="o">{</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;false&quot;</span><span class="o">)</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC34'>&nbsp;&nbsp;<span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2146191/8a9f6c2fd6c7a3890227c1d320576ff78b8d066c/gistfile1.scala" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2146191#file_gistfile1.scala" style="float:right;margin-right:10px;color:#666">gistfile1.scala</a>
            <a href="https://gist.github.com/2146191">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>W kolejnym przykładzie, klasa TestSubject2 wyłuskuje wartość &#8222;i&#8221; poprzez zawołanie kilku (widziałem nawet kilkanaście) getterów w łańcuchu, nie muszę oczywiście mówić jak utrudnia to testowanie &#8211; należy po kolei zamockować i ustawić obiekty zwracane przez każdy z getterów, co może zająć wiele linii kodu, jest irytujące i bardzo wk****jące <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Oczywiście taki kod jest jawnym pogwałceniem zasady enkapsulacji i ukrywania wewnętrznej implementacji. Na szczęście jest na to proste rozwiązanie:</p>
<div id="gist-2146273" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">BazRefactored</span><span class="o">(</span><span class="n">bar</span><span class="k">:</span> <span class="kt">Bar</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">doRealyFoo</span><span class="o">(</span><span class="n">input</span><span class="k">:</span> <span class="kt">Int</span><span class="o">)</span><span class="k">:</span><span class="kt">Int</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">bar</span><span class="o">.</span><span class="n">i</span> <span class="o">+</span> <span class="n">input</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC5'><span class="o">}</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'><span class="k">class</span> <span class="nc">BazRefactoredMock</span> <span class="k">extends</span> <span class="nc">BazRefactored</span><span class="o">(</span><span class="k">new</span> <span class="nc">Bar</span><span class="o">(</span><span class="mi">10</span><span class="o">))</span> <span class="o">{</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'><span class="o">}</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'><span class="k">class</span> <span class="nc">TestSubject2refactored</span> <span class="o">{</span></div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">doFoo</span><span class="o">(</span><span class="n">baz</span><span class="k">:</span> <span class="kt">BazRefactored</span><span class="o">)</span><span class="k">:</span><span class="kt">Int</span> <span class="o">={</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">result</span> <span class="k">=</span> <span class="n">baz</span><span class="o">.</span><span class="n">doRealyFoo</span><span class="o">(</span><span class="mi">10</span><span class="o">)</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">result</span></div><div class='line' id='LC15'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC16'><span class="o">}</span></div><div class='line' id='LC17'><br/></div><div class='line' id='LC18'><span class="k">def</span> <span class="n">testCase2refactored</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">baz</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">BazRefactoredMock</span><span class="o">;</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">testedObject</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TestSubject2refactored</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">result</span> <span class="k">=</span> <span class="n">testedObject</span><span class="o">.</span><span class="n">doFoo</span><span class="o">(</span><span class="n">baz</span><span class="o">)</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">20</span><span class="o">){</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;true&quot;</span><span class="o">)</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span> <span class="k">else</span> <span class="o">{</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;false&quot;</span><span class="o">)</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC29'>&nbsp;&nbsp;<span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2146273/9059f773ea64f9c08ffb969a4f9ed06d0382f5b6/gistfile1.scala" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2146273#file_gistfile1.scala" style="float:right;margin-right:10px;color:#666">gistfile1.scala</a>
            <a href="https://gist.github.com/2146273">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>W powyższym kodzie przenieśliśmy metodę roboczą &#8222;doRealyFoo&#8221; do klasy na której tak naprawdę pracuje. Dzięki temu, z perspektywy klasy TestSubject2 nie interesują nas w ogóle &#8222;wnętrzności&#8221; klasy Baz, co zwalnia nas z łańcuchowego mockowania dziesiątek obiektów.</p>
<p>Czas na ostatni przypadek:</p>
<div id="gist-2146605" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">TestSubject3</span> <span class="o">{</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">val</span> <span class="n">prop1</span> <span class="k">=</span> <span class="mi">1</span><span class="o">;</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="k">val</span> <span class="n">prop2</span> <span class="k">=</span> <span class="mi">2</span><span class="o">;</span></div><div class='line' id='LC5'>&nbsp;&nbsp;</div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">doFoo</span><span class="o">()</span><span class="k">:</span><span class="kt">Boolean</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">someText</span> <span class="k">=</span> <span class="n">doFoo1</span><span class="o">();</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">textToSend</span> <span class="k">=</span> <span class="n">doFoo2</span><span class="o">(</span><span class="n">someText</span><span class="o">);</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">callSomeWebService</span><span class="o">(</span><span class="n">textToSend</span><span class="o">);</span></div><div class='line' id='LC11'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC12'>&nbsp;&nbsp;</div><div class='line' id='LC13'>&nbsp;&nbsp;<span class="k">protected</span> <span class="k">def</span> <span class="n">doFoo1</span><span class="o">()</span><span class="k">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="s">&quot;some complicated logic&quot;</span> <span class="o">+</span> <span class="n">prop1</span></div><div class='line' id='LC15'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC16'>&nbsp;&nbsp;</div><div class='line' id='LC17'>&nbsp;&nbsp;<span class="k">protected</span> <span class="k">def</span> <span class="n">doFoo2</span><span class="o">(</span><span class="n">input</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">input</span> <span class="o">+</span> <span class="s">&quot; more very complicated logic &quot;</span> <span class="o">+</span> <span class="n">prop2</span></div><div class='line' id='LC19'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC20'>&nbsp;&nbsp;</div><div class='line' id='LC21'>&nbsp;&nbsp;<span class="k">protected</span> <span class="k">def</span> <span class="n">callSomeWebService</span><span class="o">(</span><span class="n">textToSend</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">Boolean</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="kc">true</span><span class="o">;</span></div><div class='line' id='LC23'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC24'><span class="o">}</span></div><div class='line' id='LC25'><br/></div><div class='line' id='LC26'><span class="k">def</span> <span class="n">testCase3</span><span class="o">(){</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">testSubject</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TestCase3</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">testSubject</span><span class="o">.</span><span class="n">doFoo1</span><span class="o">()</span> <span class="o">==</span> <span class="s">&quot;some complicated logic1&quot;</span><span class="o">){</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">testSubject</span><span class="o">.</span><span class="n">doFoo2</span><span class="o">(</span><span class="s">&quot;some complicated logic1&quot;</span><span class="o">)</span> <span class="o">==</span> <span class="s">&quot;some complicated logic1 more very complicated logic 2&quot;</span><span class="o">){</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">testSubject</span><span class="o">.</span><span class="n">callSomeWebService</span><span class="o">(</span><span class="s">&quot;aaa&quot;</span><span class="o">)</span> <span class="o">==</span> <span class="kc">true</span><span class="o">){</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;true&quot;</span><span class="o">)</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;false&quot;</span><span class="o">)</span></div><div class='line' id='LC38'>&nbsp;&nbsp;<span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2146605/0ddd28f66777a94d3bf792b1d456fbb6f033acbf/gistfile1.scala" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2146605#file_gistfile1.scala" style="float:right;margin-right:10px;color:#666">gistfile1.scala</a>
            <a href="https://gist.github.com/2146605">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Mamy to kilka ciekawych rzeczy &#8211; metodę publiczną, która zwraca nam true/false w zależności od wyniku interakcji z webservice&#8217;m, oraz kilka metod oznaczonych jako protected &#8211; przygotowujących dane do wysłania do webservice&#8217;u. Dlaczego w ogóle potrzebujemy testować metody &#8222;doFoo1&#8243; oraz &#8222;doFoo2&#8243; ? Wynika to z faktu, że są one tak naprawdę głównym koniem roboczym tej publicznej metody. Gdyby metoda &#8222;callSomeWebService&#8221; wywoływała zamockowany webservice, który zawsze zwraca true, to tak naprawdę  nie jesteśmy w stanie jej sensownie przetestować. Oczywiście możemy je przetestować tak jak jest to pokazane w powyższym przykładzie &#8211; poprzez ustawienie modyfikatora dostępu protected. Nie jest to jednak rozwiązanie eleganckie, głównie dlatego, że wymaga naszej wiedzy o szczegółach implementacji metody &#8222;doFoo&#8221;.</p>
<p>Można to jednak bardzo łatwo zmienić:</p>
<div id="gist-2146704" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">TestSubject3refactored</span><span class="o">(</span><span class="n">doFoo1</span><span class="k">:</span> <span class="kt">DoFoo1</span><span class="o">,</span> <span class="n">doFoo2</span><span class="k">:</span> <span class="kt">DoFoo2</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">val</span> <span class="n">prop1</span> <span class="k">=</span> <span class="mi">1</span><span class="o">;</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="k">val</span> <span class="n">prop2</span> <span class="k">=</span> <span class="mi">2</span><span class="o">;</span></div><div class='line' id='LC5'>&nbsp;&nbsp;</div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">doFoo</span><span class="o">()</span><span class="k">:</span><span class="kt">Boolean</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">someText</span> <span class="k">=</span> <span class="n">doFoo1</span><span class="o">.</span><span class="n">doFoo1</span><span class="o">(</span><span class="n">prop1</span><span class="o">)</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">textToSend</span> <span class="k">=</span> <span class="n">doFoo2</span><span class="o">.</span><span class="n">doFoo2</span><span class="o">(</span><span class="n">someText</span><span class="o">,</span> <span class="n">prop2</span><span class="o">)</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">callSomeWebService</span><span class="o">(</span><span class="n">textToSend</span><span class="o">)</span></div><div class='line' id='LC11'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC12'>&nbsp;&nbsp;</div><div class='line' id='LC13'>&nbsp;&nbsp;<span class="k">private</span> <span class="k">def</span> <span class="n">callSomeWebService</span><span class="o">(</span><span class="n">textToSend</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">Boolean</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="kc">true</span><span class="o">;</span></div><div class='line' id='LC15'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC16'><span class="o">}</span></div><div class='line' id='LC17'><br/></div><div class='line' id='LC18'><span class="k">def</span> <span class="n">testCase3refactored</span><span class="o">(){</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">doFoo1</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">DoFoo1</span><span class="o">;</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">doFoo2</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">DoFoo2</span><span class="o">;</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">testSubject</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">TestSubject3refactored</span><span class="o">(</span><span class="n">doFoo1</span><span class="o">,</span><span class="n">doFoo2</span><span class="o">)</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(</span><span class="n">testSubject</span><span class="o">.</span><span class="n">doFoo</span><span class="o">()){</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;true&quot;</span><span class="o">)</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span> <span class="k">else</span> <span class="o">{</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">println</span><span class="o">(</span><span class="s">&quot;false&quot;</span><span class="o">)</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC29'>&nbsp;&nbsp;<span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2146704/723046c282e6b0829f3286be9c0bf8ffc5b8d1ad/gistfile1.scala" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2146704#file_gistfile1.scala" style="float:right;margin-right:10px;color:#666">gistfile1.scala</a>
            <a href="https://gist.github.com/2146704">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Ekstrahujemy obie metody do osobnych klas, dzięki czemu są one niezależnie testowalne. Co więcej, dzięki temu zabiegowi, w przyszłości będziemy mogli małym nakładem pracy podmienić implementację obu metod gdyby się to okazało potrzebne.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2012/03/21/wiedz-ze-cos-sie-dzieje/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The Context</title>
		<link>http://blog.wsoczynski.pl/2012/03/19/the-context/</link>
		<comments>http://blog.wsoczynski.pl/2012/03/19/the-context/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 21:17:12 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[architektura]]></category>
		<category><![CDATA[domain driven design]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[DCI]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[ood]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=678</guid>
		<description><![CDATA[The inspiration for this post came to me mainly because of the discussion in comments which I had on Sebastian&#8217;s Malaca blog. We had a little debate there about the famous &#8222;getters and setters&#8221; duo. In my opinion, you can peacefully write software, completely avoiding them (with the obvious exception for DTO&#8217;s). My interlocutors had [...]]]></description>
			<content:encoded><![CDATA[<p>The inspiration for this post came to me mainly because of the discussion in comments which I had on <a href="http://sebastian-malaca.blogspot.com/2011/10/jak-programowac-obiektowo-cz-2-atrybuty.html">Sebastian&#8217;s Malaca blog</a>. We had a little debate there about the famous &#8222;getters and setters&#8221; duo. In my opinion, you can peacefully write software, completely avoiding them (with the obvious exception for DTO&#8217;s).</p>
<p><span id="more-678"></span>My interlocutors had a little different point of view &#8211; they stated, that although you should avoid them, there are some cases when G&amp;S are a must. I came up with classic example of a Human, which we can image as:</p>
<div id="gist-1388156" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Human</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Legs</span> <span class="n">legs</span><span class="o">;</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Heart</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Brain</span> <span class="n">brain</span><span class="o">;</span> </div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="nf">Human</span><span class="o">(</span><span class="n">Heart</span> <span class="n">heart</span><span class="o">,</span> <span class="n">Brain</span> <span class="n">brain</span><span class="o">,</span> <span class="n">Legs</span> <span class="n">legs</span><span class="o">){</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="o">.</span><span class="na">legs</span> <span class="o">=</span> <span class="n">legs</span><span class="o">;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="o">.</span><span class="na">heart</span> <span class="o">=</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="o">.</span><span class="na">brain</span> <span class="o">=</span> <span class="n">brain</span><span class="o">;</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="n">Distance</span> <span class="nf">walk</span><span class="o">(</span><span class="n">Place</span> <span class="n">origin</span><span class="o">,</span> <span class="n">Place</span> <span class="n">destination</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">UnreachableDestinationException</span> <span class="o">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">heart</span><span class="o">.</span><span class="na">accelerateRate</span><span class="o">(</span><span class="mi">150</span><span class="o">);</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Distance</span> <span class="n">summaryDistance</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Distance</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">Unit</span><span class="o">.</span><span class="na">METER</span><span class="o">);</span>        </div><div class='line' id='LC16'><br/></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">while</span><span class="o">(!</span><span class="n">origin</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">destination</span><span class="o">)){</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(!</span><span class="n">brain</span><span class="o">.</span><span class="na">canMoveByStep</span><span class="o">()){</span>            </div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">throw</span> <span class="k">new</span> <span class="nf">UnreachableDestinationException</span><span class="o">(</span><span class="n">destination</span><span class="o">);</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Distance</span> <span class="n">stepDistance</span> <span class="o">=</span> <span class="n">legs</span><span class="o">.</span><span class="na">moveStep</span><span class="o">();</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">summaryDistance</span> <span class="o">=</span> <span class="n">summaryDistance</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">stepDistance</span><span class="o">);</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">origin</span> <span class="o">=</span> <span class="n">origin</span><span class="o">.</span><span class="na">move</span><span class="o">(</span><span class="n">stepDistance</span><span class="o">);</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">summaryDistance</span><span class="o">;</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">talk</span><span class="o">(</span><span class="n">Human</span> <span class="n">interlocutor</span><span class="o">){</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//some code</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="n">WorkResult</span> <span class="nf">work</span><span class="o">(</span><span class="n">Task</span> <span class="n">task</span><span class="o">){</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//some code</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC35'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1388156/d9aa53be88257eddfd53c60ed3c65f8e5530a66a/theContext.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1388156#file_the_context.java" style="float:right;margin-right:10px;color:#666">theContext.java</a>
            <a href="https://gist.github.com/1388156">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>As we see in this code, you don&#8217;t have any getters or setters, all possible actions of a Human are expressed by the methods attached to its class.</p>
<p>So fine, so good, but what happens if we want to model the following situation &#8211; a Human walking down the street gets hit by a car and suffers from an injury ? If the injury is serious, he will be taken to the hospital. In the hospital he will be medically examined by some (let us hope) skilled medical personnel. If the injury was real worse, the situation may require to perform an operation on an open heart.</p>
<p>Unfortunately our properly encapsulated Human doesn&#8217;t expose its internal state of which the heart is part of. So, what can (and does) a surgeon ? He just simply breaks the encapsulation by cutting the chest and gets his job done.</p>
<p>If we wanted to translate (model) the actions of a surgeon in Java code, we would write:</p>
<div id="gist-1392023" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Surgeon</span> <span class="o">{</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">MedicalProcedure</span><span class="o">&gt;</span> <span class="n">knownProcedures</span><span class="o">;</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="n">Boolean</span> <span class="nf">operate</span><span class="o">(</span><span class="n">Human</span> <span class="n">patient</span><span class="o">,</span> <span class="n">String</span> <span class="n">procedureName</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">FamilyDoesNotAllowException</span> <span class="o">{</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Field</span><span class="o">[]</span> <span class="n">fields</span> <span class="o">=</span> <span class="n">Human</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getDeclaredFields</span><span class="o">();</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">try</span> <span class="o">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">List</span><span class="o">&lt;</span><span class="n">Organ</span><span class="o">&gt;</span> <span class="n">organs</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Organ</span><span class="o">&gt;();</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">for</span> <span class="o">(</span><span class="n">Field</span> <span class="n">field</span> <span class="o">:</span> <span class="n">fields</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">field</span><span class="o">.</span><span class="na">setAccessible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Organ</span> <span class="n">organ</span> <span class="o">=</span> <span class="o">(</span><span class="n">Organ</span><span class="o">)</span><span class="n">field</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">patient</span><span class="o">);</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">organs</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">organ</span><span class="o">);</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MedicalProcedure</span> <span class="n">procedure</span> <span class="o">=</span> <span class="n">knownProcedures</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">procedureName</span><span class="o">);</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">procedure</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">organs</span><span class="o">);</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">IllegalAccessException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">throw</span> <span class="k">new</span> <span class="nf">FamilyDoesNotAllowException</span><span class="o">();</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC22'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1392023/f14390457f9d5c3388917cc91dee25ac9e54d76a/theContext2.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1392023#file_the_context2.java" style="float:right;margin-right:10px;color:#666">theContext2.java</a>
            <a href="https://gist.github.com/1392023">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>In the above example, the Java Reflection API was used to break the encapsulation of the instance of a Human class. If we dive into the body of the method &#8222;operate&#8221;, we could see that an exception could be thrown &#8211; the IllegalAccessException. This is because the JVM could be configured to <a href="http://java.sun.com/developer/onlineTraining/Programming/JDCBook/appA.html#ReflectPermission">ban</a> such usages of the reflection API. In the real world, the family could also disagree to operate the patient.</p>
<p>So much for drawing parallels between the real world and Java code. As we see, we cannot rely on this particular feature of Java Reflection API. If we want to save our innocent Human being, we have two options:</p>
<ol>
<li>write getters and setters for the organs</li>
<li>add a new method to the Human class, to <strong>let him be operated</strong></li>
</ol>
<p>Let write some code to see, how could it be implemented. We will begin with the getter/setter case:</p>
<div id="gist-1461111" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Human</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Heart</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Brain</span> <span class="n">brain</span><span class="o">;</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Legs</span> <span class="n">legs</span><span class="o">;</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="n">Distance</span> <span class="nf">walk</span><span class="o">(</span><span class="n">Place</span> <span class="n">origin</span><span class="o">,</span> <span class="n">Place</span> <span class="n">destination</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">UnreachableDestinationException</span> <span class="o">{</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//some code</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">talk</span><span class="o">(</span><span class="n">Human</span> <span class="n">interlocutor</span><span class="o">){</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//some code</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="n">WorkResult</span> <span class="nf">work</span><span class="o">(</span><span class="n">Task</span> <span class="n">task</span><span class="o">){</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//some code</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="n">Heart</span> <span class="nf">getHeart</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC22'><br/></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setHeart</span><span class="o">(</span><span class="n">Heart</span> <span class="n">heart</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="o">.</span><span class="na">heart</span> <span class="o">=</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC26'><br/></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//getters and setters for the rest of properties</span></div><div class='line' id='LC28'><br/></div><div class='line' id='LC29'><span class="o">}</span></div><div class='line' id='LC30'><br/></div><div class='line' id='LC31'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Surgeon</span> <span class="o">{</span></div><div class='line' id='LC32'><br/></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">MedicalProcedure</span><span class="o">&gt;</span> <span class="n">knownProcedures</span><span class="o">;</span></div><div class='line' id='LC34'><br/></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">operate</span><span class="o">(</span><span class="n">Human</span> <span class="n">patient</span><span class="o">,</span> <span class="n">String</span> <span class="n">procedureName</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC36'><br/></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">List</span><span class="o">&lt;</span><span class="n">Organ</span><span class="o">&gt;</span> <span class="n">organs</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Organ</span><span class="o">&gt;();</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">organs</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">patient</span><span class="o">.</span><span class="na">getBrain</span><span class="o">());</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">organs</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">patient</span><span class="o">.</span><span class="na">getHeart</span><span class="o">());</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MedicalProcedure</span> <span class="n">procedure</span> <span class="o">=</span> <span class="n">knownProcedures</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">procedureName</span><span class="o">);</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="n">isSuccessful</span> <span class="o">=</span> <span class="n">procedure</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">organs</span><span class="o">);</span></div><div class='line' id='LC43'><br/></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">isSuccessful</span><span class="o">;</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC46'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1461111/0993e074f3f0e08caefa7b327839eac8b1d1e0ae/theContext3.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1461111#file_the_context3.java" style="float:right;margin-right:10px;color:#666">theContext3.java</a>
            <a href="https://gist.github.com/1461111">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>The code from the original example was altered and some getters/setters were added. The added G&amp;S are actually some kind of extension points.</p>
<p>The positive of this approach is that anyone is free to do anything with our code, so when another scenario emerges &#8211; for example our Human gets started in an Olympics game, we could support this scenario without the need of altering the class itself.</p>
<p>The negative side of this approach is directly connected with the positive side &#8211; if someone is free to do anything with our code, than he could do something that he isn&#8217;t supposed to. An example of such situation would be the code, which sets the heart property to null &#8211; all other code depending of this property will simply fail.</p>
<p>After examining the G&amp;S case, lets focus on the the second one. The code:</p>
<div id="gist-1392162" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Surgeon</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">MedicalProcedure</span><span class="o">&gt;</span> <span class="n">knownProcedures</span><span class="o">;</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="nf">operate</span><span class="o">(</span><span class="n">Organ</span><span class="o">[]</span> <span class="n">organs</span><span class="o">,</span> <span class="n">String</span> <span class="n">procedureName</span><span class="o">){</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MedicalProcedure</span> <span class="n">procedure</span> <span class="o">=</span> <span class="n">knownProcedures</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">procedureName</span><span class="o">);</span>        </div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="n">result</span> <span class="o">=</span> <span class="n">procedure</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">organs</span><span class="o">);</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">result</span><span class="o">;</span>    </div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC10'><span class="o">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Treatment</span> <span class="o">{</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Surgeon</span> <span class="n">surgeon</span><span class="o">;</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">String</span> <span class="n">procedureName</span><span class="o">;</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Treatment</span><span class="o">(</span><span class="n">Surgeon</span> <span class="n">surgeon</span><span class="o">,</span> <span class="n">String</span> <span class="n">procedureName</span><span class="o">){</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="o">.</span><span class="na">surgeon</span> <span class="o">=</span> <span class="n">surgeon</span><span class="o">;</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="o">.</span><span class="na">procedureName</span> <span class="o">=</span> <span class="n">procedureName</span><span class="o">;</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="nf">execute</span><span class="o">(</span><span class="n">Organ</span><span class="o">[]</span> <span class="n">organs</span><span class="o">){</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">surgeon</span><span class="o">.</span><span class="na">operate</span><span class="o">(</span><span class="n">organs</span><span class="o">,</span> <span class="n">procedureName</span><span class="o">);</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span>    </div><div class='line' id='LC25'><span class="o">}</span></div><div class='line' id='LC26'><br/></div><div class='line' id='LC27'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Surgeon</span> <span class="o">{</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">MedicalProcedure</span><span class="o">&gt;</span> <span class="n">knownProcedures</span><span class="o">;</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="nf">operate</span><span class="o">(</span><span class="n">Organ</span><span class="o">[]</span> <span class="n">organs</span><span class="o">,</span> <span class="n">String</span> <span class="n">procedureName</span><span class="o">){</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MedicalProcedure</span> <span class="n">procedure</span> <span class="o">=</span> <span class="n">knownProcedures</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">procedureName</span><span class="o">);</span>        </div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="n">result</span> <span class="o">=</span> <span class="n">procedure</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">organs</span><span class="o">);</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">result</span><span class="o">;</span>    </div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC36'><span class="o">}</span></div><div class='line' id='LC37'><br/></div><div class='line' id='LC38'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Human</span> <span class="o">{</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Legs</span> <span class="n">legs</span><span class="o">;</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Heart</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">private</span> <span class="n">Brain</span> <span class="n">brain</span><span class="o">;</span></div><div class='line' id='LC43'><br/></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//some code</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">public</span> <span class="n">Boolean</span> <span class="nf">letBeOperated</span><span class="o">(</span><span class="n">Treatment</span> <span class="n">treatment</span><span class="o">){</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Organ</span><span class="o">[]</span> <span class="n">organs</span> <span class="o">=</span> <span class="o">{</span><span class="n">heart</span><span class="o">,</span><span class="n">brain</span><span class="o">};</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="n">result</span> <span class="o">=</span> <span class="n">treatment</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">organs</span><span class="o">);</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">result</span><span class="o">;</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC53'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1392162/8c8b439dcbe5748335f594f718fec3fc73ac96da/theContext4.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1392162#file_the_context4.java" style="float:right;margin-right:10px;color:#666">theContext4.java</a>
            <a href="https://gist.github.com/1392162">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>In this approach we added another method named &#8222;letBeOperated&#8221; which is responsible for passing in a controlled manner some of the organs to an instance of a Treatment class which effectively performs the treatment of the patient.</p>
<p>We have avoided getters and setters, so our Human is once again perfectly encapsulated and nobody messes with the inner state of our object without our control.</p>
<p>We could think, that we have found a silver bullet, a technique which solves all of our problems. But one must be very cautious, because this one also has its drawbacks.</p>
<p>The first thing, you may notice is that, our Human class violates the <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Single Responsibility Principle</a> &#8211; what has working and walking to do with being operated? The second thing is a consequence of the first one &#8211; if a class handles more than one responsibility it will have multiple dependencies and also it&#8217;s code base will grow very fast. How can we fix this obvious flaw?</p>
<p>If we closely look at the use cases that we try to implement, we may notice,  that the Human class appears in different <strong>contexts</strong>. One context is for walking down the street and the other is for being hospitalized. This is a very fundamental thing, that many developers seem simply to ignore, although it is very important for proper problem modeling.</p>
<p>Let us organize our problem domain knowledge:</p>
<ul>
<li>we have two contexts: Walking Context and Hospitalization Context</li>
<li>in the Walking Context, a Human plays a role of a Walker and in the Hospitalization Context he plays a role of a Patient</li>
</ul>
<p>How can we refactor our code then ? I see mainly two patterns applicable:</p>
<ul>
<li>Data Context Interaction (DCI)</li>
<li>Bound Context (from DDD)</li>
</ul>
<p>The Bound Context pattern refers mainly to general systems design, so I will just describe it without examples:</p>
<p>Applying the Bound Context pattern to an application means, that we divide the application into highly cohesive modules. Each module is a bound context &#8211; a set of classes, functions etc that are specialized over one &#8222;domain&#8221;. Because these software building blocks are very specialized, there may be a situation that we will have two classes sharing the same name in different bound contexts. These two classes will have different behavior that is custom to their bound context, neither will they be interchangeable, nor even share the same inheritance tree.</p>
<p>As I said, the Bound Context pattern is more a system design pattern and it mostly applies to some bigger systems. In most cases, the Data Context Interaction pattern should be sufficient.</p>
<p>So can we implement the DCI pattern using our Human-Walker-Patient example ?</p>
<p>We can do it in two ways, depending of what language we are using, lets start with the hard way &#8211; in Java <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>The code:</p>
<div id="gist-2112816" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Human</span> <span class="o">{</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'>	<span class="kd">protected</span> <span class="n">Legs</span> <span class="n">legs</span><span class="o">;</span></div><div class='line' id='LC4'>	<span class="kd">protected</span> <span class="n">Brain</span> <span class="n">brain</span><span class="o">;</span></div><div class='line' id='LC5'>	<span class="kd">protected</span> <span class="n">Heart</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>	<span class="kd">public</span> <span class="nf">Human</span><span class="o">(</span><span class="n">Legs</span> <span class="n">legs</span><span class="o">,</span> <span class="n">Heart</span> <span class="n">heart</span><span class="o">,</span> <span class="n">Brain</span> <span class="n">brain</span><span class="o">){</span></div><div class='line' id='LC8'>		<span class="k">this</span><span class="o">.</span><span class="na">legs</span> <span class="o">=</span> <span class="n">legs</span><span class="o">;</span></div><div class='line' id='LC9'>		<span class="k">this</span><span class="o">.</span><span class="na">heart</span> <span class="o">=</span> <span class="n">heart</span><span class="o">;</span></div><div class='line' id='LC10'>		<span class="k">this</span><span class="o">.</span><span class="na">brain</span> <span class="o">=</span> <span class="n">brain</span><span class="o">;</span></div><div class='line' id='LC11'>	<span class="o">}</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>	<span class="kd">public</span> <span class="nf">Human</span><span class="o">(</span><span class="n">Human</span> <span class="n">human</span><span class="o">){</span></div><div class='line' id='LC14'>		<span class="k">this</span><span class="o">(</span><span class="n">human</span><span class="o">.</span><span class="na">legs</span><span class="o">,</span> <span class="n">human</span><span class="o">.</span><span class="na">heart</span><span class="o">,</span> <span class="n">human</span><span class="o">.</span><span class="na">brain</span><span class="o">);</span></div><div class='line' id='LC15'>	<span class="o">}</span></div><div class='line' id='LC16'><br/></div><div class='line' id='LC17'><span class="o">}</span></div><div class='line' id='LC18'><br/></div><div class='line' id='LC19'><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Walkable</span> <span class="o">{</span></div><div class='line' id='LC20'>	<span class="kd">public</span> <span class="n">Distance</span> <span class="nf">walk</span><span class="o">(</span><span class="n">Place</span> <span class="n">origin</span><span class="o">,</span> <span class="n">Place</span> <span class="n">destination</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">UnreachableDestinationException</span><span class="o">;</span></div><div class='line' id='LC21'><span class="o">}</span></div><div class='line' id='LC22'><br/></div><div class='line' id='LC23'><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Treatable</span> <span class="o">{</span></div><div class='line' id='LC24'>	<span class="kd">public</span> <span class="n">Boolean</span> <span class="nf">letBeOperated</span><span class="o">(</span><span class="n">Treatment</span> <span class="n">treatment</span><span class="o">);</span></div><div class='line' id='LC25'><span class="o">}</span></div><div class='line' id='LC26'><br/></div><div class='line' id='LC27'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Walker</span> <span class="kd">extends</span> <span class="n">Human</span> <span class="kd">implements</span> <span class="n">Walkable</span> <span class="o">{</span></div><div class='line' id='LC28'><br/></div><div class='line' id='LC29'>	<span class="kd">public</span> <span class="nf">Walker</span><span class="o">(</span><span class="n">Human</span> <span class="n">human</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC30'>		<span class="kd">super</span><span class="o">(</span><span class="n">human</span><span class="o">);</span></div><div class='line' id='LC31'>	<span class="o">}</span></div><div class='line' id='LC32'><br/></div><div class='line' id='LC33'>	<span class="nd">@Override</span></div><div class='line' id='LC34'>	<span class="kd">public</span> <span class="n">Distance</span> <span class="nf">walk</span><span class="o">(</span><span class="n">Place</span> <span class="n">origin</span><span class="o">,</span> <span class="n">Place</span> <span class="n">destination</span><span class="o">)</span></div><div class='line' id='LC35'>			<span class="kd">throws</span> <span class="n">UnreachableDestinationException</span> <span class="o">{</span></div><div class='line' id='LC36'>		<span class="n">heart</span><span class="o">.</span><span class="na">accelerateRate</span><span class="o">(</span><span class="mi">150</span><span class="o">);</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Distance</span> <span class="n">summaryDistance</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Distance</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">Unit</span><span class="o">.</span><span class="na">METER</span><span class="o">);</span></div><div class='line' id='LC38'><br/></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">while</span><span class="o">(!</span><span class="n">origin</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">destination</span><span class="o">)){</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="o">(!</span><span class="n">brain</span><span class="o">.</span><span class="na">canMoveByStep</span><span class="o">()){</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">throw</span> <span class="k">new</span> <span class="nf">UnreachableDestinationException</span><span class="o">(</span><span class="n">destination</span><span class="o">);</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Distance</span> <span class="n">stepDistance</span> <span class="o">=</span> <span class="n">legs</span><span class="o">.</span><span class="na">moveStep</span><span class="o">();</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">summaryDistance</span> <span class="o">=</span> <span class="n">summaryDistance</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">stepDistance</span><span class="o">);</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">origin</span> <span class="o">=</span> <span class="n">origin</span><span class="o">.</span><span class="na">move</span><span class="o">(</span><span class="n">stepDistance</span><span class="o">);</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">summaryDistance</span><span class="o">;</span></div><div class='line' id='LC48'>	<span class="o">}</span></div><div class='line' id='LC49'><br/></div><div class='line' id='LC50'><span class="o">}</span></div><div class='line' id='LC51'><br/></div><div class='line' id='LC52'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Patient</span> <span class="kd">extends</span> <span class="n">Human</span> <span class="kd">implements</span> <span class="n">Treatable</span><span class="o">{</span></div><div class='line' id='LC53'><br/></div><div class='line' id='LC54'>	<span class="kd">public</span> <span class="nf">Patient</span><span class="o">(</span><span class="n">Human</span> <span class="n">human</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC55'>		<span class="kd">super</span><span class="o">(</span><span class="n">human</span><span class="o">);</span></div><div class='line' id='LC56'>	<span class="o">}</span></div><div class='line' id='LC57'><br/></div><div class='line' id='LC58'>	<span class="nd">@Override</span></div><div class='line' id='LC59'>	<span class="kd">public</span> <span class="n">Boolean</span> <span class="nf">letBeOperated</span><span class="o">(</span><span class="n">Treatment</span> <span class="n">treatment</span><span class="o">){</span></div><div class='line' id='LC60'><br/></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Organ</span><span class="o">[]</span> <span class="n">organs</span> <span class="o">=</span> <span class="o">{</span><span class="n">heart</span><span class="o">,</span><span class="n">brain</span><span class="o">};</span></div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Boolean</span> <span class="n">result</span> <span class="o">=</span> <span class="n">treatment</span><span class="o">.</span><span class="na">execute</span><span class="o">(</span><span class="n">organs</span><span class="o">);</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC64'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">result</span><span class="o">;</span></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC66'><br/></div><div class='line' id='LC67'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2112816/b3f52fe65e4e02188119f07e2243b312857c58d2/gistfile1.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2112816#file_gistfile1.java" style="float:right;margin-right:10px;color:#666">gistfile1.java</a>
            <a href="https://gist.github.com/2112816">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>How to use it:</p>
<div id="gist-2112886" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'>	<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC4'>		<span class="n">Human</span> <span class="n">human</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Human</span><span class="o">(</span><span class="k">new</span> <span class="n">Legs</span><span class="o">(),</span><span class="k">new</span> <span class="n">Heart</span><span class="o">(),</span> <span class="k">new</span> <span class="n">Brain</span><span class="o">());</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'>		<span class="c1">//let the human walk somewhere</span></div><div class='line' id='LC7'>		<span class="n">Walker</span> <span class="n">walker</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Walker</span><span class="o">(</span><span class="n">human</span><span class="o">);</span></div><div class='line' id='LC8'>		<span class="n">walkFromHomeToWork</span><span class="o">(</span><span class="n">walker</span><span class="o">);</span></div><div class='line' id='LC9'><br/></div><div class='line' id='LC10'>		<span class="c1">//oops! there was an accident when walking		</span></div><div class='line' id='LC11'>		<span class="n">Patient</span> <span class="n">patient</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Patient</span><span class="o">(</span><span class="n">human</span><span class="o">);</span></div><div class='line' id='LC12'>		<span class="n">treatAfterAccident</span><span class="o">(</span><span class="n">patient</span><span class="o">);</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'>	<span class="o">}</span></div><div class='line' id='LC15'><br/></div><div class='line' id='LC16'>	<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">walkFromHomeToWork</span><span class="o">(</span><span class="n">Walkable</span> <span class="n">walker</span><span class="o">){</span></div><div class='line' id='LC17'>		<span class="n">walker</span><span class="o">.</span><span class="na">walk</span><span class="o">(</span><span class="k">new</span> <span class="n">Place</span><span class="o">(</span><span class="s">&quot;Home&quot;</span><span class="o">),</span> <span class="k">new</span> <span class="n">Place</span><span class="o">(</span><span class="s">&quot;Work&quot;</span><span class="o">));</span></div><div class='line' id='LC18'>	<span class="o">}</span></div><div class='line' id='LC19'><br/></div><div class='line' id='LC20'>	<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">treatAfterAccident</span><span class="o">(</span><span class="n">Treatable</span> <span class="n">patient</span><span class="o">){</span></div><div class='line' id='LC21'>		<span class="n">Surgeon</span> <span class="n">surgeon</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Surgeon</span><span class="o">();</span></div><div class='line' id='LC22'>		<span class="n">Treatment</span> <span class="n">treatment</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Treatment</span><span class="o">(</span><span class="n">surgeon</span><span class="o">,</span> <span class="s">&quot;some medical procedure&quot;</span><span class="o">);</span></div><div class='line' id='LC23'>		<span class="n">patient</span><span class="o">.</span><span class="na">letBeOperated</span><span class="o">(</span><span class="n">treatment</span><span class="o">);</span></div><div class='line' id='LC24'>	<span class="o">}</span></div><div class='line' id='LC25'><br/></div><div class='line' id='LC26'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2112886/57f7810b9e84338ccf0cb1a1e89fed0dc9035ce8/gistfile1.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2112886#file_gistfile1.java" style="float:right;margin-right:10px;color:#666">gistfile1.java</a>
            <a href="https://gist.github.com/2112886">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Explanation:</p>
<p>We have created two interfaces &#8211; Walkable and Treatable, they represent the actions that we want an object to be capable of. Then we created two classes &#8211; Walker and Patient, that implement the mentioned interfaces. Both classes extend the base Human class to provide support for both interfaces.  The Walker and Patient classes are just simple wrappers but they share the same inheritance hierarchy to indicate, that they are specializations of a Human class (and also avoid the use of getters/setters <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p>As I said before, the Java implementation is the hard way. Now let&#8217;s have some joy from programming, the next example will be in Scala.</p>
<p>The whole code:</p>
<div id="gist-2127019" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">Human</span><span class="o">(</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="k">protected</span><span class="o">[</span><span class="kt">Human</span><span class="o">]</span> <span class="k">val</span> <span class="n">legsObj</span><span class="k">:</span> <span class="kt">Legs</span><span class="o">,</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">protected</span><span class="o">[</span><span class="kt">Human</span><span class="o">]</span> <span class="k">val</span> <span class="n">heartObj</span><span class="k">:</span> <span class="kt">Heart</span><span class="o">,</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="k">protected</span><span class="o">[</span><span class="kt">Human</span><span class="o">]</span> <span class="k">val</span> <span class="n">brainObj</span><span class="k">:</span> <span class="kt">Brain</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="k">def</span> <span class="k">this</span><span class="o">(</span><span class="n">human</span><span class="k">:</span> <span class="kt">Human</span><span class="o">)</span> <span class="k">=</span> <span class="o">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="o">(</span><span class="n">human</span><span class="o">.</span><span class="n">legsObj</span><span class="o">,</span> <span class="n">human</span><span class="o">.</span><span class="n">heartObj</span><span class="o">,</span> <span class="n">human</span><span class="o">.</span><span class="n">brainObj</span><span class="o">)</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC9'><br/></div><div class='line' id='LC10'><span class="o">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'><span class="k">trait</span> <span class="nc">Walkable</span> <span class="k">extends</span> <span class="nc">Human</span> <span class="o">{</span></div><div class='line' id='LC13'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">walk</span><span class="o">(</span><span class="n">origin</span><span class="k">:</span> <span class="kt">Place</span><span class="o">,</span> <span class="n">destination</span><span class="k">:</span> <span class="kt">Place</span><span class="o">)</span><span class="k">:</span> <span class="kt">Distance</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">heartObj</span><span class="o">.</span><span class="n">accelerateRate</span><span class="o">(</span><span class="mi">150</span><span class="o">);</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">var</span> <span class="n">summaryDistance</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Distance</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="nc">Meter</span><span class="o">);</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">var</span> <span class="n">currentPosition</span> <span class="k">=</span> <span class="n">origin</span><span class="o">;</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">while</span> <span class="o">(!</span><span class="n">origin</span><span class="o">.</span><span class="n">equals</span><span class="o">(</span><span class="n">destination</span><span class="o">))</span> <span class="o">{</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="o">(!</span><span class="n">brainObj</span><span class="o">.</span><span class="n">canMoveByStep</span><span class="o">)</span> <span class="o">{</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">throw</span> <span class="k">new</span> <span class="nc">UnreachableDestinationException</span><span class="o">(</span><span class="n">destination</span><span class="o">);</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">stepDistance</span> <span class="k">=</span> <span class="n">legsObj</span><span class="o">.</span><span class="n">moveStep</span><span class="o">;</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">summaryDistance</span> <span class="k">=</span> <span class="n">summaryDistance</span><span class="o">.</span><span class="n">add</span><span class="o">(</span><span class="n">stepDistance</span><span class="o">);</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">currentPosition</span> <span class="k">=</span> <span class="n">currentPosition</span><span class="o">.</span><span class="n">move</span><span class="o">(</span><span class="n">stepDistance</span><span class="o">);</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">summaryDistance</span><span class="o">;</span></div><div class='line' id='LC29'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC30'><span class="o">}</span></div><div class='line' id='LC31'><br/></div><div class='line' id='LC32'><span class="k">trait</span> <span class="nc">Treatable</span> <span class="k">extends</span> <span class="nc">Human</span> <span class="o">{</span></div><div class='line' id='LC33'>&nbsp;&nbsp;<span class="k">def</span> <span class="n">letBeOperated</span><span class="o">(</span><span class="n">treatment</span><span class="k">:</span> <span class="kt">Treatment</span><span class="o">)</span><span class="k">:</span> <span class="kt">Boolean</span> <span class="o">=</span> <span class="o">{</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">organs</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="n">heartObj</span><span class="o">,</span> <span class="n">brainObj</span><span class="o">);</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">result</span> <span class="k">=</span> <span class="n">treatment</span><span class="o">.</span><span class="n">execute</span><span class="o">(</span><span class="n">organs</span><span class="o">);</span></div><div class='line' id='LC36'><br/></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">result</span><span class="o">;</span></div><div class='line' id='LC38'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC39'><span class="o">}</span></div><div class='line' id='LC40'><br/></div><div class='line' id='LC41'><span class="k">object</span> <span class="nc">Main</span> <span class="k">extends</span> <span class="nc">App</span> <span class="o">{</span></div><div class='line' id='LC42'><br/></div><div class='line' id='LC43'>&nbsp;&nbsp;<span class="k">implicit</span> <span class="k">def</span> <span class="n">humanInWalkingContext</span><span class="o">(</span><span class="n">human</span><span class="k">:</span> <span class="kt">Human</span><span class="o">)</span> <span class="k">=</span> <span class="o">(</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">new</span> <span class="nc">Human</span><span class="o">(</span><span class="n">human</span><span class="o">)</span> <span class="k">with</span> <span class="nc">Walkable</span><span class="o">)</span></div><div class='line' id='LC45'><br/></div><div class='line' id='LC46'>&nbsp;&nbsp;<span class="k">implicit</span> <span class="k">def</span> <span class="n">humanInMedicalContext</span><span class="o">(</span><span class="n">human</span><span class="k">:</span> <span class="kt">Human</span><span class="o">)</span> <span class="k">=</span> <span class="o">(</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">new</span> <span class="nc">Human</span><span class="o">(</span><span class="n">human</span><span class="o">)</span> <span class="k">with</span> <span class="nc">Treatable</span><span class="o">)</span></div><div class='line' id='LC48'><br/></div><div class='line' id='LC49'>&nbsp;&nbsp;<span class="k">override</span> <span class="k">def</span> <span class="n">main</span><span class="o">(</span><span class="n">args</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">String</span><span class="o">])</span> <span class="k">=</span> <span class="o">{</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">human</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Human</span><span class="o">(</span><span class="k">new</span> <span class="nc">Legs</span><span class="o">,</span> <span class="k">new</span> <span class="nc">Heart</span><span class="o">,</span> <span class="k">new</span> <span class="nc">Brain</span><span class="o">)</span></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">human</span><span class="o">.</span><span class="n">walk</span><span class="o">(</span><span class="k">new</span> <span class="nc">Place</span><span class="o">,</span> <span class="k">new</span> <span class="nc">Place</span><span class="o">)</span></div><div class='line' id='LC52'><br/></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">surgeon</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Surgeon</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">val</span> <span class="n">treatment</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Treatment</span><span class="o">(</span><span class="n">surgeon</span><span class="o">,</span> <span class="s">&quot;some medical procedure&quot;</span><span class="o">)</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">human</span><span class="o">.</span><span class="n">letBeOperated</span><span class="o">(</span><span class="n">treatment</span><span class="o">)</span></div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC58'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC59'><br/></div><div class='line' id='LC60'><span class="o">}</span> </div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2127019/569a8f80248f81c542d5d74cb8457bba06b7e609/gistfile1.scala" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2127019#file_gistfile1.scala" style="float:right;margin-right:10px;color:#666">gistfile1.scala</a>
            <a href="https://gist.github.com/2127019">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Explanation:</p>
<p>The Scala example has the same architecture as Java one, but the devil lies in the details <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . The first thing that you may notice is the absence of the Walker and Patient classes &#8211; they are not needed, because traits (Scala&#8217;s aproach to interfaces) already have an implementation of the needed methods.</p>
<p>The second thing that will surely confuse you (if you are not a Scala hacker <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) is the main method. You may ask yourself &#8211; where have all the conversions go and how can you call methods on a class that doesn&#8217;t physically have them ?</p>
<p>The answer is very simple &#8211; we are using a very clever technique called <a href="http://www.scala-lang.org/node/130">views</a>. Thanks to these two tiny bits of code above (starting with implicit def) we tell the compiler to implicitly mixin both traits into our sample Human class.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2012/03/19/the-context/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The no framework JS framework</title>
		<link>http://blog.wsoczynski.pl/2011/11/22/the-no-framework-js-framework/</link>
		<comments>http://blog.wsoczynski.pl/2011/11/22/the-no-framework-js-framework/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 14:42:56 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=671</guid>
		<description><![CDATA[From some time (2+ years) we can observe a huge explosion of different  Javascript frameworks. These frameworks divide mainly into two categories UI widgets / DOM manipulation frameworks class based type system frameworks In this post I would like to focus on the latter. Every time is see a new framework of this type popping [...]]]></description>
			<content:encoded><![CDATA[<p>From some time (2+ years) we can observe a huge explosion of different  Javascript frameworks. These frameworks divide mainly into two categories</p>
<ol>
<li>UI widgets / DOM manipulation frameworks</li>
<li>class based type system frameworks</li>
</ol>
<p>In this post I would like to focus on the latter. Every time is see a new framework of this type popping on the news I tend to ask myself the same question &#8211; why ? Why one does write all does frameworks, why people so much need classes in Javascript ?</p>
<p><span id="more-671"></span>After some thinking I&#8217;ve got to a conclusion, that people need them mainly because they are used to the concept of the &#8222;class&#8221; and to a typical type system like this found in Java, PHP or &#8222;name your favorite mainstream programming language here&#8221;. This is understandable, as naturally human beings are resistive to change.  Also, some people tend to &#8222;not get&#8221; what&#8217;s going on in the prototypical type system. We cannot also blame them here because it has  some quirks and well, no one teaches it in schools ( ;P ).</p>
<p>One may ask himself &#8211; do we have an other choices to write clean, readable and understandable code other than using JS frameworks ? I think the answer for this question would be affirmative.</p>
<p>But before we come up for a solution. We must think for a second and summarize what we are trying to achieve. I think that are needs wrap in:</p>
<ol>
<li>new object instantiation</li>
<li>information hiding</li>
<li>code reuse</li>
<li>modularization</li>
</ol>
<p>The thing that some one will miss would be inheritance. Should it be on the list ? I don&#8217;t think so. The reason for the lack of inheritance is simple &#8211; inheritance has two purposes:</p>
<ol>
<li>vertical code reuse &#8211; the type lower in the hierarchy inherits behavior from the type higher in it</li>
<li>signature checking &#8211; in statically typed class based languages, polymorphism is achieved through inheritance</li>
</ol>
<p>we could achieve code reuse by other means in Javascript and as JS has no type checking we don&#8217;t need inheritance at all.</p>
<p>For our &#8222;no framework JS framework&#8221; we will use mainly such features of JS as first class functions and JSON. So behold, some common patterns for our daily JS programming:</p>
<div id="gist-1385611" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c1">//persons module</span></div><div class='line' id='LC2'><span class="nx">persons</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">(){</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//private Person object constructor</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">Person</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">firstName</span><span class="p">,</span> <span class="nx">lastName</span><span class="p">,</span> <span class="nx">birthDate</span><span class="p">){</span>    </div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="s2">&quot;bar&quot;</span><span class="p">;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nx">firstName</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nx">lastName</span><span class="p">;</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">age</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">currentYear</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">()).</span><span class="nx">getYear</span><span class="p">()</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">birthDayYear</span> <span class="o">=</span> <span class="nx">birthDate</span><span class="p">.</span><span class="nx">getYear</span><span class="p">()</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nx">currentYear</span> <span class="o">-</span> <span class="nx">birthDayYear</span>      </div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">saySomething</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nx">foo</span><span class="p">;</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//the methods that will be public</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="p">{</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="nx">name</span><span class="p">,</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="s2">&quot;age&quot;</span><span class="o">:</span> <span class="nx">age</span><span class="p">,</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="s2">&quot;saySomething&quot;</span><span class="o">:</span> <span class="nx">saySomething</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//private FitnessAddict object constructor</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">FitnessAddict</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">firstName</span><span class="p">,</span> <span class="nx">lastName</span><span class="p">,</span> <span class="nx">birthDate</span><span class="p">,</span> <span class="nx">weight</span><span class="p">,</span> <span class="nx">height</span><span class="p">){</span>        </div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">person</span> <span class="o">=</span> <span class="nx">Person</span><span class="p">(</span><span class="nx">firstName</span><span class="p">,</span> <span class="nx">lastName</span><span class="p">,</span> <span class="nx">birthDate</span><span class="p">);</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">bmi</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nx">weight</span> <span class="o">/</span> <span class="p">(</span><span class="nx">height</span><span class="o">*</span><span class="nx">height</span><span class="p">);</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">isWeightNormal</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kd">var</span> <span class="nx">currentBmi</span> <span class="o">=</span> <span class="nx">bmi</span><span class="p">()</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nx">currentBmi</span> <span class="o">&gt;</span> <span class="mi">25</span><span class="p">){</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="kc">false</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nx">currentBmi</span> <span class="o">&lt;</span> <span class="mf">18.5</span><span class="p">){</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="kc">false</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="kc">true</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//we make isWeightNormal method public</span></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nx">person</span><span class="p">.</span><span class="nx">isWeightNormal</span> <span class="o">=</span> <span class="nx">isWeightNormal</span><span class="p">;</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nx">person</span><span class="p">;</span>   </div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC55'><br/></div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//we make the fitnessAddict object constructor public</span></div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="p">{</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="s2">&quot;FitnessAddict&quot;</span><span class="o">:</span> <span class="nx">FitnessAddict</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC60'><span class="p">})()</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1385611/f061943c214b15ce5a791348aaea6e1949e0acd9/noFrameworkJsFramework.js" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1385611#file_no_framework_js_framework.js" style="float:right;margin-right:10px;color:#666">noFrameworkJsFramework.js</a>
            <a href="https://gist.github.com/1385611">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Usage of the example:</p>
<div id="gist-1385615" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">var</span> <span class="nx">fa</span> <span class="o">=</span> <span class="nx">persons</span><span class="p">.</span><span class="nx">FitnessAddict</span><span class="p">(</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="s2">&quot;Bar&quot;</span><span class="p">,</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="s2">&quot;Baz&quot;</span><span class="p">,</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="mi">1990</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="mi">80</span><span class="p">,</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="mf">1.8</span><span class="p">)</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC8'><span class="nx">fa</span><span class="p">.</span><span class="nx">isWeightNormal</span><span class="p">()</span> <span class="c1">// true</span></div><div class='line' id='LC9'><span class="nx">fa</span><span class="p">.</span><span class="nx">saySomething</span><span class="p">()</span> <span class="c1">// &quot;bar&quot;</span></div><div class='line' id='LC10'><span class="nx">fa</span><span class="p">.</span><span class="nx">name</span><span class="p">()</span> <span class="c1">// &quot;Bar Baz&quot;    </span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1385615/3a49c0bb919cd7580b79d73559eef1bb7f38a298/noFrameworkJsFramework2.js" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1385615#file_no_framework_js_framework2.js" style="float:right;margin-right:10px;color:#666">noFrameworkJsFramework2.js</a>
            <a href="https://gist.github.com/1385615">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>The first example proves, that we can achieve all of our goals through simple Javascript, without the need for frameworks. The additional benefit is that, because all is private by default, we improve the &#8222;cleanliness&#8221; of our API.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2011/11/22/the-no-framework-js-framework/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Kierunek Babilon pt.3 &#8211; jak wygląda development w Javie ?</title>
		<link>http://blog.wsoczynski.pl/2011/10/16/kierunek-babilon-pt-3-jak-wyglada-development-w-javie/</link>
		<comments>http://blog.wsoczynski.pl/2011/10/16/kierunek-babilon-pt-3-jak-wyglada-development-w-javie/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 10:47:17 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=667</guid>
		<description><![CDATA[Dewelopment w Javie fundamentalnie różni się od flow do którego jesteśmy przyzwyczajeni w przypadku aplikacji Pehapowych. Wynika to przede wszystkim z samej &#8222;natury&#8221; obu platform &#8211; PHP jest językiem interpretowanym, natomiast Java kompilowanym. Wobec tego, tworzenie, czy zmiana kodu wygląda zupełnie inaczej. Jeżeli bym miał podsumować jednym słowem tworzenie kodu w PHP, to tym słowem [...]]]></description>
			<content:encoded><![CDATA[<p>Dewelopment w Javie fundamentalnie różni się od flow do którego jesteśmy przyzwyczajeni w przypadku aplikacji Pehapowych. Wynika to przede wszystkim z samej &#8222;natury&#8221; obu platform &#8211; PHP jest językiem interpretowanym, natomiast Java kompilowanym. Wobec tego, tworzenie, czy zmiana kodu wygląda zupełnie inaczej.</p>
<p><span id="more-667"></span>Jeżeli bym miał podsumować jednym słowem tworzenie kodu w PHP, to tym słowem było by &#8222;var_dump&#8221;. Pisząc jakiś kod, jesteśmy przyzwyczajeni do tego, że możemy go w każdej chwili zmodyfikować a potem sprawdzić efekty jego działania przy pomocy przywołanej wcześniej metody. Oczywiście są osoby, które w tym celu używają debuggera, jednakże jak wszyscy wiemy, są problemy z jego integracją z różnorakimi IDE i generalnie &#8222;var_dump&#8221; wydaje się być dość uniwersalnym narzędziem.</p>
<p>Pisząc w Javie, var_dump jest pierwszym z naszych pehapowych przyzwyczajeń, które powinniśmy schować do szuflady. Po pierwsze dlatego, że nie ma odpowiednika takiej funkcji w Javie, a po drugie dlatego, że var_dump driven development nie ma tam żadnych sensownych racji bytu. Dzieje się tak ze względu na czas jaki zajmuje deployment kodu &#8211; każda zmiana, jaką wprowadzimy w kodzie Javowym wymaga rekompilacji zmienionych klas i restartu serwera, co może trwać dość długo (np. w moim projekcie taka operacja trwa mniej więcej około 5 minut). Powstały oczywiście pewne solucje by temu zaradzić, takie jak np. podmienianie klas w trakcie działania serwera (Hot Swap), jednakże nie działają one we wszystkich przypadkach (jak dodanie, bądź usunięcie metody jakieś klasy).</p>
<p>Jak więc sobie radzić w takich warunkach ? Po pierwsze, musimy się zaprzyjaźnić z debuggerem. Wkrótce stanie się on naszym najlepszym przyjacielem, na którym będziemy polegać w każdej sytuacji. Debugger jest standardowo wbudowany w każde Javowe IDE, więc nie będziemy mieli żadnych problemów w korzystaniu z niego. Możliwości debuggera są naprawdę potężne i zaczynają się od przechodzenia kodu krok po kroku i podglądania wartości zmiennych, aż po zmianę ich wartości w locie oraz &#8222;cofanie się wstecz&#8221; w wykonaniu kodu.</p>
<p>Debuggera oczywiście najczęściej będziemy używać przy okazji poprawiania błędów. Jak natomiast sprawa się ma przy tworzeniu nowego kodu ? Tutaj z pomocą przychodzi nam dobrze znana, również z świata PHP technika Test Driven Development. Stosując TDD w kombinacji z debuggerem możemy dość skutecznie i szybko rozwijać nasz kod. Przy czym generalnie obowiązuje zasada, by raczej napisać jak najwięcej kodu przed jego testowaniem &#8211; nawet kompilacja testu, mimo, że jest to bardzo mała ilość kodu w porównaniu do całej aplikacji, którą depoloyujemy na serwerze nie jest natychmiastowa i chwilkę trwa. Jeżeli w tej chwili wyobraziliście sobie, że kompilujecie test tylko po to, żeby okazało się, że z jakiś głupich powodów nie działa, to mam dla Was dobrą informacje &#8211; dzięki statycznej naturze Javy, wszystkie &#8222;głupie&#8221; błędy zwykle podkreśli Wam na czerwono Wasz edytor, albo ostatecznie kompilator w momencie kompilacji.</p>
<p>Na koniec jeszcze taka mała uwaga odnośnie plików Javascriptowych. Zwykle bywa tak, że pliki źródłowe JS są częścią naszego Javowego projektu, w konsekwencji one również deployowane są na serwer wraz ze skompilowanymi klasamy Javy. W rezultacie, każda zmiana plików JS wymaga ponownego deployu projektu oraz restartu serwera co jak już wiemy &#8211; trwa dość długo. Na szczęście jak zwykle są na to sposoby <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Po pierwsze, jeżeli tylko chcemy zmienić coś w JS do celów testowych, to wieść gminna niesie, że narzędzia deweloperskie Chrome&#8217;a  pozwalają zmieniać Javascript &#8222;w locie&#8221;. Po drugie, w przypadku InteliJ Idea, istnieje opcja &#8222;update resources&#8221;, która podmienia tylko obrazki, js i inne tego typu pliki dość szybko, bez potrzeby restartu serwera.</p>
<p>Tym radosnym akcentem kończę ten artykuł i ogłaszam, że jest to już ostatni wpis z serii &#8222;Kierunek Babilon&#8221;, oczywiście dalej zamierzam pisać o PHP i Javie, ale już w trochę innym kontekście.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2011/10/16/kierunek-babilon-pt-3-jak-wyglada-development-w-javie/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Google Dart &#8211; pierwsze wrażenie</title>
		<link>http://blog.wsoczynski.pl/2011/10/10/google-dart-pierwsze-wrazenie/</link>
		<comments>http://blog.wsoczynski.pl/2011/10/10/google-dart-pierwsze-wrazenie/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 09:43:39 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[dart]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=653</guid>
		<description><![CDATA[Dzisiaj Google zaprezentował na blogu chromium pierwsze informacje na temat swojego nowego języka &#8222;Dart&#8221;. Dart prezentowany jest przez firmę z Mountain View jako język do &#8222;strukturalnego programowanie webowego&#8221;, mający docelowo zastąpić Javascript w roli głównego narzędzia do pisania aplikacji webowych po stronie przeglądarki. Postanowiłem przyjrzeć się szybko jak język ten wygląda i podzielić się pierwszymi [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj Google zaprezentował na blogu chromium pierwsze informacje na temat swojego nowego języka &#8222;Dart&#8221;. Dart prezentowany jest przez firmę z Mountain View jako język do &#8222;strukturalnego programowanie webowego&#8221;, mający docelowo zastąpić Javascript w roli głównego narzędzia do pisania aplikacji webowych po stronie przeglądarki. Postanowiłem przyjrzeć się szybko jak język ten wygląda i podzielić się pierwszymi wrażeniami jakie mi przyszły do głowy. W dalszej części artykułu, będę się opierał na<a href="http://www.dzone.com/links/r/dart_structured_web_programming_the_new_googles_p.html"> jednym z artykułów</a>, który jest mini tutorialem do Darta i przedstawia dość obszernie kod, który zwykle jest używany przez programistów jak i różne Dartowe smaczki.</p>
<p>Na pierwszy rzut oka Dart wygląda na kolejny klon Javy / C# z większym podobieństwem do C#. Jak każdy w miarę nowoczesny język posiada funkcje anonimowe i domknięcia. Jest oparty na klasach więc większość osób łatwo się w nim odnajdzie. Jest to główna i fundamentalna różnica pomiędzy Dartem a Javascriptem, oprócz oczywiście składni. Poza tą różnicą Dart wspiera DSL (domain specific languages), dzięki temu, że podobnie jak w Scali, operatory są tak naprawdę zwykłymi metodami, czyli mamy możliwość wywoływania metod bez użycia kropki. Dart wspiera też opcjonalne typowanie &#8211; możemy zadeklarować typ zmiennej i będzie on sprawdzony w czasie kompilacji.</p>
<p>Jeżeli porównamy Darta do PHP, to oprócz wcześniej wymienionych ficzerów jedyną w zasadzie różnicą będzie obsługa funkcji akcesorowych znanych z C# (metod prefiksowanych przez get/set).</p>
<p>Dart posiada jeszcze kilka mniej znaczących smaczków, które są głównie lukrem składniowym i mogą być z łatwością odtworzone przy użyciu innych konstrukcji językowych. Pierwszym z takich smaczków są nazwane konstruktory &#8211; czyli googlowy sposób na przeciążanie konstruktora w języku dynamicznie typowanym nieobsługującym przeciążania metod. Drugi sposób to metody fabryczne, czyli metody klasy poprzedzone słowem kluczowym &#8222;factory&#8221;, ich zastosowanie jest dla mnie generalnie mało zrozumiałe. Ostatnim &#8222;ficzerem&#8221; jaki zauważyłem są &#8222;krótkie konstruktory&#8221;, które oszczędzają nam trochę pisania &#8211; zamiast:</p>
<pre class="brush: jscript; title: ; notranslate">
class Point {
    num x, y;
    Point(num x, num y) {
        this.x = x;
        this.y = y;
    }
}
</pre>
<p>można napisać tak:</p>
<pre class="brush: jscript; title: ; notranslate">
class Point {
   num x, y;
   Point(this.x, this.y);
}
</pre>
<p>Podsumowując &#8211; szału nie ma. Co jak co, ale po Google spodziewałem się więcej. Czego mi brakuje ?</p>
<ol>
<li>Większego nacisku na programowanie funkcyjne &#8211; np. <strong>łatwego sposóbu </strong>na tworzenie immutable data types, chociażby a&#8217;la Scala:
<pre class="brush: scala; title: ; notranslate"> case class User(firstName: String, lastName: String, birthday: Date) </pre>
</li>
<li>Anonimowe klasy</li>
<li><del>Wsparcie dla przetwarzania równoległego / wielowątkowego</del> &#8211; jest w postaci aktorów (podziękowania dla wookieba)</li>
<li>Przestrzeni nazw / modułów</li>
<li>&#8222;Odwróconych&#8221; interfejsów a&#8217;la GO, czyli coś w rodzaju:
<pre class="brush: java; title: ; notranslate">
class Test {
    Integer foo(){
        return 1;
    }
}

interface Foo {
     Integer foo();
}

Foo someFoo = new Test(); /* ok! - nie ma błędu -
klasa Test nie deklaruje, że implementuje interfejs Foo,
ale sygnatura jej metod jest zgodna z nim */
</pre>
<p>Więcej na stronie <a href="http://blog.8thlight.com/steven-degutis/2011/09/13/interfaces-in-go.html">8tlight</a></li>
</ol>
<p>Jestem ciekaw jaka jest Wasza opinia ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2011/10/10/google-dart-pierwsze-wrazenie/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Nowe szaty bloga</title>
		<link>http://blog.wsoczynski.pl/2011/10/09/nowe-szaty-bloga/</link>
		<comments>http://blog.wsoczynski.pl/2011/10/09/nowe-szaty-bloga/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 15:15:43 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[ogólne]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=650</guid>
		<description><![CDATA[Jeżeli często odwiedzacie mojego bloga to domyślam się, że już zauważyliście zmianę layoutu, która dokonałem dnia dzisiejszego. Mam nadzieje, że się wam spodoba. Skórka jest trochę bardziej funkcjonalna od ostatniej ponieważ posiada między innymi opcje wątkowania komentarzy i wyświetlania gravatarów. Poza zmianą skórki, zrobiłem też trochę porządku w linkach oraz chyba najważniejsze &#8211; zmieniłem tytuł [...]]]></description>
			<content:encoded><![CDATA[<p>Jeżeli często odwiedzacie mojego bloga to domyślam się, że już zauważyliście zmianę layoutu, która dokonałem dnia dzisiejszego. Mam nadzieje, że się wam spodoba. Skórka jest trochę bardziej funkcjonalna od ostatniej ponieważ posiada między innymi opcje wątkowania komentarzy i wyświetlania gravatarów. Poza zmianą skórki, zrobiłem też trochę porządku w linkach oraz chyba najważniejsze &#8211; zmieniłem tytuł bloga.</p>
<p>Poprzedni tytuł &#8222;La Galere / Propaganda Kapitana Pazura&#8221;, już jakiś czas przestał pasować do treści strony, z prostej przyczyny jaką było przeniesienie prywatnych przemyśleń na mój drugi site. Ten blog stał się stricte zawodowo &#8211; programistyczny, postanowiłem więc ujednolicić tytuł z podpisem na goldenline &#8211; &#8222;programista eksplorator&#8221;. Dzięki takiemu ujednoliceniu chce podkreślić takie cechy mojej osoby, jak kreatywność, skłonność do patrzenia na problemy z różnych perspektyw oraz szeroki zakres wiedzy zawodowej jaki mam nadzieje posiadam ( ;p ).</p>
<p>Mam nadzieje, że będziecie tak często (albo nawet częściej) odwiedzać moją stronę jak dotąd <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2011/10/09/nowe-szaty-bloga/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trzy style</title>
		<link>http://blog.wsoczynski.pl/2011/10/02/trzy-style/</link>
		<comments>http://blog.wsoczynski.pl/2011/10/02/trzy-style/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 21:50:58 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[functional programming]]></category>
		<category><![CDATA[object oriented programming]]></category>
		<category><![CDATA[ood]]></category>
		<category><![CDATA[procedural programming]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=636</guid>
		<description><![CDATA[Tak przy okazji refleksji i rozmyślań filozoficznych, postanowiłem zademonstrować, jak w języku pokroju Javy zaimplementować rozwiązanie problemu obliczania ceny wszystkich produktów w koszyku. Proceduralnie: Obiektowo: Funkcyjne: Czego można dowiedzieć się z tych prostych przykładów ? Otóż można zauważyć w każdym z nich cechy charakterystyczne danego stylu programowania i tego na co kładzie nacisk. Proceduralny &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Tak przy okazji refleksji i rozmyślań filozoficznych, postanowiłem zademonstrować, jak w języku pokroju Javy zaimplementować rozwiązanie problemu obliczania ceny wszystkich produktów w koszyku.<br />
<span id="more-636"></span><br />
Proceduralnie:</p>
<pre class="brush: java; title: ; notranslate">

public class Produkt {
    private Integer cena = 0;
    private Integer ilosc = 0;
    private String nazwa = &quot;&quot;;

   public Produkty(Integer cena, Integer ilosc, String nazwa);

    /** tu gettery i settery dla wszystkich parametrow parametrow **/

}

public class Koszyk {

    private List&lt;Produkt&gt; produkty;

    public List&lt;Produkty&gt; getProdukty();
    public void setProdukty(List&lt;Produkty&gt; produkty);

}

public class KoszykUtil {

    public static Integer podliczKoszyk(Koszyk koszyk){
        List&lt;Produkty&gt; produkty = koszyk.getProdukty();
        Integer suma = 0;        

        for(Produkt produkt: produkty){
            suma+= produkt.getCena() * produkt.getIlosc();
        }
        return suma;
    }
}

Produkt p1 = new Produkt(12, 1, &quot;baton z ropą&quot;);
Produkt p2 = new Produkt(13, 1, &quot;baton z benzyną&quot;);
List&lt;Produkty&gt; produkty = new ArrayList&lt;Produkty&gt;();
produkty.add(p1);
produkty.add(p2);

Koszyk k = new Koszyk();
k.setProdukty(produkty);

Integer suma = KoszykUtil.podliczKoszyk(k);
System.out.println(suma);
</pre>
<p>Obiektowo:</p>
<pre class="brush: java; title: ; notranslate">

public class Produkt {

    private final String nazwa;
    private final Integer cena;
    private Integer ilosc;

    public Produkt(String nazwa, Integer cena, Integer ilosc);
    public Integer suma(){
        return cena*ilosc;
   }

}

public class Koszyk {

    private List&lt;Produkt&gt; produkty;
    private Integer wartosc = 0;    

    public dodajProdukt(Produkt produkt){
        produkty.add(produkt);
        wartosc += produkt.suma();
    }

    public Integer wartosc(){
        return wartosc;
    }
}

Koszyk k1 = new Koszyk();
Produkt p1 = new Produkt(&quot;baton z benzyna&quot; , 10, 1);
Produkt p2 = new Produkt(&quot;baton z ropą&quot;, 10, 1);
k1.dodajProdukt(p1);
k1.dodajProdukt(p2);

Integer suma = k1.wartosc();
System.out.println(suma);
</pre>
<p>Funkcyjne:</p>
<pre class="brush: java; title: ; notranslate">

public interface Sumator&lt;D&gt; {

     public Integer sumuj(Integer suma, D element);
}

public class ListUtil {

    public static &lt;T&gt; Integer sumuj(Sumator s, List&lt;T&gt; dane) {
        Integer suma = 0;
        for (T element : dane) {
            suma = s.sumuj(suma, element);
        }
        return suma;

    }
}

public final class Produkt {
    public final Integer cena;
    public final String nazwa;

    public Produkt(String nazwa, Integer cena){
        this.nazwa = nazwa;
        this.cena = cena;
    }
}

Produkt p1 = new Produkt(&quot;baton z ropą&quot;, 10);
Produkt p2 = new Produkt(&quot;baton z benzyna&quot;, 10);

List&lt;Produkt&gt; produkty = new ArrayList&lt;Produkt&gt;();
produkty.add(p1);
produkty.add(p2);

produkty = java.util.Collections.unmodifiableList(produkty);
Integer suma = ListUtil.sumuj(new Sumator&lt;Produkt&gt;() {

            @Override
            public Integer sumuj(Integer suma, Produkt element) {
                return suma + element.cena;
            }
        }, produkty);

System.out.println(suma);
</pre>
<p>Czego można dowiedzieć się z tych prostych przykładów ? Otóż można zauważyć w każdym z nich cechy charakterystyczne danego stylu programowania i tego na co kładzie nacisk.</p>
<ol>
<li>Proceduralny &#8211; stawia na swobodny przepływ danych.</li>
<li>Obiektowy &#8211; abstrakcja, enkapsulacja, odwzorowanie modelu domeny</li>
<li>Funkcyjny &#8211; niezmienność (immutability), generyczność i funkcja jako pełnoprawny element języka (tutaj emulowana przez anonimową klasę)</li>
</ol>
<p>Mam nadzieje, że powyższe przykłady były pouczające.Jestem bardzo ciekawy, które z powyższych rozwiązań przypadło Wam do gustu i dlaczego, oraz jaki styl preferujecie.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2011/10/02/trzy-style/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Kierunek Babilon pt.2</title>
		<link>http://blog.wsoczynski.pl/2011/09/09/kierunek-babilon-pt-2/</link>
		<comments>http://blog.wsoczynski.pl/2011/09/09/kierunek-babilon-pt-2/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 17:41:38 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=628</guid>
		<description><![CDATA[Minęło już półtora tygodnia od czasu jak zacząłem moją pracę w Sabre i myślę, że jest to dobry czas by pokusić się o małe podsumowanie tego jakie są moje wrażenia i czy moje oczekiwania, które przedstawiłem w poprzedniej części artykułu w jakimś stopniu miały okazję się spełnić. Dla przypomnienia, powody, dla których postanowiłem zmienić środowisko [...]]]></description>
			<content:encoded><![CDATA[<p>Minęło już półtora tygodnia od czasu jak zacząłem moją pracę w Sabre i myślę, że jest to dobry czas by pokusić się o małe podsumowanie tego jakie są moje wrażenia i czy moje oczekiwania, które przedstawiłem w poprzedniej części artykułu w jakimś stopniu miały okazję się spełnić.</p>
<p><span id="more-628"></span>Dla przypomnienia, powody, dla których postanowiłem zmienić środowisko z PHP na Javę:</p>
<ol>
<li>Rodzaj projektów &#8211; miałem dość projektów typu &#8222;strona &#8211; wizytówka&#8221;, portali, cms-ów etc</li>
<li>Organizacja pracy &#8211; brak sformalizowanego procesu wytwarzania oprogramowania, brak specyfikacji, metodologii etc</li>
<li>Zarobki</li>
</ol>
<p>Czy wobec perspektywy tych trzech powodów, zmiana miała sens ? Jak najbardziej ! Po półtora tygodnia pracy mogę powiedzieć że:</p>
<ol>
<li>Uczestniczę w projekcie a raczej w rozwoju produktu ze skomplikowaną logiką biznesową</li>
<li>Proces wytwarzania kodu jest ściśle sformalizowany</li>
<li>Oprócz zdecydowanej podwyżki, w stosunku do &#8222;PHP-owego okresu mojej kariery&#8221;, mam do dyspozycji wiele bonusów (tzw. socjału oraz szkoleń)</li>
</ol>
<p>Największą różnicą między tym co dotychczas robiłem a tym co teraz robię jest  przede wszystkim rozmach. Realizując projekty PHP-owe dotychczas pracowałem zwykle sam, lub maksymalnie w około 5-cio osobowym zespole, który pracował zwykle w jednym pokoju biurko w biurko.</p>
<p>W obecnej pracy, jestem członkiem działu (nie mylić z oddziałem), który tylko w Polsce liczy ponad 100 osób (w firmie, która tylko w Polsce zatrudnia około 1200 osób), jestem członkiem jednego z 4ech zespołów pracujących nad jednym produktem i bezpośrednio współpracuje z około 20-toma osobami. To dość duża zmiana mentalna.</p>
<p>Jeszcze większą mentalną zmianą jest to, że często się zdarza, że nad jednym &#8222;user story&#8221; (odpowiednik pojedynczego &#8222;ficzera&#8221;) pracuje nierzadko z kilkoma osobami. Zmienia to zupełnie sposób pracy i wymaga ciągłej komunikacji, zrozumienia i trzymania się ściśle ustalonych standardów.</p>
<p>Kolejnym faktem, który wiele zmienia, są Unit Testy. Pierwszy raz, rozwijam aplikację, której część biznesowa jest prawie w całości pokryta testami jednostkowymi (bo w przypadku frameworków to jest norma).</p>
<p>Generalnie wiele rzeczy prowadzonych jest &#8222;książkowo&#8221;, jak np. praca w metodyce Scrum. Codzienne &#8222;standupy&#8221;, iteracje i ich planowanie &#8211; uczestniczę w nich i widzę, że ma to sens.</p>
<p>Wracając do rzeczy czysto programistycznych mogę powiedzieć tyle, że łyknąłem już dość dużo Javy, przede wszystkim wszelakich adnotacji i typów generycznych, sposobu obchodzenia się z projektami &#8211; Maven, integracja z IDE, debbugger, Tomcat oraz frameworki JUnit oraz Mockito.</p>
<p>Cały czas tutaj wymieniam plusy i zalety, natomiast nie wspomniałem o kilku rzeczach, które można by nazwać wadami tej roboty. Pierwsze co od razu rzuciło mi się w oczy to dość duża biurokracja &#8211; na wstępie musiałem wypełnić 11-stronnicowy formularz. Druga kwestia to niestety nieproporcjonalność wyposażenia mojego laptopa do ogromu projektu (poranny update potrafi trwać nawet  15 minut !) &#8211; niestety nawet 4gb ramu i najnowszy Core i5 nie zapewniają w jego przypadku komfortowej pracy.</p>
<p>Tak więc pokrótce wyglądają moje wrażenia z pierwszego tygodnia pracy. Jeżeli ktoś chciałby również spróbować pracy w &#8222;corpo&#8221; z Javą, dajcie znać, chętnie Was polecę <img src='http://blog.wsoczynski.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2011/09/09/kierunek-babilon-pt-2/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Nowości z php.internals &#8211; newInstanceWithoutConstructor()</title>
		<link>http://blog.wsoczynski.pl/2011/08/25/nowosci-z-php-internals-newinstancewithoutconstructor/</link>
		<comments>http://blog.wsoczynski.pl/2011/08/25/nowosci-z-php-internals-newinstancewithoutconstructor/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 10:37:22 +0000</pubDate>
		<dc:creator>Wojciech Soczyński</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[newInstanceWithoutConstructor()]]></category>
		<category><![CDATA[php.internals]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://blog.wsoczynski.pl/?p=626</guid>
		<description><![CDATA[W dzisiejszym wpisie, Sebastian Bergmann, zaproponował dodanie do PHP metody ReflectionClass::newInstanceWithoutConstructor(), która to pozwoliła by na tworzenie nowej instancji klasy z pominięciem konstruktora, podobnie jak to odbywa się w przypadku deserializacji. Osobiście jestem bardzo entuzjastyczny wobec zgłoszonej propozycji i chętnie powitałbym ją w nadchodzącej wersji 5.4 interpretera. Zastosowań jest całe multum, natomiast chyba najbardziej przydatna [...]]]></description>
			<content:encoded><![CDATA[<p>W <a href="http://news.php.net/php.internals/54924">dzisiejszym wpisie</a>, <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a>, zaproponował dodanie do PHP metody <code>ReflectionClass::newInstanceWithoutConstructor()</code>, która to pozwoliła by na tworzenie nowej instancji klasy z pominięciem konstruktora, podobnie jak to odbywa się w przypadku deserializacji. Osobiście jestem bardzo entuzjastyczny wobec zgłoszonej propozycji i chętnie powitałbym ją w nadchodzącej wersji 5.4 interpretera.</p>
<p>Zastosowań jest całe multum, natomiast chyba najbardziej przydatna jest ta funkcja dla twórców wszelakiej maści frameworków i bibliotek (szczególnie ORM). Dzięki niej, nie trzeba już będzie korzystać ze sztuczek z serialize/deserialize, by stworzyć obiekt z pominięciem konstruktora.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wsoczynski.pl/2011/08/25/nowosci-z-php-internals-newinstancewithoutconstructor/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

