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

<channel>
	<title>KoziołekWeb</title>
	<atom:link href="http://koziolekweb.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://koziolekweb.pl</link>
	<description>Sięgam tam gdzie wzrok nie sięga, a tam NullPointerException</description>
	<lastBuildDate>Wed, 01 Feb 2012 14:56:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<image>\n<url>http://koziolekweb.pl/icon.png</url>\n<title>KoziołekWeb</title>\n<link>http://koziolekweb.pl</link>\n<width></width>\n<height></height>\n</image>\n		<item>
		<title>Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości</title>
		<link>http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/</link>
		<comments>http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 14:56:55 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Różności]]></category>
		<category><![CDATA[Piractwo]]></category>
		<category><![CDATA[Polska]]></category>
		<category><![CDATA[Prawo]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2396</guid>
		<description><![CDATA[Na Polygamii pojawił się ciekawy tekst nt. aresztowania gościa za posiadanie przerobionej konsoli. Rzecz w tym, że on taka konsolę, używaną, kupił. Jeżeli sięgniemy do Ustawy o Prawie Autorskim i Prawach Pokrewnych i przeczytamy dzielnie artykuł 118 tejże ustawy: Art. 118. 1. Kto w celu osiągnięcia korzyści majątkowej przedmiot będący nośnikiem utworu, artystycznego wykonania, fonogramu, [...]]]></description>
			<content:encoded><![CDATA[<p>Na Polygamii pojawił się ciekawy <a href="http://polygamia.pl/Polygamia/1,107162,11069051,Uwazaj_na_uzywane_konsole__za_kupienie_przerobionej.html">tekst</a> nt. aresztowania gościa za posiadanie przerobionej konsoli. Rzecz w tym, że on taka konsolę, używaną, kupił.<br />
Jeżeli sięgniemy do <a href="http://isap.sejm.gov.pl/DetailsServlet?id=WDU19940240083">Ustawy o Prawie Autorskim i Prawach Pokrewnych</a> i przeczytamy dzielnie artykuł 118 tejże ustawy:</p>
<blockquote><p>Art. 118.<br />
1. Kto w celu osiągnięcia korzyści majątkowej przedmiot będący nośnikiem utworu, artystycznego wykonania, fonogramu, wideogramu rozpowszechnianego lub zwielokrotnionego bez uprawnienia albo wbrew jego warunkom nabywa lub pomaga w jego zbyciu albo przedmiot ten przyjmuje lub pomaga w jego ukryciu, podlega karze pozbawienia wolności od 3 miesięcy do lat 5.<br />
2. Jeżeli sprawca uczynił sobie z popełniania przestępstwa określonego w ust. 1 stałe źródło dochodu albo działalność przestępną, określoną w ust. 1, organizuje lub nią kieruje, podlega karze pozbawienia wolności od roku do lat 5.<br />
3. Jeżeli na podstawie towarzyszących okoliczności sprawca przestępstwa określonego w ust. 1 lub 2 powinien i może przypuszczać, że przedmiot został uzyskany za pomocą czynu zabronionego, podlega grzywnie, karze ograniczenia wolności albo pozbawienia wolności do lat 2.<br />
Art. 118/1.<br />
1. Kto wytwarza urządzenia lub ich komponenty przeznaczone do niedozwolonego usuwania lub obchodzenia skutecznych technicznych zabezpieczeń przed odtwarzaniem, przegrywaniem lub zwielokrotnianiem utworów lub przedmiotów praw pokrewnych albo dokonuje obrotu takimi urządzeniami lub ich komponentami, albo reklamuje je w celu sprzedaży lub najmu, podlega grzywnie, karze ograniczenia wolności albo pozbawienia wolności do lat 3.<br />
2. Kto posiada, przechowuje lub wykorzystuje urządzenia lub ich komponenty, o których mowa w ust. 1, podlega grzywnie, karze ograniczenia wolności albo pozbawienia wolności do roku.</p></blockquote>
<p>Przy czym nas interesuje artykuł 118/1 (super metoda na nowelizację prawa bez wprowadzania zmian w numeracji &#8211; dodać indeks do numeru artykułu), który trafił do ustawy jako <a href="http://isap.sejm.gov.pl/DetailsServlet?id=WDU20000530637+2000%2407%2422&#038;min=1">nowelizacja</a> w 2000 AD. </p>
<p>Cóż on oznacza? Ano na zdrowy rozum oznacza on ni mniej ni więcej, że można każdego posadzić <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Dziś w standardzie komputera jest &#8220;urządzenie lub komponent&#8221; służący do powielania &#8211; nagrywarka. Oczywiście bez specjalistycznego oprogramowania nie można skopiować zabezpieczonej płyty, ale nie róbmy se jaj&#8230; takie programy są dostępne od ręki w necie jako różnego typu zgrywajki do ISO. </p>
<p>Ustawodawca jak zawsze podąża zgodnie kierunkiem wyznaczanym przez duch czasu i duch maszyny, ale jak widać zwrot jest nieteges&#8230;</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/&amp;title=Dlaczego+ustawe+o+prawie+autorskim+i+prawach+pokrewnych+nale%C5%BCy+wyrzuci%C4%87+do+kosza%26%238230%3B+w+ca%C5%82o%C5%9Bci" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Del.icio.us" alt="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/&amp;title=Dlaczego+ustawe+o+prawie+autorskim+i+prawach+pokrewnych+nale%C5%BCy+wyrzuci%C4%87+do+kosza%26%238230%3B+w+ca%C5%82o%C5%9Bci" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do digg" alt="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Technorati" alt="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/&amp;title=Dlaczego+ustawe+o+prawie+autorskim+i+prawach+pokrewnych+nale%C5%BCy+wyrzuci%C4%87+do+kosza%26%238230%3B+w+ca%C5%82o%C5%9Bci" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Stumble Upon" alt="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/&amp;title=Dlaczego+ustawe+o+prawie+autorskim+i+prawach+pokrewnych+nale%C5%BCy+wyrzuci%C4%87+do+kosza%26%238230%3B+w+ca%C5%82o%C5%9Bci" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Google Bookmarks" alt="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/&amp;t=Dlaczego+ustawe+o+prawie+autorskim+i+prawach+pokrewnych+nale%C5%BCy+wyrzuci%C4%87+do+kosza%26%238230%3B+w+ca%C5%82o%C5%9Bci" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do FaceBook" alt="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/&amp;title=Dlaczego+ustawe+o+prawie+autorskim+i+prawach+pokrewnych+nale%C5%BCy+wyrzuci%C4%87+do+kosza%26%238230%3B+w+ca%C5%82o%C5%9Bci" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do wykop.pl" alt="dodaj 'Dlaczego ustawe o prawie autorskim i prawach pokrewnych należy wyrzucić do kosza&#8230; w całości' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/02/01/dlaczego-ustawe-o-prawie-autorskim-i-prawach-pokrewnych-nalezy-wyrzucic-do-kosza-w-calosci/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zapominamy o metodzie close</title>
		<link>http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/</link>
		<comments>http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 10:00:06 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2393</guid>
		<description><![CDATA[W C# mamy using, czyli taką konstrukcję, która przypomina trochę żonę &#8211; kurę domową (zakładając, że program to małżeństwo, a programista to mąż). Maż idzie do kibla robi swoje i zapomina wywołać close na desce. Żona samodzielnie zamknie deskę i nie będzie marudzić. W Javie żona ma inne podejście. Nic nie mówi i nic nie [...]]]></description>
			<content:encoded><![CDATA[<p>W C# mamy <samp>using</samp>, czyli taką konstrukcję, która przypomina trochę żonę &#8211; kurę domową (zakładając, że program to małżeństwo, a programista to mąż). Maż idzie do kibla robi swoje i zapomina wywołać <samp>close</samp> na desce. Żona samodzielnie zamknie deskę i nie będzie marudzić.<br />
W Javie żona ma inne podejście. Nic nie mówi i nic nie robi. Po prostu jak raz na pewien czas z kibla będzie ulatniać się smród ponieważ nie zamknięto deski to maż w końcu nauczy się, żeby deskę opuszczać (nazywamy to tresurą małżeńską). Tu rolę gderającej i przypominającej o opuszczeniu deski teściowej pełnią narzędzia do sprawdzania poprawności kodu. Tak jak teściową zapraszamy do siebie raz na pewien czas tak i raz na pewien czas kod warto przepuścić przez findbuga, checkstyle czy PMD.<br />
W Scali można zrobić jeszcze ciekawszą rzecz. Otóż o ile nie ma <samp>using</samp> to można sobie je napisać (za `Beginning Scala` D. Pollaka):</p>
<p class="listing">Listing 1. Definicja <samp>using</samp> w Scali</p>
<pre class="scala" name="code">object Using{
    def using[A <: {def close(): Unit}, B](param: A)(f:A => B): B = {
       try{
          f(param)
       } finally {
          param.close();
       }
    }
}</pre>
<p>I później użyć w kodzie:</p>
<p class="listing">Listing 2. Użycie <samp>using</samp> w Scali</p>
<pre class="scala" name="code">using(statement.executeQuery("select * from dual")){ resultSet =>{
     // reszta kodu
  }
}</pre>
<p>Taka konstrukcja przypomina żonę, która okazjonalnie zamknie deskę (o ile będzie w pobliżu czytaj mąż użyje <samp>using</samp>).<br />
Generalnie w tym przypadku definiujemy funkcję, która jako parametr przyjmuje obiekt klasy, w której zdefiniowano metodę <samp>close()</samp> i dodatkowo przyjmuje jako drugi element coś, nazwane <samp>f</samp> co dokonuje transformacji A na B. To jest znany z Pythona tzw. &#8220;Duck Typing&#8221; (Jeżeli coś chodzi jak kaczka i kwacze jak kaczka to jest to kaczka &#8211; wnioskowanie typu na podstawie bebechów). </p>
<p>Jak widać konstrukcja jest fajna i przydatna. Zatem można by spróbować przenieść ją bezpośrednio do Javy (to też jest tresura małżeńska). Oczywiście jest to zabawka, której używanie w kodzie produkcyjnym jest średnio rozważne&#8230; ale niema ryzyka nie ma zabawy. Najwyżej się coś wywali.</p>
<p class="listing">Listing 3. Definicja <samp>using</samp> w Javie</p>
<pre class="java" name="code">import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Emulator <b>using</b> ze Scali czy C#.
 *
 * @author bartlomiejk
 *
 */
public class Using {

	/**
	 * Wykonuje operacje z body poczym wywołuje <samp>close()</samp> z t.
	 *
	 * @param <T>
	 *            typ generyczny z metodą <samp>close()</samp>
	 * @param t
	 *            zasób.
	 * @param body
	 *            operacja do wykonania.
	 * @throws RuntimeException
	 *             w dwóch przypadkach:
	 *
<ul>
	 *
<li>Brak metody <samp>close()</samp>.</li>

	 *
<li>Security Manager niepozwala na wywołanie metody <samp>close</samp>.</li>

	 *             </ul>

	 */
	public static <T> void using(T t, Unit<T> body) throws RuntimeException {
		Class<? extends Object> tClass = t.getClass();
		try {
			Method method = tClass.getMethod("close");
			method.setAccessible(true);
			try {
				body.perform(t);
			} finally {
				method.invoke(t);
			}
		} catch (SecurityException e) {
			throw new RuntimeException(e);
		} catch (NoSuchMethodException e) {
			throw new RuntimeException(e);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Synchronizowana wersja {@link #using(Object, Unit)}. synchronizacja względem zasobu.
	 *
	 * @see Using#using(Object, Unit)
	 *
	 * @param <T>
	 *            typ generyczny z metodą <samp>close()</samp>
	 * @param t
	 *            zasób.
	 * @param body
	 *            operacja do wykonania.
	 * @throws RuntimeException
	 *             w dwóch przypadkach:
	 *
<ul>
	 *
<li>Brak metody <samp>close</samp>.</li>

	 *
<li>Security Manager niepozwala na wywołanie metody <samp>close</samp>.</li>

	 *             </ul>

	 */
	public static <T> void s_using(T t, Unit<T> body) {
		synchronized (t) {
			using(t, body);
		}
	}

	/**
	 * Interfejs jednostki kodu wywołanej w ramach <samp>try</samp>/<samp>finally</samp>.
	 *
	 * @author bartlomiejk
	 *
	 * @param <T>
	 *            typ generyczny wykorzystywanego zasobu.
	 */
	public interface Unit<T> {
		/**
		 * Wywoływana jednostka kodu.
		 *
		 * @param t
		 *            zasób.
		 */
		public void perform(T t);
	}
}</pre>
<p>Metoda <samp>using</samp> występuje też w synchronizowanej wersji <samp>s_using</samp>, a muteksem jest zasób. Do wykorzystania z zasobami wymagającymi synchronizacji np. plikami.</p>
<p class="listing">Listing 4. Użycie <samp>using</samp> w Javie</p>
<pre class="java" name="code">using(daoSupport.executeQuery(CACHE_SQL), new Unit<ResultSet>() {
	@Override
	public void perform(ResultSet t) {
		try {
			while (t.next()) {
				//...
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
});</pre>
<p>To tyle. Raz jeszcze kod jest ciekawostkowy, niedopracowany i pewno coś będzie wywalał. Zatem używacie na własne ryzyko. Licencja beerware.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/&amp;title=Zapominamy+o+metodzie+close" title="dodaj 'Zapominamy o metodzie close' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Zapominamy o metodzie close' do Del.icio.us" alt="dodaj 'Zapominamy o metodzie close' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/&amp;title=Zapominamy+o+metodzie+close" title="dodaj 'Zapominamy o metodzie close' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Zapominamy o metodzie close' do digg" alt="dodaj 'Zapominamy o metodzie close' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/" title="dodaj 'Zapominamy o metodzie close' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Zapominamy o metodzie close' do Technorati" alt="dodaj 'Zapominamy o metodzie close' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/&amp;title=Zapominamy+o+metodzie+close" title="dodaj 'Zapominamy o metodzie close' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Zapominamy o metodzie close' do Stumble Upon" alt="dodaj 'Zapominamy o metodzie close' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/&amp;title=Zapominamy+o+metodzie+close" title="dodaj 'Zapominamy o metodzie close' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Zapominamy o metodzie close' do Google Bookmarks" alt="dodaj 'Zapominamy o metodzie close' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/&amp;t=Zapominamy+o+metodzie+close" title="dodaj 'Zapominamy o metodzie close' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Zapominamy o metodzie close' do FaceBook" alt="dodaj 'Zapominamy o metodzie close' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/&amp;title=Zapominamy+o+metodzie+close" title="dodaj 'Zapominamy o metodzie close' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Zapominamy o metodzie close' do wykop.pl" alt="dodaj 'Zapominamy o metodzie close' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/31/zapominamy-o-metodzie-close/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Piractwo w ACTA to najmniejszy problem</title>
		<link>http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/</link>
		<comments>http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 18:59:45 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Różności]]></category>
		<category><![CDATA[Świat]]></category>
		<category><![CDATA[ACTA]]></category>
		<category><![CDATA[Polityka]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2388</guid>
		<description><![CDATA[A to dlaczego? Ano dlatego, że internet z samego swojego założenia jest uodporniony na wszelkie próby odcinania użytkowników czy skutecznego blokowania usług. ARPANETW był projektowany by przetrwać konflikt atomowy zatem kilku durni w garniturach z taniego armaniego nie zagrozi raczej sieci. Zresztą był Napster, który nie trzymał się pierwszej zasady Jamesa Hetfielda, &#8220;jeżeni fanów nie [...]]]></description>
			<content:encoded><![CDATA[<p>A to dlaczego? Ano dlatego, że internet z samego swojego założenia jest uodporniony na wszelkie próby odcinania użytkowników czy skutecznego blokowania usług. <a href="http://pl.wikipedia.org/wiki/ARPANET" target="_blank" title="From Wikipedia the definition of: ARPANET" class="wikiterm" >ARPANET</a><sup class="wikiicon" ><em>W</em></sup> był projektowany by przetrwać konflikt atomowy zatem kilku durni w garniturach z taniego armaniego nie zagrozi raczej sieci.</p>
<p>Zresztą był Napster, który nie trzymał się pierwszej zasady Jamesa Hetfielda, &#8220;jeżeni fanów nie stać na płyty Metallica&#8217;i to niech je ukradną&#8221;. Napster nie kradł. Później była Kazaa, czyli sieć wymiany wirusów i pornoli udających seriale. Kazaa przeszła na działalność komercyjną i chyba jeszcze żyje&#8230; o ile ktoś chce kupować zawirusowane pornole&#8230; choć z drugiej strony&#8230;<br />
<a href="http://koziolekweb.pl/wp-content/uploads/2012/01/bazawirusow.jpg"><img src="http://koziolekweb.pl/wp-content/uploads/2012/01/bazawirusow.jpg" alt="" title="bazawirusow" width="500" height="471" class="aligncenter size-full wp-image-2389" /></a><br />
Później nastały czasy eDonkey i jego kolegi eMule, który działał tak jak się nazywał głupio i powoli. Teraz mamy torrenty, a jak ten sposób dystrybucji danych zostanie ograniczony to się wdroży coś innego. Jednym zdaniem ACTA-srakta siadamy wymyślamy nowy protokół wymiany danych (p2p + routing cebulowy + szyfrowanie). Zresztą samym korpo będzie zależało na jak najszybszym stworzeniu protokołów odpornych na ACTA. Nikt nie lubi jak mu władza grzebie w korespondencji.</p>
<p>ACTA to jednak nie tylko szeroko pojęte piractwo muzyczno programistyczne. ACTA to przede wszystkim umowa dotycząca patentów i własności przemysłowej. Po tygodniu sraczki związanej z zagrożeniem odcięciem od porno do dziennikarzy zaczyna <a href="http://www.motoweek.pl/kierowcy-pierwszymi-ofiarami-acta/59173/">powoli trafiać</a> co oznacza ACTA dla przemysłu. </p>
<p>Ano będzie niewesoło. Producenci będą mogli bardzo szybko wykończyć rynek tzw. zamienników. Czy to części samochodowych czy to sprzętu komputerowego czy to w końcu najzwyklejszych wkładów do drukarek. Oczywiście nie nastąpi to od razu. Po prostu w miarę potrzeb będzie się przymykało oko albo producentów &#8220;podróbek&#8221;. Jeszcze gorszą wiadomością jest to, że ACTA dotyczy też rynku leków. Zatem żegnaj tania aspiryno z Polfy&#8230; trza będzie kupować znacznie droższą oryginalną aspirynę Bayera. </p>
<p>No i tyle w tej sprawie. W sumie może się za niedługo okazać, że bardziej niż wizyty policji z okazji pirackiej muzyki należy obawiać się wizyty na błogosławieństwo wymiany śrub w kole na pochodzące od innego dostawcy niż ten wskazany przez producenta.</p>
<p>// EDIT: Wśród sygnatariuszy są Japonia i Korea Południowa, czyli państwa w których dozwoloną praktyką jest szpiegostwo przemysłowe i generalnie podpierdalanie rozwiązań technicznych.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/&amp;title=Piractwo+w+ACTA+to+najmniejszy+problem" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Del.icio.us" alt="dodaj 'Piractwo w ACTA to najmniejszy problem' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/&amp;title=Piractwo+w+ACTA+to+najmniejszy+problem" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do digg" alt="dodaj 'Piractwo w ACTA to najmniejszy problem' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Technorati" alt="dodaj 'Piractwo w ACTA to najmniejszy problem' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/&amp;title=Piractwo+w+ACTA+to+najmniejszy+problem" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Stumble Upon" alt="dodaj 'Piractwo w ACTA to najmniejszy problem' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/&amp;title=Piractwo+w+ACTA+to+najmniejszy+problem" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do Google Bookmarks" alt="dodaj 'Piractwo w ACTA to najmniejszy problem' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/&amp;t=Piractwo+w+ACTA+to+najmniejszy+problem" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do FaceBook" alt="dodaj 'Piractwo w ACTA to najmniejszy problem' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/&amp;title=Piractwo+w+ACTA+to+najmniejszy+problem" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Piractwo w ACTA to najmniejszy problem' do wykop.pl" alt="dodaj 'Piractwo w ACTA to najmniejszy problem' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/26/piractwo-w-acta-to-najmniejszy-problem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Różnica pomiędzy call i execution w AspectJ</title>
		<link>http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/</link>
		<comments>http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 11:24:18 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2386</guid>
		<description><![CDATA[Różnica wredna, która potrafi zepsuć dzień. Generalnie zarówno call jak i execution nie różnią się jeżeli chodzi o moment wywołania. Jeżeli zdefiniujemy, że mają być wkompilowane przed to zostaną wkompilowane przed. Jeżeli po to po. Kompilator zapewnia, że w danym przepływie sterowania aspekt będzie umieszczony w odpowiednim miejscu. Oczywiście przy założeniu, że nie ma tam [...]]]></description>
			<content:encoded><![CDATA[<p>Różnica wredna, która potrafi zepsuć dzień. </p>
<p>Generalnie zarówno <samp>call</samp> jak i <samp>execution</samp> nie różnią się jeżeli chodzi o moment wywołania. Jeżeli zdefiniujemy, że mają być wkompilowane przed to zostaną wkompilowane przed. Jeżeli po to po. Kompilator zapewnia, że w danym przepływie sterowania aspekt będzie umieszczony w odpowiednim miejscu. Oczywiście przy założeniu, że nie ma tam jakiś dodatkowych aspektów. Różnica leży w tym gdzie kompilator umieszcza kod. </p>
<h4>Położenie <samp>call</samp></h4>
<p>Jeżeli używamy <samp>call</samp> to kompilator umieści kod porady w miejscu gdzie wywoływana jest dana metoda. Czyli jeżeli metoda A.a woła metodę B.b to kod zostanie umieszczony w metodzie A.a.</p>
<h4>Położenie <samp>execution</samp></h4>
<p>Jeżeli używamy <samp>execution</samp> to kompilator umieści kod w wywoływanej metodzie. Przykładowo jeżeli A.a woła B.b to kod zostanie umieszczony w B.b.</p>
<h4>Gdzie jest to istotne</h4>
<p>W praktyce jeżeli wrzucamy kod aspektowy do naszych klas to nie ma różnicy czy użyjemy <samp>call</samp> czy <samp>execution</samp>. Kompilator i tak musi przeorać cały kod źródłowy&#8230; no właśnie. Kod źródłowy&#8230; Jeżeli wasza metoda jest wywoływana przez jakaś zewnętrzną bibliotekę np. chcecie dodać kod aspektowy do testu oznaczonego <samp>@Test</samp> to użycie <samp>call</samp> skończy się komunikatem <samp>Xlint:adviceDidNotMatch</samp>. Kompilator nie doda waszej porady ponieważ nie pracuje na kodzie wywołującym metodę. Dotyczy to też sytuacji gdzie do wywołania metody używacie refleksji. W takim wypadku macie dwa wyjścia. Po pierwsze użyć <samp>execution</samp>, co jest prostsze, ale narusza wasz kod (przyjmuję tu pracę z weaveringiem w czasie kompilacji). Po drugie użyć <samp>call</call> wraz z weaveringiem w czasie ładowania klas.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Del.icio.us" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do digg" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Technorati" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Stumble Upon" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Google Bookmarks" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;t=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do FaceBook" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do wykop.pl" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności</title>
		<link>http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/</link>
		<comments>http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 21:07:52 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Ekstremalna obiektowość w praktyce]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2382</guid>
		<description><![CDATA[Część 0 Część 1 Część 2 Część 3 Część 4 Część 5 Część 6 Część 7 Część 8 Piątek, a zatem słuchamy Listy w Trójce. Przed nami ostatnia z zasad Jeff&#8217;a Bay&#8217;a Nie używaj getterów/setterów/własności Niewątpliwie jest to najbardziej obiektowa z zasad. By zrozumieć o co w niej chodzi porównajmy takie oto dwie klasy Listing [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koziolekweb.pl/2011/10/19/ekstremalna-obiektowosc-w-praktyce-czesc-0/">Część 0</a><br />
<a href="http://koziolekweb.pl/2011/10/22/ekstremalna-obiektowosc-w-praktyce-%e2%80%93-czesc-1-tylko-jeden-poziom-zaglebienia-na-metode/">Część 1</a><br />
<a href="http://koziolekweb.pl/2011/10/26/ekstremalna-obiektowosc-w-praktyce-%e2%80%93-czesc-2-nie-uzywaj-slowa-kluczowego-else/">Część 2</a><br />
<a href="http://koziolekweb.pl/2011/11/06/ekstremalna-obiektowosc-w-praktyce-%e2%80%93-czesc-3-opakowuj-wszystkie-prymitywy-i-stringi//">Część 3</a><br />
<a href="http://koziolekweb.pl/2011/11/20/ekstremalna-obiektowosc-w-praktyce-czesc-4-uzywaj-tylko-jednej-kropki-na-linie/">Część 4</a><br />
<a href="http://koziolekweb.pl/2011/11/24/ekstremalna-obiektowosc-w-praktyce-czesc-5-nie-skracaj-nazw/">Część 5</a><br />
<a href="http://koziolekweb.pl/2011/12/05/ekstremalna-obiektowosc-w-praktyce-czesc-6-pilnuj-wszystkie-encje-by-byly-male/">Część 6</a><br />
<a href="http://koziolekweb.pl/2011/12/19/ekstremalna-obiektowosc-w-praktyce-czesc-7-nie-uzywaj-klas-o-wiecej-niz-dwoch-polach/">Część 7</a><br />
<a href="http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/">Część 8</a></p>
<p>Piątek, a zatem słuchamy Listy w Trójce. Przed nami ostatnia z zasad Jeff&#8217;a Bay&#8217;a</p>
<h4>Nie używaj getterów/setterów/własności</h4>
<p>Niewątpliwie jest to najbardziej obiektowa z zasad. By zrozumieć o co w niej chodzi porównajmy takie oto dwie klasy</p>
<p class="listing">Listing 1. klasa bardziej &#8220;obiektowa&#8221;</p>
<pre class="java" name="code">class Chłopiec{

	private String imię;

	private String nazwisko;

	private String wiek;

	public String getImię() {
		return imię;
	}

	public void setImię(String imię) {
		this.imię = imię;
	}

	public String getNazwisko() {
		return nazwisko;
	}

	public void setNazwisko(String nazwisko) {
		this.nazwisko = nazwisko;
	}

	public String getWiek() {
		return wiek;
	}

	public void setWiek(String wiek) {
		this.wiek = wiek;
	}

}</pre>
<p class="listing">Listing 2. klasa mniej &#8220;obiektowa&#8221;</p>
<pre class="java" name="code">class Dziewczynka {

	public String imię;

	public String nazwisko;

	public String wiek;

}</pre>
<p>Czym różnią się te dwie klasy? </p>
<h4>Obiektowość to nie metody</h4>
<p>Pomijając różne specyficzne elementy języka związane z współbieżną zmianą stanu obiektów tych klas to te dwa twory niczym się nie różnią. Mogę jednak założyć się, że jeżeli pokażemy je &#8220;nagie i bezbronne&#8221; to pierwsza z nich zostanie zakwalifikowana jako bardziej obiektowa. Druga będzie mniej obiektowa. Dlaczego? Jakoś tak się utarło, że o obiektowości decydują metody.<br />
W Javie jest to szczególnie potęgowane przez specyfikację <a href="http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html">Java Beans</a>:</p>
<blockquote><p>Properties are always accessed via method calls on their owning object. For readable properties<br />
there will be a getter method to read the property value. For writable properties there will be a<br />
setter method to allow the property value to be updated.
</p></blockquote>
<p>Cóż&#8230; Ma to pewien cel i jest tu pewien pomysł, ale tylko gdy przyjrzymy się tej specyfikacji jako całości (szczególnie z obsługa zdarzeń i wzorcem obserwatora). Niestety jak to w życiu bywa, ktoś z całego dokumentu wyciągnął jeden fragment i tak oto znaleźliśmy się w życi.  </p>
<h4>Czym jest obiektowość?</h4>
<p>Obiektowość to przede wszystkim enkapsulacja. Inaczej mówiąc obiekty nie powinny ujawniać swojego wnętrza, a jedynie udostępniać pewien interfejs, który będzie odwzorowywał operacje dokonywane przez obiekt. Oczywiście może się tak zdarzyć, że operacja polega na ustawieniu jakiejś wartości obiektu. Jednak są to specyficzne przypadki. W żadnym wypadku nie należy pozwalać na swobodną manipulację właściwościami obiektu.</p>
<h4>Co zamiast?</h4>
<p>Skoro nie powinniśmy mieć możliwości swobodnej manipulacji jak tworzyć i konfigurować obiekty? Z każdym z elementów zajmiemy się z osobna.</p>
<h5>Settery</h5>
<p>Generalnie obiekty powinny być niezmienne. Ma to wiele zalet. Najważniejszą jest możliwość swobodnego programowania współbieżnego bez obawy, że wątki wzajemnie pozmieniają sobie dane. W takim wypadku settery zostaną automatycznie wyrugowane przez mechanizmy języka wymuszające ustawienie pól w konstruktorze.<br />
Jeżeli jednak z jakiegoś powodu nie możemy użyć pól finalnych to należy ustawić je z użyciem jakiegoś kontenera DI. Zazwyczaj mamy dostęp do tego typu bibliotek i nie ma problemów z ich wykorzystaniem.<br />
Co jednak gdy z jakiś powodów kontener DI nie jest dostępny? W takim wypadku zostaje nam wykorzystanie wzorca fabryki wzbogaconego o użycie refleksji. </p>
<h5>Właściwości</h5>
<p>Unikamy sytuacji kiedy zachowanie obiektu zależy od właściwości. To właściwość powinna dostarczać odpowiedniego zachowania. Przykładowo w poprzedniej części mówiłem, że opakowane kolekcje powinny dostarczać metod &#8220;kontekstowych&#8221;. Podobnie w trzeciej części gdzie mowa była o opakowaniu typów prymitywnych wspominałem o możliwości zamknięcia w typie opakowującym pewnych prostych operacji np. walidacji czy operacji arytmetycznych. </p>
<h5>Gettery</h5>
<p>Najbardziej kłopotliwy element. Koniec końców zawsze musimy gdzieś pokazać uzyskaną wartość. Najprościej jest przesłonić <samp>toString</samp>. Nie zawsze się to da zrobić. O ile zadziała to w przypadku prostych obiektów to już obiekty złożone stanową duży problem. Pewnym rozwiązaniem może być użycie odpowiedniego prezentera, czyli wzorca MVP. Prezenter może dostać się do obiektu via refleksja względnie odpowiednio zinterpretować wyniki z metody <samp>toString</samp>. Wzorzec ten ma w tym przypadku wiele zalet. Jeżeli jednak chcemy zrobić coś małego to można użyć czegoś co roboczo nazywam obiektem &#8220;samopezentującym się&#8221;. W takim przypadku obiekt posiada metodę, do której można przekazać docelowe miejsce prezentacji np. strumień i tyle. Jest to rozwiązanie o tyle wygodne, że czasami chcemy ograniczyć możliwość prezentacji obiektu. W takim wypadku metoda pełni rolę swoistego &#8220;pasa cnoty&#8221; ponieważ ogranicza kanały prezentacji.</p>
<h4>Podsumowanie</h4>
<p>Uff&#8230; przebrnąłem. Nie było łatwo. Paweł Lipiński w komentarzu do siódmej części zwrócił uwagę, że są to przede wszystkim pewne heurystyki. W części zerowej wspomniałem, że zasady te są świetne jeżeli chcemy refaktoryzować kod. Są też doskonałym narzędziem do ćwiczenia. Zatem czy stosować zasady Jeff&#8217;a Bay&#8217;a? Moim zdaniem warto dążyć do kodu napisanego zgodnie z tymi zasadami. Ponieważ kod taki promuje przemyślane konstrukcje, pozwala na odnalezienie potencjalnie niebezpiecznych fragmentów i karkołomnych konstrukcji w architekturze oraz wymusza pisanie testów. Ja napisałem projekt zgodny z tymi zasadami mający około 1000 linii. Teraz czas byś usiadł i napisał swój projekt. </p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+9+%26%238211%3B+Nie+u%C5%BCywaj+getter%C3%B3w%2Fsetter%C3%B3w%2Fw%C5%82asno%C5%9Bci" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Del.icio.us" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+9+%26%238211%3B+Nie+u%C5%BCywaj+getter%C3%B3w%2Fsetter%C3%B3w%2Fw%C5%82asno%C5%9Bci" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do digg" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Technorati" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+9+%26%238211%3B+Nie+u%C5%BCywaj+getter%C3%B3w%2Fsetter%C3%B3w%2Fw%C5%82asno%C5%9Bci" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Stumble Upon" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+9+%26%238211%3B+Nie+u%C5%BCywaj+getter%C3%B3w%2Fsetter%C3%B3w%2Fw%C5%82asno%C5%9Bci" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Google Bookmarks" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/&amp;t=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+9+%26%238211%3B+Nie+u%C5%BCywaj+getter%C3%B3w%2Fsetter%C3%B3w%2Fw%C5%82asno%C5%9Bci" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do FaceBook" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+9+%26%238211%3B+Nie+u%C5%BCywaj+getter%C3%B3w%2Fsetter%C3%B3w%2Fw%C5%82asno%C5%9Bci" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do wykop.pl" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 9 &#8211; Nie używaj getterów/setterów/własności' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/20/ekstremalna-obiektowosc-w-praktyce-czesc-9-nie-uzywaj-getterowsetterowwlasnosci/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Wady użycia mocków z mock-frameworków</title>
		<link>http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/</link>
		<comments>http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 14:38:05 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testy]]></category>
		<category><![CDATA[Mockito]]></category>
		<category><![CDATA[Testability]]></category>
		<category><![CDATA[TestNG]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2380</guid>
		<description><![CDATA[Idzie sobie transakcja z banku. Trafia ona ci na moje biurko i muszę ją zwalidować. Biorę ci ja JSR-303 i przepuszczam ci ja transakcję przez tą zabawkę&#8230; Rzecz w tym, że mam kilka własnych walidatorów, które korzystają z danych pobranych z bazy. Dane sa pobierane raz i zapisywane w takim pseudo cache, który potrafi odpowiedzieć [...]]]></description>
			<content:encoded><![CDATA[<p>Idzie sobie transakcja z banku. Trafia ona ci na moje biurko i muszę ją zwalidować. Biorę ci ja JSR-303 i przepuszczam ci ja transakcję przez tą zabawkę&#8230;</p>
<p>Rzecz w tym, że mam kilka własnych walidatorów, które korzystają z danych pobranych z bazy. Dane sa pobierane raz i zapisywane w takim pseudo cache, który potrafi odpowiedzieć na różne pytania dotyczące poszczególnych banków (czy mają włączone pewne usługi, czy są aktywne itp.). Zatem chcąc przetestować to rozwiązanie należało by użyć mocka. Na tapetę trafia zatem Mockito i koleżanka Whendy, która będzie udawała nam bazę danych.</p>
<p>// offtopic:<br />
koleżanka Whendy zawdzięcza swoje imię temu, że konfigurując mocka używamy metod <samp>when</samp> i <samp>then</samp>.<br />
// koniec offtopicu</p>
<p>Szyba konfiguracja i dla mniejszych testów śmiga. Przy okazji chciałem sprawdzić jak to zagra w przypadku większego testu. Nadal bez bazy danych, ale już odpalając wszytko na raz. Wziąłem zatem dyżurny zestaw 100k transakcji testowych. Napisałem prosty test &#8220;profilujący&#8221; pod kątem czasu, odpaliłem i <samp>OutOfMemmoryError</samp> się stos skończył. Nosz&#8230; na razie bez przekleństw. Zaparzyłem świeżą kawę i dawaj sprawdzamy. Plik wejściowy ~41MB co daje jakieś ~70MB w obiektach. Do dyspozycji jest 256MB RAM dla JVM w TestNg. Hm&#8230; szybko dopinam Dupaprofiler dla pamięci i widzę, że wykłada się przy około ~40K obiektów. Na Twittera idą bluzgi w temacie JSR-303. Pól dnia walki i co się okazało?</p>
<h4>Każdy mock ma dodatkowe featury</h4>
<p>Generalnie każdy mock tworzony przy pomocy frameworku ma kilka fajnych fearturów. Jednym z nich jest zbieranie informacji o wywołaniach, argumentach przekazanych do obiektu itp. Te dane zżerają pamięć w zastraszającym tempie. Skończyło się na pseudoimpelentacji interfejsu. Działa tak samo jak mock, ale nie zbiera informacji o wywołaniach. Jeżeli zatem w trakcie testów kończy ci się pamięć to sprawdź czy twoje mocki nie są zbyt zasobożerne.<br />
Jeżeli tak jest to sprawdź czy potrzebujesz informacji o wywołaniach. Jeżeli nie to wystarczy zamiast mocków z frameworku napisać własną pseudo implementację. Jeżeli potrzebujecie jednak pewnych informacji to nie pozostaje nic innego jak dołożyć pamięci.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/&amp;title=Wady+u%C5%BCycia+mock%C3%B3w+z+mock-framework%C3%B3w" title="dodaj 'Wady użycia mocków z mock-frameworków' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Wady użycia mocków z mock-frameworków' do Del.icio.us" alt="dodaj 'Wady użycia mocków z mock-frameworków' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/&amp;title=Wady+u%C5%BCycia+mock%C3%B3w+z+mock-framework%C3%B3w" title="dodaj 'Wady użycia mocków z mock-frameworków' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Wady użycia mocków z mock-frameworków' do digg" alt="dodaj 'Wady użycia mocków z mock-frameworków' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/" title="dodaj 'Wady użycia mocków z mock-frameworków' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Wady użycia mocków z mock-frameworków' do Technorati" alt="dodaj 'Wady użycia mocków z mock-frameworków' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/&amp;title=Wady+u%C5%BCycia+mock%C3%B3w+z+mock-framework%C3%B3w" title="dodaj 'Wady użycia mocków z mock-frameworków' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Wady użycia mocków z mock-frameworków' do Stumble Upon" alt="dodaj 'Wady użycia mocków z mock-frameworków' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/&amp;title=Wady+u%C5%BCycia+mock%C3%B3w+z+mock-framework%C3%B3w" title="dodaj 'Wady użycia mocków z mock-frameworków' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Wady użycia mocków z mock-frameworków' do Google Bookmarks" alt="dodaj 'Wady użycia mocków z mock-frameworków' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/&amp;t=Wady+u%C5%BCycia+mock%C3%B3w+z+mock-framework%C3%B3w" title="dodaj 'Wady użycia mocków z mock-frameworków' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Wady użycia mocków z mock-frameworków' do FaceBook" alt="dodaj 'Wady użycia mocków z mock-frameworków' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/&amp;title=Wady+u%C5%BCycia+mock%C3%B3w+z+mock-framework%C3%B3w" title="dodaj 'Wady użycia mocków z mock-frameworków' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Wady użycia mocków z mock-frameworków' do wykop.pl" alt="dodaj 'Wady użycia mocków z mock-frameworków' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/20/wady-uzycia-mockow-z-mock-frameworkow/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SOPA była do przewidzenia</title>
		<link>http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/</link>
		<comments>http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 21:49:02 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Historia]]></category>
		<category><![CDATA[Różności]]></category>
		<category><![CDATA[Świat]]></category>
		<category><![CDATA[Piractwo]]></category>
		<category><![CDATA[Prawo]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2378</guid>
		<description><![CDATA[Mamy sobie rok 1455 w Moguncji niejaki GutenbergW wydaje pierwszą drukowaną biblię zwaną Biblią GutenbergaW. Oczywiście wynalazek druku jest dla Europy przełomowy (choć jesteśmy pod tym względem daleko za murzynami&#8230; wróć&#8230; Azjatami). Co nam on daje? Przede wszystkim przyspiesza obieg informacji. Informacja przestaje być wyceniana na podstawie nośnika. W praktyce cena nośnika gwałtownie spada. Cały [...]]]></description>
			<content:encoded><![CDATA[<p>Mamy sobie rok 1455 w Moguncji niejaki <a href="http://pl.wikipedia.org/wiki/Johannes_Gutenberg" target="_blank" title="From Wikipedia the definition of: Johannes_Gutenberg" class="wikiterm" >Gutenberg</a><sup class="wikiicon" ><em>W</em></sup> wydaje pierwszą drukowaną biblię zwaną <a href="http://pl.wikipedia.org/wiki/Biblia_Gutenberga" target="_blank" title="From Wikipedia the definition of: Biblia_Gutenberga" class="wikiterm" >Biblią Gutenberga</a><sup class="wikiicon" ><em>W</em></sup>. Oczywiście wynalazek druku jest dla Europy przełomowy (choć jesteśmy pod tym względem daleko za murzynami&#8230; wróć&#8230; Azjatami). Co nam on daje? Przede wszystkim przyspiesza obieg informacji. Informacja przestaje być wyceniana na podstawie nośnika. W praktyce cena nośnika gwałtownie spada. Cały myk z Gutenbergiem polega na tym, że zaproponował on użycie tzw. ruchomych czcionek, które usprawniły proces druku. Zredukował w ten sposób koszty.<br />
Mija sobie 49 lat i w roku 1504 w Anglii zostaje nadany przez Henryka VII Przywilej Drukarza Królewskiego. Cóż to jest? Otóż szybkość z jaką zaczęła przepływać informacja stała się bardzo niebezpieczna dla władzy. Byle dupek mógł sobie postawić drukarnię i masowo drukować oraz kolportować nieprzychylne dla władzy ulotki. Wspomniany przywilej był tak naprawdę koncesją służącą kontroli druku. Każdy drukarz musiał uzyskać zezwolenie od władzy na druk publikacji. Zatem w przeciągu niecałych 50 lat od upowszechnienia się szybkiego druku mamy narzucone ograniczenia na operatorów tego nośnika informacji.</p>
<p>Mam rok 1971 <a href="http://pl.wikipedia.org/wiki/DARPA" target="_blank" title="From Wikipedia the definition of: DARPA" class="wikiterm" >DARPA</a><sup class="wikiicon" ><em>W</em></sup> otwiera sieć <a href="http://pl.wikipedia.org/wiki/ARPANET" target="_blank" title="From Wikipedia the definition of: ARPANET" class="wikiterm" >ARPANET</a><sup class="wikiicon" ><em>W</em></sup> publikując specyfikację TCP/IP. Dokonuje się kolejna rewolucja w przepływie informacji. Informacja może zostać przesłana z jednego końca świata na drugi w niewyobrażalnym tempie. W przeciągu kilkudziesięciu lat ilość informacji przesyłanych tą drogą rośnie do gigantycznych rozmiarów. Sieć okazuje się jednak niebezpieczna dla władzy. I to takiej rozumianej w normalny sposób &#8211; demokratycznej i kontrolowanej przez obywateli. Najzwyczajniej w świecie władza traci możliwość rządzenia &#8211; nikt nie jest wstanie ogarnąć takich ilości informacji. Jest jednak inna gorsza niż władza siła. Jest nią grupa gości, którzy odkrywają, że w epoce sieci komputerowych ich produkty i usługi nie są nikomu potrzebne. Tą grupą są wydawcy. Wykorzystują zatem swoje możliwości i zaczynają na wszelkie sposoby wpychać różne mechanizmy koncesjonowania sieci.</p>
<p>Za Janem Kochanowskim:</p>
<blockquote><p>Nikomu, albo raczej wszytkim, swoje księgi<br />
Daję. By kto nie mniemał (strach to bowiem tęgi),<br />
Że za to trzeba co dać, wszyscy darmo miejcie.<br />
O drukarzu nie mówię, z tym się zrozumiejcie</p></blockquote>
<p>Ważna rzecz. Kochanowski jasno określił, że jego dzieła kosztują tyle ile uzgodnimy z drukarzem. Mówiąc językiem współczesnym Kochanowski wydał swoje dzieła na licencji CC-BY-ND. Jedyne co kosztuje to nośnik. W epoce internetu udało się wyeliminować &#8220;najdroższy&#8221; element &#8211; nośnik. Napisałem najdroższy w cudzysłowie ponieważ patrząc na rozkład kosztów płyty łatwo zauważymy, że lwia część trafia to dystrybutorów i wydawców. Sensem istnienia wydawców jest produkcja nośników. Eliminując nośnik eliminujemy wydawcę. Rozwój sieci spowodował realne zagrożenie dla fundamentalnego elementu decydującego o istnieniu wydawcy &#8211; nośnika. Nie jest to odkrywcze, ale dobrze tłumaczy dlaczego to wydawcy, a nie artyści są główną silą napędową cenzury. </p>
<p>Wniosek. W przeciągu kilkunastu kolejnych lat będziemy mieli jeszcze kilka prób wprowadzenia cenzury w sieci pod hasłem walki z piractwem. Broń nie jest jednak skierowana w piratów, ale ma na celu jak najdłuższą ochronę przestarzałej technologicznie płyty CD jako nośnika treści. Jeżeli udało by się wyeliminować z rynku fizyczny nośnik to w przeciągu kilkunastu lat znikną i wydawcy. </p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/&amp;title=SOPA+by%C5%82a+do+przewidzenia" title="dodaj 'SOPA była do przewidzenia' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'SOPA była do przewidzenia' do Del.icio.us" alt="dodaj 'SOPA była do przewidzenia' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/&amp;title=SOPA+by%C5%82a+do+przewidzenia" title="dodaj 'SOPA była do przewidzenia' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'SOPA była do przewidzenia' do digg" alt="dodaj 'SOPA była do przewidzenia' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/" title="dodaj 'SOPA była do przewidzenia' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'SOPA była do przewidzenia' do Technorati" alt="dodaj 'SOPA była do przewidzenia' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/&amp;title=SOPA+by%C5%82a+do+przewidzenia" title="dodaj 'SOPA była do przewidzenia' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'SOPA była do przewidzenia' do Stumble Upon" alt="dodaj 'SOPA była do przewidzenia' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/&amp;title=SOPA+by%C5%82a+do+przewidzenia" title="dodaj 'SOPA była do przewidzenia' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'SOPA była do przewidzenia' do Google Bookmarks" alt="dodaj 'SOPA była do przewidzenia' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/&amp;t=SOPA+by%C5%82a+do+przewidzenia" title="dodaj 'SOPA była do przewidzenia' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'SOPA była do przewidzenia' do FaceBook" alt="dodaj 'SOPA była do przewidzenia' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/&amp;title=SOPA+by%C5%82a+do+przewidzenia" title="dodaj 'SOPA była do przewidzenia' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'SOPA była do przewidzenia' do wykop.pl" alt="dodaj 'SOPA była do przewidzenia' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/18/sopa-byla-do-przewidzenia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania</title>
		<link>http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/</link>
		<comments>http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 22:11:05 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Ekstremalna obiektowość w praktyce]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2374</guid>
		<description><![CDATA[Część 0 Część 1 Część 2 Część 3 Część 4 Część 5 Część 6 Część 7 Gladius Noctis, a na blogu ósma z zasad Jeff&#8217;a Bay&#8217;a Klasa której polem jest kolekcja nie powinna mieć żadnych innych pól (opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania) Nazwa trochę długa, ale nie ważne. Powróćmy na chwilę do [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koziolekweb.pl/2011/10/19/ekstremalna-obiektowosc-w-praktyce-czesc-0/">Część 0</a><br />
<a href="http://koziolekweb.pl/2011/10/22/ekstremalna-obiektowosc-w-praktyce-%e2%80%93-czesc-1-tylko-jeden-poziom-zaglebienia-na-metode/">Część 1</a><br />
<a href="http://koziolekweb.pl/2011/10/26/ekstremalna-obiektowosc-w-praktyce-%e2%80%93-czesc-2-nie-uzywaj-slowa-kluczowego-else/">Część 2</a><br />
<a href="http://koziolekweb.pl/2011/11/06/ekstremalna-obiektowosc-w-praktyce-%e2%80%93-czesc-3-opakowuj-wszystkie-prymitywy-i-stringi//">Część 3</a><br />
<a href="http://koziolekweb.pl/2011/11/20/ekstremalna-obiektowosc-w-praktyce-czesc-4-uzywaj-tylko-jednej-kropki-na-linie/">Część 4</a><br />
<a href="http://koziolekweb.pl/2011/11/24/ekstremalna-obiektowosc-w-praktyce-czesc-5-nie-skracaj-nazw/">Część 5</a><br />
<a href="http://koziolekweb.pl/2011/12/05/ekstremalna-obiektowosc-w-praktyce-czesc-6-pilnuj-wszystkie-encje-by-byly-male/">Część 6</a><br />
<a href="http://koziolekweb.pl/2011/12/19/ekstremalna-obiektowosc-w-praktyce-czesc-7-nie-uzywaj-klas-o-wiecej-niz-dwoch-polach/">Część 7</a></p>
<p>Gladius Noctis, a na blogu ósma z zasad Jeff&#8217;a Bay&#8217;a</p>
<h4>Klasa której polem jest kolekcja nie powinna mieć żadnych innych pól (opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania)</h4>
<p>Nazwa trochę długa, ale nie ważne. Powróćmy na chwilę do pierwszej części tego cyklu. Na koniec przykładu z tablicami mieliśmy tam następujący kod:</p>
<p class="listing">Listing 1. Kod z pierwszej części
<pre class="java" name="code">package pl.koziolekweb.eowp1;

public class Array3DFiller {

	public static void main(String[] args) {
		int[][][] array3d = new int[3][3][3];
		fillArray(array3d);

		printArray(array3d);

	}

	private static int fill2dArray(int[][][] array3d, int current, int i) {
		for (int j = 0; j < array3d[i].length; j++) {
			current = fillRow(array3d, current, i, j);
		}
		return current;
	}

	private static int fillArray(int[][][] array3d) {
		int current = 0;
		for (int i = 0; i < array3d.length; i++) {
			current = fill2dArray(array3d, current, i);
		}
		return current;
	}

	private static int fillRow(int[][][] array3d, int current, int i, int j) {
		for (int k = 0; k < array3d[i][j].length; k++, current++) {
			array3d[i][j][k] = current;
		}
		return current;
	}

	private static void print2dArray(int[][][] array3d, int i) {
		for (int j = 0; j < array3d[i].length; j++) {
			printRow(array3d, i, j);
			System.out.println();
		}
	}

	private static void printArray(int[][][] array3d) {
		for (int i = 0; i < array3d.length; i++) {
			print2dArray(array3d, i);
			System.out.println();
		}
	}

	private static void printRow(int[][][] array3d, int i, int j) {
		for (int k = 0; k < array3d[i][j].length; k++) {
			System.out.print(String.format("%2s ", array3d[i][j][k]));
		}
	}

}
</pre>
<p>Przy tamtych założeniach było ok. Krawetko podał jeszcze zgrabniejszą wersję. Ja jednak zmienię tu wszystko.</p>
<h4>Co robimy z kolekcjami?</h4>
<p>Przede wszystkim iterujemy. Przeciskamy przez różne formy pętli w celu wykonania operacji na wszystkich elementach kolekcji. W Javie jest to dość upierdliwe. Za każdym razem należy napisać te klika linijek kodu by przepuścić daną kolekcję przez pętlę. W dodatku może okazać się, że coś skrewiliśmy albo nasz kod dostał się w niepowołane ręce, które wykonały kilka niefajnych operacji bezpośrednio na kolekcji.<br />
W Scali jest trochę lepiej mamy metodę <samp>foreach</samp>, która opakowuje pętlę:</p>
<p class="listing">Listing 2. <samp>foreach</samp> w Scali
<pre class="scala" name="code">
val x = 1 to 10
x foreach ($ => println($*$))
</pre>
<p>I już mamy kwadraty liczb od 1 do 10. W javie trzeba na to dwóch pętli.</p>
<p>Oczywiście jest tu ukryty mały "fakap" ponieważ zarówno metoda <samp>to</samp> jak i <samp>foreach</samp> maskują nam odpowiednie pętle. W przypadku <samp>to</samp> jest to jeszcze wzbogacone o lazy-init, ale to insza inszość.</p>
<h4>Dlaczego opakowywać kolekcje?</h4>
<p>Kod w Scali fajny jest. Dlatego warto stworzyć sobie podobne możliwości. W Javie nie jest to trudne generalnie poniższy kawałek kodu rzucił mi się kiedyś w oczy, ale skąd pochodzi ta koncepcja nie jestem wstanie powiedzieć.</p>
<p class="listing">Listing 3. <samp>foreach</samp> w Javie
<pre class="java" name="code">interface Foreach<T> {

	interface Action<T> {
		void perform(T t);
	}

	abstract class ForeachImpl<T> implements Foreach<T> {

		private static class ArrayDelegate<T> implements Foreach<T> {

			private T[] array;

			public ArrayDelegate(T[] array) {
				this.array = array;
			}

			@Override
			public void foreach(Action<T> action) {
				for (T t : array) {
					action.perform(t);
				}
			}
		}

		private static class Delegate<T> extends ForeachImpl<T> {

			public Delegate(Collection<T> collection) {
				super(collection);
			}
		}

		public static <D> Foreach<D> delegate(Collection<D> collection) {
			return new Delegate<D>(collection);
		}

		public static <D> Foreach<D> delegate(D[] collection) {
			return new ArrayDelegate<D>(collection);
		}

		private Collection<T> collection;

		private ForeachImpl(Collection<T> collection) {
			this.collection = collection;
		}

		@Override
		public void foreach(Action<T> action) {
			for (T t : collection) {
				action.perform(t);
			}
		}
	}

	public void foreach(Action<T> action);
}</pre>
<p>Jest to trochę karkołomna konstrukcja w tej postaci, ale wiadomo o co chodzi. Odpowiednie zagłębienia służą tu odwaleniu roboty podobnej do tej jaką odwala scalac przy dodawaniu traita do klasy. Dla przypomnienia jeżeli trait nie zawiera implementacji to jest traktowany jak interfejs. Jeżeli zawiera implementacje to tworzone są klasy abstrakcyjne zawierające zaimplementowane metody i w klasie docelowej następuje delegacja zachowania do takiej wewnętrznej klasy. Tyle w skrócie zainteresowanych odsyłam do konsoli i polecenia javap.</p>
<p>Nasza klasy wystarczy, że zaimplementuje interfejs i wydeleguje obsługę metody do klasy <samp>Delegate</samp>. Już dużo mniej roboty <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  później przy iterowaniu przez kolekcję wystarczy zaimplementować clou pętli czyli to co pomiędzy { i }. Można to też łatwo przetestować. Ba! Można implementację przerzucić na użytkownika API. Niech powie co robi z pojedynczym elementem kolekcji, a to jak będzie przechodził przez kolekcję to już nie jego sprawa. Tu dochodzimy do takiego modelu, który jest już blisko programowania funkcyjnego. Klient mówi CO i nie martwi się JAK.</p>
<h4>Wypełniamy tablicę</h4>
<p>Powróćmy do pierwszego kodu. W pierwszym kroku opakujmy tablicę jednowymiarową o zadanej ilości elementów w coś przyjaznego dla środowiska:</p>
<p class="listing">Listing 4. Opakowana tablica intów
<pre class="java" name="code">class ArrayOfInt {

	private Integer array[];

	public ArrayOfInt(int size) {
		array = new Integer[size];
	}

	public int fill(final int start) {
		return fill(start, 1);
	}

	public int fill(final int start, final int step) {
		int next = start;
		for (int i = 0; i < array.length; i++) {
			array[i] = next;
			next += step;
		}
		return next;
	}

	public void print() {
		ForeachImpl.delegate(array).foreach(new Action<Integer>() {

			@Override
			public void perform(Integer t) {
				System.out.print(String.format("%2s ", t));

			}
		});
	}

}</pre>
<p>Ok, na razie nic groźnego. O ile inicjację tablicy i jej wypełnienie musimy przeprowadzić iterując z palucha to już wypisanie robimy za pomocą delegowania.<br />
Teraz czas na tablicę dwu wymiarową. W tym przypadku musimy powiedzieć ile kolumn i ile rzędów chcemy mieć. Jednak czy aby na pewno? Opakowujemy w końcu kolekcję kolekcji... zatem...</p>
<p class="listing">Listing 5. Opakowana dwu wymiarowa tablica intów
<pre class="java" name="code">class Array2dInt {

	private class Next {
		int next;
	}

	private ArrayOfInt array[];

	public Array2dInt(int rows, int cols) {
		array = new ArrayOfInt[rows];
		for (int i = 0; i < array.length; i++)
			array[i] = new ArrayOfInt(cols);
	}

	public int fill(final int start) {
		return fill(start, 1);
	}

	public int fill(final int start, final int step) {
		final Next next = new Next();
		next.next = start;
		ForeachImpl.delegate(array).foreach(new Action<ArrayOfInt>() {

			@Override
			public void perform(ArrayOfInt t) {
				next.next = t.fill(next.next, step);
			}
		});

		return next.next;
	}

	public void print() {
		ForeachImpl.delegate(array).foreach(new Action<ArrayOfInt>() {

			@Override
			public void perform(ArrayOfInt t) {
				t.print();
				System.out.println("");
			}
		});
	}
}</pre>
<p>Whoa... inicjacja w konstruktorze nadal z palucha (tego nie przeskoczymy). Reszta przez delegaty. Tablica trójwymiarowa to już formalność. </p>
<p class="listing">Listing 5. Opakowana trójwymiarowa tablica intów
<pre class="java" name="code">class Array3dInt {

	private class Next {
		int next;
	}

	private Array2dInt array[];

	public Array3dInt(int rows, int cols, int depth) {
		array = new Array2dInt[depth];
		for (int i = 0; i < array.length; i++)
			array[i] = new Array2dInt(rows, cols);
	}

	public int fill(final int start) {
		return fill(start, 1);
	}

	public int fill(final int start, final int step) {
		final Next next = new Next();
		next.next = start;
		ForeachImpl.delegate(array).foreach(new Action<Array2dInt>() {

			@Override
			public void perform(Array2dInt t) {
				next.next = t.fill(next.next, step);
			}
		});

		return next.next;
	}

	public void print() {
		ForeachImpl.delegate(array).foreach(new Action<Array2dInt>() {

			@Override
			public void perform(Array2dInt t) {
				t.print();
				System.out.println("");
			}
		});
	}
}</pre>
<p>Całość można oczywiście ładnie rozdzielić na nieanonimowe klasy wewnętrzne (albo wyrzucić do osobnych klas o ograniczonej widoczności) czy uczynić generycznym. Cały kod jest, wbrew pozorom, prostszy i łatwiejszy w testowaniu. </p>
<h4>Podsumowanie</h4>
<p>Bardzo istotną rzeczą w takim podejściu do kodowania jest umiejętność rozdzielenia swojej osobowości na klienta i dostawcę. W przeciwnym wypadku możemy nieźle przestraszyć się ilością kodu. </p>
<p>Najistotniejszą cechą jest jednak ograniczenie klientowi pola manewru w pracy z kolekcją. Mając ograniczone API i pozbawiając go możliwości dowolnego manipulowania elementami możemy się zabezpieczyć przed nieprzyjemnymi sytuacjami jak chociażby usunięcie elementu z kolekcji (boli jak używasz JPA), głębokie klonowanie kolekcji albo nieskończonego iterowania.<br />
Dodatkowo operacje biznesowe są jasno określone przez co zmniejsza się prawdopodobieństwo "hakierowania" i tworzenia obejść we właściwym kodzie biznesowym. </p>
<h5>Gdzie warto używać</h5>
<p>Przede wszystkim warto opakowywać kolekcje, które wychodzą z bazy danych/DAO. W ten sposób można ograniczyć manipulowanie obiektami w ramach kodu biznesowego. Wszelkie operacje związane ze zmianą stanu bazy będą dokonywane poprzez interfejs opakowanej kolekcji. Dzięki czemu można kontrolować kto co może. W takim układzie aplikacja nie widzi DAO jako takiego. Widzi tylko interfejs dostarczający pewne dane na których można wykonać ściśle określone operacje.<br />
Po drugie MVP. W tym przypadku kolekcja staje się pomocnikiem dla prezentera. Można dzięki temu wprowadzić np. dodatkowe filtrowanie danych tuż przed ich wyświetleniem. To pozwala na stworzenie jednego prezentera, który będzie prezentował dane w zależności od potrzeb, ale będzie jednocześnie na tyle elastyczny by móc z niego skorzystać w wielu miejscach. Przykładowo kolekcja A przed wyświetleniem wymaga wycięcia części danych, których nie bardzo można pozbyć się na etapie pobierania z bazy. Jednocześnie kolekcja B nie ma tych danych już domyślnie. Obie mają metodę <samp>show</samp> przyjmującą jako parametr prezenter. Następnie w środku wywołują tylko wybrane metody prezentera.<br />
Po trzecie filtry. W takim przypadku zamiast pozwolić iterować po kolekcji możemy udostępnić klientowi ileś tam predefiniowanych metod, które filtrują kolekcję w określony sposób. Tu mała uwaga. Szkoda, że w Javie nie ma eleganckich domknięć i trzeba stosować haki w stylu anonimowych klas.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+8+%26%238211%3B+opakowywanie+kolekcji+w+klasy+specyficzne+dla+kontekstu+wykorzystania" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Del.icio.us" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+8+%26%238211%3B+opakowywanie+kolekcji+w+klasy+specyficzne+dla+kontekstu+wykorzystania" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do digg" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Technorati" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+8+%26%238211%3B+opakowywanie+kolekcji+w+klasy+specyficzne+dla+kontekstu+wykorzystania" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Stumble Upon" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+8+%26%238211%3B+opakowywanie+kolekcji+w+klasy+specyficzne+dla+kontekstu+wykorzystania" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Google Bookmarks" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/&amp;t=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+8+%26%238211%3B+opakowywanie+kolekcji+w+klasy+specyficzne+dla+kontekstu+wykorzystania" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do FaceBook" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/&amp;title=Ekstremalna+obiektowo%C5%9B%C4%87+w+praktyce+%E2%80%93+cz%C4%99%C5%9B%C4%87+8+%26%238211%3B+opakowywanie+kolekcji+w+klasy+specyficzne+dla+kontekstu+wykorzystania" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do wykop.pl" alt="dodaj 'Ekstremalna obiektowość w praktyce – część 8 &#8211; opakowywanie kolekcji w klasy specyficzne dla kontekstu wykorzystania' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/14/ekstremalna-obiektowosc-w-praktyce-czesc-8-opakowywanie-kolekcji-w-klasy-specyficzne-dla-kontekstu-wykorzystania/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jak ogarnąć DI?</title>
		<link>http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/</link>
		<comments>http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 14:11:10 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[miniblog]]></category>
		<category><![CDATA[DI]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2370</guid>
		<description><![CDATA[Mini notka w miniblogu By ogarnąć DI należy napisać jeden projekt bez użycia słowa kluczowego new w kodzie biznesowym. Można go używać w provideach. Dozwolone jest też tworzenie prymitywów i Stringów &#8220;z palca&#8221;. Dodaj do]]></description>
			<content:encoded><![CDATA[<p>Mini notka w miniblogu <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>By ogarnąć DI należy napisać jeden projekt bez użycia słowa kluczowego new w kodzie biznesowym. Można go używać w provideach. Dozwolone jest też tworzenie prymitywów i Stringów &#8220;z palca&#8221;.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/&amp;title=Jak+ogarn%C4%85%C4%87+DI%3F" title="dodaj 'Jak ogarnąć DI?' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Jak ogarnąć DI?' do Del.icio.us" alt="dodaj 'Jak ogarnąć DI?' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/&amp;title=Jak+ogarn%C4%85%C4%87+DI%3F" title="dodaj 'Jak ogarnąć DI?' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Jak ogarnąć DI?' do digg" alt="dodaj 'Jak ogarnąć DI?' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/" title="dodaj 'Jak ogarnąć DI?' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Jak ogarnąć DI?' do Technorati" alt="dodaj 'Jak ogarnąć DI?' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/&amp;title=Jak+ogarn%C4%85%C4%87+DI%3F" title="dodaj 'Jak ogarnąć DI?' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Jak ogarnąć DI?' do Stumble Upon" alt="dodaj 'Jak ogarnąć DI?' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/&amp;title=Jak+ogarn%C4%85%C4%87+DI%3F" title="dodaj 'Jak ogarnąć DI?' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Jak ogarnąć DI?' do Google Bookmarks" alt="dodaj 'Jak ogarnąć DI?' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/&amp;t=Jak+ogarn%C4%85%C4%87+DI%3F" title="dodaj 'Jak ogarnąć DI?' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Jak ogarnąć DI?' do FaceBook" alt="dodaj 'Jak ogarnąć DI?' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/&amp;title=Jak+ogarn%C4%85%C4%87+DI%3F" title="dodaj 'Jak ogarnąć DI?' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Jak ogarnąć DI?' do wykop.pl" alt="dodaj 'Jak ogarnąć DI?' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/13/jak-ogarnac-di/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct</title>
		<link>http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/</link>
		<comments>http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 12:51:12 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[DI]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2368</guid>
		<description><![CDATA[Szybko o tym dlaczego ta druga metoda jest zdecydowanie lepsza. Generalnie po ustawieniu pola chcemy wykonać pewne operacje. Wstrzykiwanie via setter W guice adnotujemy @Inject metodę (dowolna nazwa, widoczność itp.) i to wszystko. Problem polega na tym, że obiekt jest w stanie nieokreślonym. Raz, że jego tworzenie jeszcze trwa, a dwa, że nie mamy kontroli [...]]]></description>
			<content:encoded><![CDATA[<p>Szybko o tym dlaczego ta druga metoda jest zdecydowanie lepsza. </p>
<p>Generalnie po ustawieniu pola chcemy wykonać pewne operacje.</p>
<h4>Wstrzykiwanie via setter</h4>
<p>W guice adnotujemy <samp>@Inject</samp> metodę (dowolna nazwa, widoczność itp.) i to wszystko. Problem polega na tym, że obiekt jest w stanie nieokreślonym. Raz, że jego tworzenie jeszcze trwa, a dwa, że nie mamy kontroli nad kolejnością wywoływania metod.</p>
<h4>Wstrzykiwanie via pole + <samp>@PostConstruct</samp></h4>
<p>W tym przypadku w momencie gdy metoda/y oznaczone <samp>@PostConstruct</samp> są wywoływane mamy pewność, że obiekt jest już zainicjowany i spójny. Plusem jest tu też możliwość ukrycia implementacji (brak setterów, metoda może być niewidoczna). Nadal nie mamy kontroli nad kolejnością wywołań w przypadku wielu metod <samp>@PostConstruct</samp>, ale zazwyczaj jedna wystarczy by w niej wykonać określone akcje w zadanej kolejności. </p>
<h4>Gdzie to jest ważne</h4>
<p>Takie coś może okazać się bardzo istotne w momencie gdy robicie DI na elementach GUI. Większość silników UI ma to do siebie, że dodając komponenty robi to w kolejności wywołania metod. Jedynym wyjątkiem są siatki, gdzie można kontrolować położenie komponentu w przestrzeni. Trochę inaczej ma się to w przypadku managerów wyglądu typu Vertical/Horizontal. Tam istotna jest kolejność wywołania metody. Zatem jeżeli nie chcecie stopki na górze strony&#8230;</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/&amp;title=O+r%C3%B3%C5%BCnicach+pomi%C4%99dzy+wstrzykiwaniem+via+setter%2C+a+via+pole+z+wykorzystaniem+%40PostConstruct" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Del.icio.us" alt="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/&amp;title=O+r%C3%B3%C5%BCnicach+pomi%C4%99dzy+wstrzykiwaniem+via+setter%2C+a+via+pole+z+wykorzystaniem+%40PostConstruct" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do digg" alt="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Technorati" alt="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/&amp;title=O+r%C3%B3%C5%BCnicach+pomi%C4%99dzy+wstrzykiwaniem+via+setter%2C+a+via+pole+z+wykorzystaniem+%40PostConstruct" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Stumble Upon" alt="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/&amp;title=O+r%C3%B3%C5%BCnicach+pomi%C4%99dzy+wstrzykiwaniem+via+setter%2C+a+via+pole+z+wykorzystaniem+%40PostConstruct" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Google Bookmarks" alt="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/&amp;t=O+r%C3%B3%C5%BCnicach+pomi%C4%99dzy+wstrzykiwaniem+via+setter%2C+a+via+pole+z+wykorzystaniem+%40PostConstruct" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do FaceBook" alt="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/&amp;title=O+r%C3%B3%C5%BCnicach+pomi%C4%99dzy+wstrzykiwaniem+via+setter%2C+a+via+pole+z+wykorzystaniem+%40PostConstruct" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do wykop.pl" alt="dodaj 'O różnicach pomiędzy wstrzykiwaniem via setter, a via pole z wykorzystaniem @PostConstruct' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/13/o-roznicach-pomiedzy-wstrzykiwaniem-via-setter-a-via-pole-z-wykorzystaniem-postconstruct/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

