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

<channel>
	<title>KoziołekWeb &#187; Java</title>
	<atom:link href="http://koziolekweb.pl/category/java/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>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>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>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>
		<item>
		<title>Jak przetłumaczyć Assisted Injection?</title>
		<link>http://koziolekweb.pl/2012/01/10/jak-przetlumaczyc-assisted-injection/</link>
		<comments>http://koziolekweb.pl/2012/01/10/jak-przetlumaczyc-assisted-injection/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 09:31:53 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[miniblog]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2359</guid>
		<description><![CDATA[Pytanie jak w temacie jak przetłumaczyć guicowe &#8220;Assisted Injection&#8221;? Na razie mam dwie propozycje: Wstrzykiwanie parametryzowane. Wstrzykiwanie wspomagane. Dodaj do]]></description>
			<content:encoded><![CDATA[<p>Pytanie jak w temacie jak przetłumaczyć guicowe &#8220;Assisted Injection&#8221;?</p>
<p>Na razie mam dwie propozycje:</p>
<ul>
<li>Wstrzykiwanie parametryzowane.</li>
<li>Wstrzykiwanie wspomagane.</li>
</ul>
<!-- 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/10/jak-przetlumaczyc-assisted-injection/&amp;title=Jak+przet%C5%82umaczy%C4%87+Assisted+Injection%3F" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Del.icio.us" alt="dodaj 'Jak przetłumaczyć Assisted Injection?' 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/10/jak-przetlumaczyc-assisted-injection/&amp;title=Jak+przet%C5%82umaczy%C4%87+Assisted+Injection%3F" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do digg" alt="dodaj 'Jak przetłumaczyć Assisted Injection?' 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/10/jak-przetlumaczyc-assisted-injection/" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Technorati" alt="dodaj 'Jak przetłumaczyć Assisted Injection?' 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/10/jak-przetlumaczyc-assisted-injection/&amp;title=Jak+przet%C5%82umaczy%C4%87+Assisted+Injection%3F" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Stumble Upon" alt="dodaj 'Jak przetłumaczyć Assisted Injection?' 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/10/jak-przetlumaczyc-assisted-injection/&amp;title=Jak+przet%C5%82umaczy%C4%87+Assisted+Injection%3F" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do Google Bookmarks" alt="dodaj 'Jak przetłumaczyć Assisted Injection?' 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/10/jak-przetlumaczyc-assisted-injection/&amp;t=Jak+przet%C5%82umaczy%C4%87+Assisted+Injection%3F" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do FaceBook" alt="dodaj 'Jak przetłumaczyć Assisted Injection?' 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/10/jak-przetlumaczyc-assisted-injection/&amp;title=Jak+przet%C5%82umaczy%C4%87+Assisted+Injection%3F" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Jak przetłumaczyć Assisted Injection?' do wykop.pl" alt="dodaj 'Jak przetłumaczyć Assisted Injection?' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/10/jak-przetlumaczyc-assisted-injection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prywatne moduły w Guice &#8211; kto zacz&#8230;</title>
		<link>http://koziolekweb.pl/2012/01/09/prywatne-moduly-w-guice-kto-zacz/</link>
		<comments>http://koziolekweb.pl/2012/01/09/prywatne-moduly-w-guice-kto-zacz/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 14:14:54 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2353</guid>
		<description><![CDATA[Na początek małe profanum muzyczne&#8230; Już doszliście do siebie&#8230; to dobrze&#8230; Słowo wstępne Na spotkaniu WJUGa, na którym wraz z Wojtkiem Ebertowskim omawialiśmy Guice Paweł Szklarz zarzucił temat &#8220;Guice to ma a Spring nie&#8221; na przykładzie modułów prywatnych. Rzecz jest to o tyle ciekawa, że świetnie obrazuje podstawową różnicę pomiędzy Guice, a Springiem. Sposób konfiguracji. [...]]]></description>
			<content:encoded><![CDATA[<p>Na początek małe profanum muzyczne&#8230;</p>
<p><object width="960" height="720"><param name="movie" value="http://www.youtube.com/v/UR-I9fcQ1m4?version=3&amp;hl=pl_PL"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/UR-I9fcQ1m4?version=3&amp;hl=pl_PL" type="application/x-shockwave-flash" width="960" height="720" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Już doszliście do siebie&#8230; to dobrze&#8230;</p>
<h4>Słowo wstępne</h4>
<p>Na spotkaniu WJUGa, na którym wraz z Wojtkiem Ebertowskim omawialiśmy Guice Paweł Szklarz zarzucił temat &#8220;Guice to ma a Spring nie&#8221; na przykładzie modułów prywatnych. Rzecz jest to o tyle ciekawa, że świetnie obrazuje podstawową różnicę pomiędzy Guice, a Springiem. Sposób konfiguracji.</p>
<p>Ogólnie rzecz ujmując. W springu wszystko co zostanie użyte w ramach taga <samp>bean</samp> jest przetwarzane tylko w kontekście tego taga. Jeżeli zatem macie dwa beany springowe implementujące ten sam interfejs i zależne od jakiegoś tam, ale identycznego, interfejsu w dwóch różnych implementacjach to możecie skonfigurować wszystko w osobnych tagach <samp>bean</samp>. Zależności uczynić anonimowymi (nie ustawiać <samp>id</samp>) i generalnie pozbyć się problemu. W Guice nie za bardzo idzie tak zrobić, ponieważ chcąc uzyskać jak najogólniejsze łączenie interfejsu z implementacją musimy takie mapowanie upublicznić. Powoduje to, że nie można dodać kolejnego identycznego mapowania. </p>
<h5>Przykład z życia</h5>
<p>Potrzebujemy w ramach aplikacji odwoływać się do dwóch identycznych baz danych. Te same mapowania, te same operacje, itd. tylko inne adresy. W Springu stworzylibyśmy klasę i skonfigurowali ja jako dwa niezależne beany, każdy w własną konfiguracją. W Guice taka sztuczka nie przejedzie ponieważ konfiguracja <samp>JpaPersistModule</samp> nie pozwala na wykorzystanie wielu jednostek utrwalania. Dodatkowo nie idzie tego skonfigurować. Z pomocą przychodzą tu moduły prywatne.</p>
<h4>Moduł prywatny kto zacz</h4>
<p>Moduł prywatny jest to specjalna implementacja modułu Guice, która w trakcie tworzenia w danym injectorze tworzy injector pochodny i do niego dowiązuje swoją konfigurację. W ten sposób konfiguracja jest niewidoczna w nadrzędnym injectorze, a tym samym można stworzyć wiele identycznych konfiguracji, które nie będą się wzajemnie widzieć. Można oczywiście pewne elementy konfiguracji upublicznić co pozwala na np. użycie dwóch identycznych jednostek utrwalania w ramach jednego projektu.</p>
<h4>Przykładzik</h4>
<p>Zadanie przepisać tabelę z jednej bazy do drugiej.</p>
<p>Na początek konfiguracja baz danych. Wykorzystuję tu dwie instancje HSQLDB umieszczone w pamięci. Jedyny problem z tym związany to konieczność dodania danych do źródła za pomocą DAO. Jak chcesz to przerzuć się na postgresa i wykorzystaj DBUnit.</p>
<p class="listing">Listing 1. konfiguracja baz  &#8211; persistence.xml</p>
<pre class="xml" name="code"><?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="source-pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>pl.koziolekweb.guice.SomeEntity</class>
<properties>
<property name="hibernate.connection.url" value="jdbc:hsqldb:mem:source" />
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.username" value="sa" />
<property name="hibernate.connection.password" value="" />
		</properties>
	</persistence-unit>
<persistence-unit name="target-pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>pl.koziolekweb.guice.SomeEntity</class>
<properties>
<property name="hibernate.connection.url" value="jdbc:hsqldb:mem:target" />
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.username" value="sa" />
<property name="hibernate.connection.password" value="" />
		</properties>
	</persistence-unit>
</persistence></pre>
<p>Następnie interfejs DAO:</p>
<p class="listing">Listing 2. DAO</p>
<pre class="java" name="code">package pl.koziolekweb.guice;

import java.util.Collection;

public interface SomeEntityDao {

	void saveAll(Collection<SomeEntity> someEntities);

	Collection<SomeEntity> getAll();
}</pre>
<p>Implementacja</p>
<p class="listing">Listing 3. implementacja DAO</p>
<pre class="java" name="code">package pl.koziolekweb.guice;

import java.util.Collection;

import javax.inject.Inject;
import javax.persistence.EntityManager;

import com.google.inject.persist.Transactional;

public class SomeEntityDaoImpl implements SomeEntityDao {

	@Inject
	private EntityManager em;

	@Transactional
	@Override
	public void saveAll(Collection<SomeEntity> someEntities) {
		for (SomeEntity se : someEntities)
			em.merge(se);
		em.flush();
	}

	@Transactional
	@Override
	public Collection<SomeEntity> getAll() {
		return em.createQuery("Select se From SomeEntity se", SomeEntity.class).getResultList();
	}

}
</pre>
<p>oraz nasza encja</p>
<p class="listing">Listing 4. <samp>SomeEntity</samp></p>
<pre class="java" name="code">package pl.koziolekweb.guice;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

@Entity
public class SomeEntity {

	@SequenceGenerator(name = "Gen", sequenceName = "Seq")
	@GeneratedValue(generator = "Gen")
	@Id
	public Long id;

	public String name;

	public SomeEntity() {

	}

	public SomeEntity(String name) {
		this.name = name;
	}
}</pre>
<p>Jak widać nie ma tu nic niezwykłego. </p>
<h5>Aplikacja</h5>
<p>Kolejnym elementem jest aplikacja przepisująca dane. Klasa posiada ona dwa pola reprezentujące dao powiązane z różnymi PU.</p>
<p class="listing">Listing 5. Wybitnie skomplikowana klasa<samp>App</samp></p>
<pre class="java" name="code">package pl.koziolekweb.guice;

import java.util.LinkedList;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import com.google.inject.Guice;
import com.google.inject.Injector;

public class App {

	@Inject
	@Named("source")
	private SomeEntityDao source;

	@Inject
	@Named("target")
	private SomeEntityDao target;

	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new MainModule());
		App instance = injector.getInstance(App.class);
		instance.prepare();
		instance.verify();
		instance.copy();
		instance.verify();
	}

	public void verify() {
		System.out.println(source.getAll().size());
		System.out.println(target.getAll().size());
	}

	public void copy() {
		target.saveAll(source.getAll());
	}

	public void prepare() {
		List<SomeEntity> data = new LinkedList<SomeEntity>();
		data.add(new SomeEntity("A"));
		data.add(new SomeEntity("B"));
		data.add(new SomeEntity("C"));
		source.saveAll(data);
	}

}</pre>
<p>Jak widać instalujemy tylko jeden moduł &#8211; <samp>MainModule</samp>. Przyjrzyjmy się mu <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p class="listing">Listing 6. główny moduł aplikacji</p>
<pre class="java" name="code">package pl.koziolekweb.guice;

import com.google.inject.AbstractModule;

public class MainModule extends AbstractModule {

	@Override
	protected void configure() {
		install(new DaoModule("source-pu", "source"));
		install(new DaoModule("target-pu", "target"));
	}

}</pre>
<p>Nie ma tu nic nadzwyczajnego. Instalujemy dwa moduły <samp>DaoModule</samp>. Przyjrzyjmy się tej klasie (zaczyna się robić wpis ginekologiczno-pornograficzny wnikamy głębiej).</p>
<p class="listing">Listing 7. Moduł zarządzający DAO</p>
<pre class="java" name="code">package pl.koziolekweb.guice;

import com.google.inject.PrivateModule;
import com.google.inject.name.Names;
import com.google.inject.persist.jpa.JpaPersistModule;

public class DaoModule extends PrivateModule {

	private String jpaUnit;
	private String emMarker;

	public DaoModule(String jpaUnit, String emMarker) {
		super();
		this.jpaUnit = jpaUnit;
		this.emMarker = emMarker ;

	}

	@Override
	protected void configure() {
		install(new JpaPersistModule(jpaUnit));
		bind(DaoInitializer.class).asEagerSingleton();
		bind(SomeEntityDao.class).annotatedWith(Names.named(emMarker)).to(SomeEntityDaoImpl.class);
		expose(SomeEntityDao.class).annotatedWith(Names.named(emMarker));
	}

}</pre>
<p>Tu zaczyna być ciekawie. Zanim omówię co i jak to dla porządku klasa <samp>DaoInitializer</samp>:</p>
<p class="listing">Listing 8. Klasa <samp>DaoInitializer</samp></p>
<pre class="java" name="code">package pl.koziolekweb.guice;

import javax.inject.Inject;

import com.google.inject.persist.PersistService;

public class DaoInitializer {

	@Inject
	public DaoInitializer(PersistService service) {
		System.out.println(service.toString());
		service.start();
	}
}</pre>
<h5>ale co się dzieje</h5>
<p>Na listingu 8 mamy sobie klasę &#8211; moduł guice, która zamiast <samp>AbstractModule</samp> rozszerza <samp>PrivateModule</samp>. W konstruktorze przyjmuje ona sobie dwa parametry. Pierwszy to nazwa PU z pliku konfiguracyjnego, a drugi to nazwa pod jaką będziemy udostępniać DAO. Generalnie mamy tu dość dużą swobodę. Można przyjąć, że pola trzymające DAO muszą mieć taką samą nazwę (w sensie adnotacji <samp>@Named</samp>) jak używany PU. Można dać opcję na własną adnotację. Można przyjąć, że nazwa podana w kodzie ma odpowiednik w xmlu z jakimś przedrostkiem, przyrostkiem, wrostkiem, wyrostkiem czy innym tego typu tworem (brak ci inwencji w nazewnictwie &#8211; sięgnij po podręcznik do dermatologii, na pewno coś znajdziesz).<br />
Następnie jest sobie metoda <samp>configure</samp>, a w niej instalujemy w pierwszej kolejności moduł do obsługi JPA. Następnie tworzymy i inicjujemy (użycie <samp>asEagerSingleton</samp>) obiekt <samp>DaoInitializer</samp>, który uruchamia nam usługę JPA. Teraz możemy już powiązać interfejs i implementację DAO koniecznie wykorzystując tu informację, że pole jest adnotowane. Ostatnim akordem tej zabawy jest wywołanie metody <samp>expose</samp>, która udostępnia definicję naszej konfiguracji innym modułom (umieszcza ją w nadrzędnym injectorze). Co ważne wszystko co znajduje się w tym module jest odseparowane od świata. Zatem nie ma możliwości by nadpisać sobie konfigurację w innym module. </p>
<p>Uruchamiamy&#8230; </p>
<p class="listing">Listing 9. uruchomienie aplikacji</p>
<pre class="bash" name="code">com.google.inject.persist.jpa.JpaPersistService@77158a
com.google.inject.persist.jpa.JpaPersistService@a7c45e
Hibernate:
    insert
    into
        SomeEntity
        (id, name)
    values
        (null, ?)
Hibernate:
    call identity()
Hibernate:
    insert
    into
        SomeEntity
        (id, name)
    values
        (null, ?)
Hibernate:
    call identity()
Hibernate:
    insert
    into
        SomeEntity
        (id, name)
    values
        (null, ?)
Hibernate:
    call identity()
Hibernate:
    select
        someentity0_.id as id0_,
        someentity0_.name as name0_
    from
        SomeEntity someentity0_
3
Hibernate:
    select
        someentity0_.id as id2_,
        someentity0_.name as name2_
    from
        SomeEntity someentity0_
0
Hibernate:
    select
        someentity0_.id as id0_,
        someentity0_.name as name0_
    from
        SomeEntity someentity0_
Hibernate:
    select
        someentity0_.id as id2_0_,
        someentity0_.name as name2_0_
    from
        SomeEntity someentity0_
    where
        someentity0_.id=?
Hibernate:
    insert
    into
        SomeEntity
        (id, name)
    values
        (null, ?)
Hibernate:
    call identity()
Hibernate:
    select
        someentity0_.id as id2_0_,
        someentity0_.name as name2_0_
    from
        SomeEntity someentity0_
    where
        someentity0_.id=?
Hibernate:
    insert
    into
        SomeEntity
        (id, name)
    values
        (null, ?)
Hibernate:
    call identity()
Hibernate:
    select
        someentity0_.id as id2_0_,
        someentity0_.name as name2_0_
    from
        SomeEntity someentity0_
    where
        someentity0_.id=?
Hibernate:
    insert
    into
        SomeEntity
        (id, name)
    values
        (null, ?)
Hibernate:
    call identity()
Hibernate:
    select
        someentity0_.id as id0_,
        someentity0_.name as name0_
    from
        SomeEntity someentity0_
3
Hibernate:
    select
        someentity0_.id as id2_,
        someentity0_.name as name2_
    from
        SomeEntity someentity0_
3
</pre>
<p>&#8230;i się cieszymy.</p>
<h4>Podsumowanie</h4>
<p>Prywatne moduły wprowadzają nam funkcjonalność, która nie jest spotykana w Springu. Jednocześnie należy zaznaczyć, że Spring reprezentuje zupełnie inne podejście do problemu konfiguracji i zakresów widoczności poszczególnych beanów. Tym samym nie można mówić o tym, które rozwiązanie jest lepsze. One są po prostu diametralnie różne.</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/09/prywatne-moduly-w-guice-kto-zacz/&amp;title=Prywatne+modu%C5%82y+w+Guice+%26%238211%3B+kto+zacz%26%238230%3B" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Del.icio.us" alt="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' 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/09/prywatne-moduly-w-guice-kto-zacz/&amp;title=Prywatne+modu%C5%82y+w+Guice+%26%238211%3B+kto+zacz%26%238230%3B" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do digg" alt="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' 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/09/prywatne-moduly-w-guice-kto-zacz/" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Technorati" alt="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' 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/09/prywatne-moduly-w-guice-kto-zacz/&amp;title=Prywatne+modu%C5%82y+w+Guice+%26%238211%3B+kto+zacz%26%238230%3B" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Stumble Upon" alt="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' 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/09/prywatne-moduly-w-guice-kto-zacz/&amp;title=Prywatne+modu%C5%82y+w+Guice+%26%238211%3B+kto+zacz%26%238230%3B" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do Google Bookmarks" alt="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' 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/09/prywatne-moduly-w-guice-kto-zacz/&amp;t=Prywatne+modu%C5%82y+w+Guice+%26%238211%3B+kto+zacz%26%238230%3B" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do FaceBook" alt="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' 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/09/prywatne-moduly-w-guice-kto-zacz/&amp;title=Prywatne+modu%C5%82y+w+Guice+%26%238211%3B+kto+zacz%26%238230%3B" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do wykop.pl" alt="dodaj 'Prywatne moduły w Guice &#8211; kto zacz&#8230;' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/09/prywatne-moduly-w-guice-kto-zacz/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Świąteczne boje z formatem TOD</title>
		<link>http://koziolekweb.pl/2011/12/25/swiateczne-boje-z-formatem-tod/</link>
		<comments>http://koziolekweb.pl/2011/12/25/swiateczne-boje-z-formatem-tod/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 11:50:05 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[tod2mpg]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2344</guid>
		<description><![CDATA[Mam sobie kamerkę JVC. Chcieliśmy rodzinie rozdać płyty z filmami małego. Rzecz w tym, że żaden rozsądny program nie czyta formatu TOD. Format TOD to wynalazek JVC, który należy konwertować do jakiegoś rozsądnego formatu. W naszym przypadku MPEG. Poniżej jar z konwerterem mojego autorstwa. tod2mpg Uruchomienie: Listing 1. uruchomienie konwertera $> java -jar tod2mpg.zip -h [...]]]></description>
			<content:encoded><![CDATA[<p>Mam sobie kamerkę JVC. Chcieliśmy rodzinie rozdać płyty z filmami małego. Rzecz w tym, że żaden rozsądny program nie czyta formatu TOD.<br />
Format TOD to wynalazek JVC, który należy konwertować do jakiegoś rozsądnego formatu. W naszym przypadku MPEG. Poniżej jar z konwerterem mojego autorstwa.<br />
<a href='http://koziolekweb.pl/wp-content/uploads/2011/12/tod2mpg.zip'>tod2mpg</a></p>
<p>Uruchomienie:</p>
<p class="listing">Listing 1. uruchomienie konwertera</p>
<pre class="bash" name="code">$> java -jar tod2mpg.zip -h</pre>
<p>Ci, którzy cenią porządek mogą se zmienić rozszerzenie na jar. Licencja <a href="http://pl.wikipedia.org/wiki/Beerware" target="_blank" title="From Wikipedia the definition of: Beerware" class="wikiterm" >Beerware</a><sup class="wikiicon" ><em>W</em></sup>. Źródła wrzucę na githuba wieczorem.</p>
<p>// edit:</p>
<p>całość na Githubie:<br />
git://github.com/Koziolek/tod2mpeg-converter.git</p>
<p>Swoją drogą proszę się nie przerazić trywialnością rozwiązania. Trochę się wkurzyłem jak odkryłem CZYM są pliki TOD <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </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/2011/12/25/swiateczne-boje-z-formatem-tod/&amp;title=%C5%9Awi%C4%85teczne+boje+z+formatem+TOD" title="dodaj 'Świąteczne boje z formatem TOD' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Świąteczne boje z formatem TOD' do Del.icio.us" alt="dodaj 'Świąteczne boje z formatem TOD' 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/2011/12/25/swiateczne-boje-z-formatem-tod/&amp;title=%C5%9Awi%C4%85teczne+boje+z+formatem+TOD" title="dodaj 'Świąteczne boje z formatem TOD' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Świąteczne boje z formatem TOD' do digg" alt="dodaj 'Świąteczne boje z formatem TOD' 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/2011/12/25/swiateczne-boje-z-formatem-tod/" title="dodaj 'Świąteczne boje z formatem TOD' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Świąteczne boje z formatem TOD' do Technorati" alt="dodaj 'Świąteczne boje z formatem TOD' 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/2011/12/25/swiateczne-boje-z-formatem-tod/&amp;title=%C5%9Awi%C4%85teczne+boje+z+formatem+TOD" title="dodaj 'Świąteczne boje z formatem TOD' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Świąteczne boje z formatem TOD' do Stumble Upon" alt="dodaj 'Świąteczne boje z formatem TOD' 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/2011/12/25/swiateczne-boje-z-formatem-tod/&amp;title=%C5%9Awi%C4%85teczne+boje+z+formatem+TOD" title="dodaj 'Świąteczne boje z formatem TOD' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Świąteczne boje z formatem TOD' do Google Bookmarks" alt="dodaj 'Świąteczne boje z formatem TOD' 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/2011/12/25/swiateczne-boje-z-formatem-tod/&amp;t=%C5%9Awi%C4%85teczne+boje+z+formatem+TOD" title="dodaj 'Świąteczne boje z formatem TOD' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Świąteczne boje z formatem TOD' do FaceBook" alt="dodaj 'Świąteczne boje z formatem TOD' 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/2011/12/25/swiateczne-boje-z-formatem-tod/&amp;title=%C5%9Awi%C4%85teczne+boje+z+formatem+TOD" title="dodaj 'Świąteczne boje z formatem TOD' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Świąteczne boje z formatem TOD' do wykop.pl" alt="dodaj 'Świąteczne boje z formatem TOD' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/12/25/swiateczne-boje-z-formatem-tod/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

