<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Johnny&#039;s Blog</title>
	<atom:link href="http://graberj.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://graberj.wordpress.com</link>
	<description>Über IT und den Rest der Welt</description>
	<lastBuildDate>Mon, 30 Jan 2012 20:53:07 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='graberj.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Johnny&#039;s Blog</title>
		<link>http://graberj.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://graberj.wordpress.com/osd.xml" title="Johnny&#039;s Blog" />
	<atom:link rel='hub' href='http://graberj.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Buch-Rezension zu &#8222;Professional Test Driven Development with C#&#8220;</title>
		<link>http://graberj.wordpress.com/2012/01/30/buch-rezension-zu-professional-tdd/</link>
		<comments>http://graberj.wordpress.com/2012/01/30/buch-rezension-zu-professional-tdd/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 20:01:53 +0000</pubDate>
		<dc:creator>Johnny Graber</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Bücher]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://graberj.wordpress.com/?p=1820</guid>
		<description><![CDATA[Wer Unit Tests und TDD in der Praxis einsetzen will merkt bald einmal dass die einfachen Beispiele einem nicht weit bringen. "Professional Test Driven Development with C#" ist angetreten um zu zeigen wie TDD in realen Projekten genutzt werden kann. Kann das Buch dieses Versprechen halten?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1820&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-047064320X,descCd-DOWNLOAD.html"><img src="http://graberj.files.wordpress.com/2012/01/professionaltdd.jpg?w=600" alt="" title="Professional TDD"   class="alignleft size-full wp-image-1825" /></a>&#8222;<a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-047064320X,descCd-DOWNLOAD.html">Professional Test Driven Development with C#</a>&#8220; von Jeff McWherter und James Bender erschien im Mai 2011 bei Wiley. Das Buch richtet sich an all die Entwickler, die ihre C#-Anwendungen nach Test-First entwickeln wollen. </p>
<p>Wer sich bisher noch nicht mit dem Thema Test Driven Development (TDD) beschäftigt hat findet in den ersten beiden Teilen des Buches eine gute und ausführliche Einführung ins Thema.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>TDD Szenarien aus der Praxis</h2>
<p>Der dritte Teil widmet sich den praxisorientierten TDD Szenarien. Im Gegensatz zu vielen anderen Büchern geht es hier um die schwerer zu testenden Teile:</p>
<ul>
<li>ASP.Net WebForms</li>
<li>ASP.Net MVC</li>
<li>JavaScript</li>
<li>WPF</li>
<li>Silverlight</li>
<li>WCF</li>
</ul>
<p>Im Buch wird zu jeder dieser Technologien aufgezeigt wo die besonderen Herausforderungen liegen und wie man diese Testen kann. Wann immer möglich sollte man die dazu passenden Patterns verwenden. Geht dies nicht ist man auf sich alleine gestellt: Das Buch erklärt leider nur genau einen Weg um die entsprechende Technologie zu testen. </p>
<p>&nbsp;</p>
<h2>Werkzeuge und Katas</h2>
<p>Als Abschluss gibt es einen Teil der sich den Werkzeugen widmet. Bei der Vielzahl möglicher Test-, Mock- und DI-Frameworks ist es nicht leicht eine Auswahl zu treffen. Die Autoren vergleichen jeweils einige Werkzeuge aus dem gleichen Bereich und nennen die für sie wichtigsten Unterschiede. Auch wenn dies die eigene Recherche nicht ersetzt, so ist dies doch ein guter Ausgangspunkt um seinen Werkzeugkasten zusammen zu stellen.</p>
<p>Im Appendix wir noch auf das Thema <a href="http://codingdojo.org">(TDD-) Katas</a> eingegangen. Kleinen Übungen sollen einem dabei helfen das gelernte zu verinnerlichen. Die Idee stammt aus dem Kampfsport und hilft dort die richtigen Aktionen und Bewegungen zur richtigen Zeit zu machen. Übertragen auf TDD bedeutet dies: Hat man immer und immer wieder geübt wie man erst einen Test und dann den produktiven Code schreibt, geht dies in einem über und man wendet die gleiche Technik auch mit dem Code direkt vor einem an.</p>
<p>&nbsp;</p>
<h2>Ein E-Book aber kein PDF</h2>
<p>Wiley bietet für dieses Buch eine E-Book Version an, aber leider nur in den Formaten ePub und mobi. Gerade wenn ein Buch viele Code-Beispiele hat habe ich neben der Kindle-Version sehr gerne noch ein PDF. Nicht nur sieht der Code dort meist besser aus, er lässt sich auch einfach kopieren. Mir schein als ob Wiley der Konkurrenz in diesem Bereich noch weit hinterher hinkt. </p>
<p>&nbsp;</p>
<h2>Fazit</h2>
<p>Den beiden Autoren ist in einem oft behandelten Themenbereich ein gutes Werk gelungen. Die beiden Einführungsteile liefern alles nötige Grundwissen damit man auch als Anfänger durchstarten kann. Die Auswahl eines Werkzeugkastens und das vermitteln der Ideen rund um TDD runden dieses Buch ab. Mir fehlen hier einzig noch einige alternative Ansätze zum Testen der behandelten .Net-Komponenten. </p>
<p>„<a href="http://graberj.wordpress.com/2009/11/08/buch-rezension-zu-the-art-of-unit-testing/">The Art of Unit Testing</a>“ ist zwar immer noch mein Favorit zum Thema TDD, dieses Buch folgt aber mit einem sehr kleinen Abstand. </p>
<p>&nbsp;</p>
<h2>Zum Buch</h2>
<p>&#8222;<a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-047064320X,descCd-DOWNLOAD.html">Professional Test Driven Development with C#</a>&#8220; von Jeff McWherter und James Bender, 2011 Wiley, ISBN: 978-0-470-64320-4, 360 Seiten, Englisch</p>
<br />Einsortiert unter:<a href='http://graberj.wordpress.com/category/net/'>.Net</a>, <a href='http://graberj.wordpress.com/category/bucher/'>Bücher</a> Tagged: <a href='http://graberj.wordpress.com/tag/net/'>.Net</a>, <a href='http://graberj.wordpress.com/tag/bucher/'>Bücher</a>, <a href='http://graberj.wordpress.com/tag/c/'>C#</a>, <a href='http://graberj.wordpress.com/tag/clean-code/'>Clean Code</a>, <a href='http://graberj.wordpress.com/tag/tdd/'>TDD</a>, <a href='http://graberj.wordpress.com/tag/unit-test/'>Unit Test</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/graberj.wordpress.com/1820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/graberj.wordpress.com/1820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/graberj.wordpress.com/1820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/graberj.wordpress.com/1820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/graberj.wordpress.com/1820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/graberj.wordpress.com/1820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/graberj.wordpress.com/1820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/graberj.wordpress.com/1820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/graberj.wordpress.com/1820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/graberj.wordpress.com/1820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/graberj.wordpress.com/1820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/graberj.wordpress.com/1820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/graberj.wordpress.com/1820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/graberj.wordpress.com/1820/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1820&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://graberj.wordpress.com/2012/01/30/buch-rezension-zu-professional-tdd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fd2bd6ebacb744ce20c57a9e4cbb252d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">graberj</media:title>
		</media:content>

		<media:content url="http://graberj.files.wordpress.com/2012/01/professionaltdd.jpg" medium="image">
			<media:title type="html">Professional TDD</media:title>
		</media:content>
	</item>
		<item>
		<title>Leichter testen mit Moq</title>
		<link>http://graberj.wordpress.com/2011/12/30/leichter-testen-mit-moq/</link>
		<comments>http://graberj.wordpress.com/2011/12/30/leichter-testen-mit-moq/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 15:59:15 +0000</pubDate>
		<dc:creator>Johnny Graber</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://graberj.wordpress.com/?p=1793</guid>
		<description><![CDATA[Moq ist ein kleines und sehr einfaches Mock-Framework für .Net / C#. Obwohl es solche Frameworks wie Sand am Meer gibt, so sticht Moq doch heraus. Allzu oft ist das Aufsetzen eines Mocks sehr umständlich und der Test Code wird unnötig kompliziert. Moq dagegen nutzt eine sehr klare Syntax und verfügt über ein praxisorientiertes Standardverhalten. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1793&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/moq/">Moq</a> ist ein kleines und sehr einfaches Mock-Framework für .Net / C#. Obwohl es solche Frameworks wie Sand am Meer gibt, so sticht Moq doch heraus. Allzu oft ist das Aufsetzen eines <a href="http://de.wikipedia.org/wiki/Mock-Objekt">Mocks</a> sehr umständlich und der Test Code wird unnötig kompliziert. Moq dagegen nutzt eine sehr klare Syntax und verfügt über ein praxisorientiertes Standardverhalten. </p>
<p>&nbsp;</p>
<h2>Wozu Mocks?</h2>
<p>Bei Unit-Tests möchte man möglichst nur eine kleine Einheit testen. Meistens aber gibt es Abhängigkeiten zu anderen Einheiten die man für diesen Test ignorieren möchte. Ist man am Erstellen eines Rabattsystems für einen Warenkorb möchte man nicht jedes Mal überprüfen ob der Warenkorb korrekt aus der Datenbank geladen werden kann.</p>
<p>Es kann auch sein das die Abhängigkeiten für die zu testende Einheit noch gar nicht existieren. Soll ein Client und ein Service parallel entwickelt werden einigt man sich zuerst auf eine Schnittstelle. Bis der Service läuft muss man mit dem Client gegen etwas testen können. <a href="http://de.wikipedia.org/wiki/Mock-Objekt">Mocks</a> können dieses „etwas“ sein und den Service simulieren.</p>
<p>Was zwischen 2 Systemen geht funktioniert genauso auch mit gewöhnlichen Klassen. Hier kann man ein Interface definieren und erzeugt daraus einen Mock bis man eine richtige Implementierung hat.</p>
<p>&nbsp;</p>
<h2>Moq verwenden</h2>
<p>Moq installiert man am besten über <a href="http://graberj.wordpress.com/2011/05/26/abhangigkeiten-auflosen-mit-nuget/">NuGet</a>. Man bekommt so die aktuelle Version und kann später sehr einfach das installierte Paket aktualisieren. Wer dies nicht will findet den Code auf der <a href="http://code.google.com/p/moq/downloads/list">Projektseite</a>. Die Referenz auf Moq braucht es nur im Testprojekt, das Projekt mit dem produktiven Code muss von Moq nichts wissen.</p>
<p>Bevor man mit Moq loslegt sollte man einen Blick auf den <a href="http://code.google.com/p/moq/wiki/QuickStart">QuickStart Artikel</a> im Wiki werfen. Dort werden die häufigsten Anwendungsfälle mit Codebeispielen gezeigt. </p>
<p>Für mein Beispiel nutze ich das Interface IPersonService und die Klasse Person:<br />
<pre class="brush: csharp;">
public interface IPersonService
{
    Person GetPersonById(int id);

    bool IsActive(Person person);
}

public class Person
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
}
</pre></p>
<p>Ich möchte erreichen dass immer wenn ich die Methode GetPersonById(1) aufrufe eine bestimmte Instanz von Person zurückgegeben wird. Dazu genügt es die Person zu instantzieren und 2 Zeilen Code um Moq aufzusetzen:</p>
<p><pre class="brush: csharp;">
[TestMethod]
public void ShowHowToMockAnInterface()
{
    Person person = new Person(){LastName = &quot;Graber&quot;, FirstName = &quot;Johnny&quot;};
            
    var mock = new Mock&lt;IPersonService&gt;();
    mock.Setup(service =&gt; service.GetPersonById(1)).Returns(person);

    Assert.AreEqual(person, mock.Object.GetPersonById(1));
}
</pre></p>
<p>Wer sich bisher nicht mit <a href="http://msdn.microsoft.com/de-de/library/bb397687.aspx">Lambda-Ausdrücken</a> beschäftigt hat wird vielleicht ein wenig verwirrt sein. Ich finde den Code so aber sehr leserlich und verständlich. Will man später seine Methode umbenennen wird mit den Tools von Visual Studio dieser Aufruf gefunden. Würde man statt dem Lambda einen String benutzen ist dies nicht immer der Fall.</p>
<p>Um eine realistischere Verwendung von Moq zu zeigen soll nun die Klasse Worker die Person holen. Diese kennt nur das Interface und weiss nichts von Moq:</p>
<p><pre class="brush: csharp;">
public class Worker
{
    private readonly IPersonService _personService;

    public Worker(IPersonService personService)
    {
        _personService = personService;
    }

    public Person GetPerson()
    {
        return _personService.GetPersonById(1);
    }
}
</pre></p>
<p>Der dazugehörige Test sieht fast gleich aus:</p>
<p><pre class="brush: csharp;">
[TestMethod]
public void ShowUsageOfMock()
{
    Person person = new Person() { LastName = &quot;Graber&quot;, FirstName = &quot;Johnny&quot; };

    var mock = new Mock&lt;IPersonService&gt;();
    mock.Setup(service =&gt; service.GetPersonById(1)).Returns(person);   

    Worker worker = new Worker(mock.Object);

    Assert.AreEqual(person, worker.GetPerson());
}
</pre></p>
<p>&nbsp;</p>
<h2>Stabile Tests</h2>
<p>Was mir an Moq besonders gefällt ist das Standardverhalten. Wird eine Methode des Interfaces aufgerufen die man nicht gemockt hat liefert Moq den <a href="http://msdn.microsoft.com/en-us/library/83fhsxwc%28v=vs.80%29.aspx">Standardwert</a> zurück. Wenn ich eine neue Methode im Interface hinzufüge und diese im Worker aufrufe funktionieren meine bisherigen Tests auch weiterhin. </p>
<p><pre class="brush: csharp;">

public interface IPersonService
{
    Person GetPersonById(int id);

    bool IsActive(Person person); // Neue Methode
}

public class Worker
{
    ...
    public Person GetPerson()
    {
        Person p = _personService.GetPersonById(1);
        _personService.IsActive(p); // neuer Aufruf
        return p;
    }
}
</pre></p>
<p>Durch dieses Verhalten sind die Tests weniger Fehleranfällig. Wenn ich aber einen Fehler will sobald andere Methoden von meinem Mock aufgerufen werden kann ich dies im Konstruktor aktivieren:</p>
<p><pre class="brush: csharp;">
var mock = new Mock&lt;IPersonService&gt;(MockBehavior.Strict);
</pre></p>
<p>&nbsp;</p>
<h2>Wo Moq an seine Grenzen stösst</h2>
<p>Wie viele Mock-Frameworks kann auch Moq keine statischen Klassen und Methoden mocken. Arbeitet man an einem neuen Projekt kann man diese Einschränkung umgehen in dem man möglichst auf statischen Methoden verzichtet und wo nicht anders möglich diese in einen Wrapper packt.</p>
<p>Will man aber in einem grossen bestehenden Projekt mit vielen statischen Methoden mit Unit Tests beginnen ist die Einschränkung von Moq ein Problem. In dem Fall sollte man sich <a href="http://www.typemock.com">TypeMock</a> und <a href="http://www.telerik.com/products/mocking.aspx">JustMock</a> anschauen. Diese Frameworks umgehen die Einschränkungen mit statischen Klassen und Methoden indem sie sich sehr tief im .Net Framework einklinken und Methodenaufrufe umleiten. </p>
<p>&nbsp;</p>
<h2>Fazit</h2>
<p><a href="http://code.google.com/p/moq/">Moq</a> ist ein sehr hilfreiches Werkzeug für Unit Tests. Es macht genau was man von ihm erwartet und braucht dazu nur eine minimale Konfiguration. Dadurch kann man sich auf das konzentrieren was man wirklich machen will: Mit Unit-Tests neue Funktionalität einbauen.</p>
<p>&nbsp;</p>
<br />Einsortiert unter:<a href='http://graberj.wordpress.com/category/net/'>.Net</a>, <a href='http://graberj.wordpress.com/category/software-entwicklung/'>Software Entwicklung</a> Tagged: <a href='http://graberj.wordpress.com/tag/net/'>.Net</a>, <a href='http://graberj.wordpress.com/tag/c/'>C#</a>, <a href='http://graberj.wordpress.com/tag/unit-test/'>Unit Test</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/graberj.wordpress.com/1793/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/graberj.wordpress.com/1793/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/graberj.wordpress.com/1793/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/graberj.wordpress.com/1793/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/graberj.wordpress.com/1793/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/graberj.wordpress.com/1793/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/graberj.wordpress.com/1793/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/graberj.wordpress.com/1793/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/graberj.wordpress.com/1793/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/graberj.wordpress.com/1793/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/graberj.wordpress.com/1793/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/graberj.wordpress.com/1793/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/graberj.wordpress.com/1793/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/graberj.wordpress.com/1793/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1793&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://graberj.wordpress.com/2011/12/30/leichter-testen-mit-moq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fd2bd6ebacb744ce20c57a9e4cbb252d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">graberj</media:title>
		</media:content>
	</item>
		<item>
		<title>Buch-Rezension zu &#8222;Rails 3 in Action&#8220;</title>
		<link>http://graberj.wordpress.com/2011/12/25/buch-rezension-rails-3-in-action/</link>
		<comments>http://graberj.wordpress.com/2011/12/25/buch-rezension-rails-3-in-action/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 13:07:54 +0000</pubDate>
		<dc:creator>Johnny Graber</dc:creator>
				<category><![CDATA[Bücher]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://graberj.wordpress.com/?p=1747</guid>
		<description><![CDATA[&#8222;Rails 3 in Action&#8220; von Ryan Bigg und Yehuda Katz erschien im September 2011 bei Manning. Ein Buch für Einsteiger in Rails kam mir gerade sehr gelegen, da ich nach einigem Experimentieren mit Ruby nun gerne eine Webanwendung mit Rails entwickeln wollte. Dieses Buch liest sich sehr flüssig und man bemerkt schnell dass die Autoren [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1747&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.manning.com/katz/"><img src="http://graberj.files.wordpress.com/2011/12/rails3inaction.jpg?w=600" alt="" title="Rails 3 in Action"   class="alignleft size-full wp-image-1772" /></a>&#8222;<a href="http://www.manning.com/katz/">Rails 3 in Action</a>&#8220; von Ryan Bigg und Yehuda Katz erschien im September 2011 bei Manning. Ein Buch für Einsteiger in Rails kam mir gerade sehr gelegen, da ich nach einigem Experimentieren mit Ruby nun gerne eine Webanwendung mit Rails entwickeln wollte. </p>
<p>Dieses Buch liest sich sehr flüssig und man bemerkt schnell dass die Autoren wissen wovon sie schreiben. Will man das gelesene aber selber umsetzen bemerkt man leider ebenfalls sehr bald die ersten Probleme. Wichtige Punkte und Details werden erwähnt, aber nicht wirklich gut hervorgehoben. Oft bemerkt man die entscheidenden Stellen so erst nach längerer Fehlersuche im selber geschriebenen Code.</p>
<p>&nbsp;</p>
<h2>Von rails new bis zum deployment</h2>
<p>Durch das ganze Buch hindurch wird ein <a href="http://de.wikipedia.org/wiki/Issue-Tracking-System">Issue-Tracking-System</a> Schritt für Schritt aufgebaut. Man beginnt mit rails new und bekommt im weiteren Verlauf gezeigt wie man mit dem <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">MVC-Pattern</a> eine Webanwendung entwickelt. </p>
<p>Neben einfachen CRUD-Oberflächen (zum Erstellen, Anzeigen, Editieren und Löschen von Objekten) wird auch auf verschachtelte Ressourcen eingegangen. Wie man Benutzer Authentifiziert und Autorisiert fehlt ebenso wenig wie das Versenden von E-Mails.</p>
<p>Hat man seine Anwendung zusammen muss diese auch deployt werden. Neben einer Anleitung zum Konfigurieren von Capistrano wird auch erklärt wie man Apache oder <a href="http://de.wikipedia.org/wiki/Nginx">Nginx</a> konfigurieren muss, damit die Anfragen an die Rails-Anwendung auch beantwortet werden.</p>
<p>Die Autoren zeigen sehr schön welche Schritte nötig sind um von einer Idee zu einer installierten Anwendung zu kommen. Die einzelnen Schritte sind dabei sehr gut durchdacht und man sieht wie alles zusammen passt. Das Konzept dieses Buches ist top, leider wird durch etliche kleine Fehler der Praxisnutzen bald einmal reduziert.</p>
<p>&nbsp;</p>
<h2>Erst ein Test, dann die Funktionalität</h2>
<p>Mit Ausnahme der grundlegenden Erklärung im ersten Kapitel wird über das ganze Buch hinweg immer erst ein Test geschrieben bevor die Funktionalität implementiert wird. Als Werkzeug fürs Behavior-Driven Development (BDD) dienen <a href="http://cukes.info/">Cucumber</a> und <a href="http://rspec.info/">RSpec</a>.</p>
<p>Mir hat dieser Ansatz sehr gut gefallen. Da es bei Ruby keinen Compiler gibt der einem auf Fehler in der Syntax hinweist sind Tests unabdingbar – ausser man will wirklich bei jeder kleinen Änderung alles manuell durchtesten&#8230;</p>
<p>Neben Tests der Weboberfläche wurde auch gezeigt wie man den Versand von E-Mails oder Funktionsaufrufe in JavaScript kontrollieren kann. Diese komplexeren Tätigkeiten werden sonst meist ausgelassen. Hier hat man für einmal alles schön beisammen und auch verständlich erklärt.</p>
<p>Sehr gut fand ich auch dass nach jedem Teilschritt immer gleich ein commit ins <a href="http://git-scm.com/">Git</a>-Repository gemacht wurde. So gewöhnt man sich schnell an dieses Versionierungssystem und bekommt ein Gefühl dafür wie oft man committen sollte.</p>
<p>&nbsp;</p>
<h2>Lange Entstehungsgeschichte</h2>
<p>Das Buch wurde 2008 gestartet und hatte ursprünglich <a href="http://rubyonrails.org/merb">Merb</a> als Thema. <a href="http://yehudakatz.com/2008/12/23/rails-and-merb-merge/">Als Merb Ende 2008 in Rails aufging</a> wechselte auch der Fokus des Buches. Die lange und wechselhafte Geschichte bemerkt man als Leser stellenweise auch im fertigen Buch. </p>
<p>Als Beispiel: Die Funktion f.error_messages wird zum Anzeigen der Fehler in Formularen verwendet. Mit Rails 3 wurde diese Methode entfernt und ist nun nur noch über ein zusätzliches Plug-in nutzbar. Ich hätte es begrüsst wenn man statt dem Plug-in gleich die aktuelle Variante von Rails verwendet hätte.<br />
Gleiches gilt für die Syntax der Migration-Dateien. Was im Buch steht hat nicht viel mit dem Gemeinsam was einem Rails 3.1 generiert. Dies verwirrt den Leser nur unnötig.</p>
<p>&nbsp;</p>
<h2>Cucumber entfernt die Stützräder</h2>
<p>Anfangs Oktober 2011 <a href="http://aslakhellesoy.com/post/11055981222/the-training-wheels-came-off">entschied</a> man sich bei Cucumber-Rails die Hilfsfunktionen in web_stebs.rb zu entfernen. Die darin enthaltenden Schrittdefinitionen ermöglichen einem einen schnellen Einstieg in Cucumber, entsprechen aber nicht ganz dem Sinn von BDD. Da viele Tests aus diesem Buch darauf aufbauen hat man nun ein Problem wenn man versucht die Beispiele umzusetzen.</p>
<p>Im <a href="http://www.manning-sandbox.com/thread.jspa?threadID=46638&amp;tstart=0">Forum zum Buch</a> gibt es bereits einige Links zu <a href="http://agile-itspeople.blogspot.com/2011/10/when-cucumber-is-mightier-than-pen.html">Beispielen</a> die die nötigen Änderungen aufzeigen. Ich finde diese Tests lesbarer als was im Buch steht – von dem her kann ich die Begründung für die Änderung in Cucumber nachvollziehen. Wem ein Umbau zu viel Aufwand ist kann in seinem Gemfile die letzte Version von Cucumber-Rails mit web_stebs explizit angeben:</p>
<p><pre class="brush: ruby;">
gem 'cucumber-rails', '1.0.6'
</pre></p>
<p>&nbsp;</p>
<h2>Was mir fehlt</h2>
<p>Entwickelt man eine ganze Anwendung streng nach Test-First hat man am Ende genau den Code geschrieben der gemäss den Anforderungen nötig ist. Gibt es keine Anforderungen an die Oberfläche sieht diese am Ende sehr trist aus. Auch wenn das Thema Rails und nicht CSS ist, ich hätte es sehr begrüsst wenn man in einem Kapitel auf die Gestaltung der Oberfläche eingegangen wäre. Nur ein Link auf eine CSS-Datei ohne grosse Erklärung finde ich ein wenig mager.</p>
<p>Die letzten beiden Kapitel zu Engines und Rack-basierten Applikationen passten für mich nicht wirklich ins Buch. Statt diesen Spezialthemen wäre mir ein Kapitel über das Debuggen einer Rails-Anwendung oder eine Hilfestellung für die häufigsten Probleme lieber gewesen.</p>
<p>In die Probleme rennt man spätestens wenn man die Anwendung in der Produktionsumgebung startet. In Rails 3.1 wurde die Asset Pipeline eingeführt. Da diese nur in der Produktion aktiv ist bemerkt man beim Programmieren und testen nichts. Die Probleme treten erst auf wenn man auch gleich noch mit der Konfiguration des Webservers am kämpfen ist&#8230;</p>
<p>Ohne zusätzliche Unterlagen bleibt man so auf der Zielgerade liegen. Dies finde ich für ein Buch das von „Leadern“ der Rails-Community für Anfänger geschrieben wurde sehr schlecht. Ich verstehe das sich Rails sehr schnell entwickelt und man nicht alles zum vornherein beachten kann. Aber mindestens in die <a href="http://www.manning.com/katz/errata.html">Errata</a> müssten solche Sachen zügig aufgenommen werden, nicht erst nach einigen Wochen oder Monaten. Macht man auch dies nicht darf einem eine <a href="http://www.amazon.com/Rails-3-Action-Ryan-Bigg/product-reviews/1935182277/ref=dp_top_cm_cr_acr_txt?ie=UTF8&amp;showViewpoints=1">schlechte Bewertung</a> bei Amazon nicht erstaunen.</p>
<p>&nbsp;</p>
<h2>Fazit</h2>
<p>Rails 3 in Action liest sich flüssig und setzt kein grosses Vorwissen voraus. Der Ansatz alles mit Test-First zu machen finde ich gut, durch die Änderungen an Cucumber sollte man das Buch aber sehr bald überarbeiten.</p>
<p>Ich konnte mein Ziel erreichen und meine eigene Rails-Applikation mit dem hier gelernten umsetzten. Bis diese aber in einer Produktionsumgebung lief hatte ich viele Probleme zu lösen für die mir dieses Buch keine Antwort liefern konnte. </p>
<p>Viele kleine Fehler (und einige grosse Lücken) machen ein sehr gutes Buchkonzept schnell zunichte. Mir bleibt die Hoffnung auf eine Version 2 die dieser Probleme behebt. Bis dahin kann ich dieses Buch Anfängern leider nicht weiterempfehlen.</p>
<p>&nbsp;</p>
<h2>Zum Buch</h2>
<p>&#8222;<a href="http://www.manning.com/katz/">Rails 3 in Action</a>&#8220; von Ryan Bigg und Yehuda Katz, 2011 Manning, ISBN: 978-1-93518-227-6, 592 Seiten, Englisch</p>
<br />Einsortiert unter:<a href='http://graberj.wordpress.com/category/bucher/'>Bücher</a>, <a href='http://graberj.wordpress.com/category/ruby/'>Ruby</a> Tagged: <a href='http://graberj.wordpress.com/tag/bucher/'>Bücher</a>, <a href='http://graberj.wordpress.com/tag/ruby/'>Ruby</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/graberj.wordpress.com/1747/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/graberj.wordpress.com/1747/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/graberj.wordpress.com/1747/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/graberj.wordpress.com/1747/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/graberj.wordpress.com/1747/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/graberj.wordpress.com/1747/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/graberj.wordpress.com/1747/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/graberj.wordpress.com/1747/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/graberj.wordpress.com/1747/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/graberj.wordpress.com/1747/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/graberj.wordpress.com/1747/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/graberj.wordpress.com/1747/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/graberj.wordpress.com/1747/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/graberj.wordpress.com/1747/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1747&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://graberj.wordpress.com/2011/12/25/buch-rezension-rails-3-in-action/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fd2bd6ebacb744ce20c57a9e4cbb252d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">graberj</media:title>
		</media:content>

		<media:content url="http://graberj.files.wordpress.com/2011/12/rails3inaction.jpg" medium="image">
			<media:title type="html">Rails 3 in Action</media:title>
		</media:content>
	</item>
		<item>
		<title>Github Gist: Code-Schnipsel einfach veröffentlichen</title>
		<link>http://graberj.wordpress.com/2011/11/29/github-gist-code-schnipsel-einfach-veroffentlichen/</link>
		<comments>http://graberj.wordpress.com/2011/11/29/github-gist-code-schnipsel-einfach-veroffentlichen/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 07:19:36 +0000</pubDate>
		<dc:creator>Johnny Graber</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Beschleuniger]]></category>

		<guid isPermaLink="false">http://graberj.wordpress.com/?p=1745</guid>
		<description><![CDATA[Mir fehlte es für lange Zeit an einer guten und einfachen Möglichkeit um Code-Schnipsel öffentlich zu machen. Für ganze Projekte finde ich die Kombination von Mercurial und Bitbucket sehr gut. Aber um eine einzelne Datei oder gar nur eine Methode publizieren zu können ist diese Lösung zu aufwändig. Vor kurzem bin ich beim durchstöbern von [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1745&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Mir fehlte es für lange Zeit an einer guten und einfachen Möglichkeit um Code-Schnipsel öffentlich zu machen. Für ganze Projekte finde ich die Kombination von <a href="http://mercurial.selenic.com/">Mercurial</a> und <a href="https://bitbucket.org/">Bitbucket</a> sehr gut. Aber um eine einzelne Datei oder gar nur eine Methode publizieren zu können ist diese Lösung zu aufwändig.</p>
<p>Vor kurzem bin ich beim durchstöbern von <a href="https://github.com/">Github</a> auf <a href="https://gist.github.com/">Gist</a> gestossen. Über eine sehr einfache Weboberfläche kann man die Schnipsel mit einem Namen versehen und veröffentlichen. Wenn man will kann man noch die Sprache wählen, womit dann auch die <a href="https://gist.github.com/1364259">Syntaxhervorhebung</a> stimmt. </p>
<p><a href="http://graberj.files.wordpress.com/2011/11/gist.png"><img src="http://graberj.files.wordpress.com/2011/11/gist.png?w=300&#038;h=225" alt="" title="Gist" width="300" height="225" class="aligncenter size-medium wp-image-1750" /></a></p>
<p>Um Gist zu nutzen braucht man nur <a href="https://github.com/signup/free">einen Account bei Github</a>. Man muss weder <a href="http://git-scm.com/documentation">Git</a> installiert haben noch gross darüber Bescheid wissen. Wenn man später einmal ein „richtiges“ Projekt daraus machen möchte steht dem nichts im Weg: Ein Gist ist ein vollwertiges Git-Repository und verfügt damit von Anfang an über eine Historisierung.</p>
<p>Ich finde Gist eine sehr gute Idee und bin gespannt was sich dadurch alles für Möglichkeiten eröffnen.</p>
<br />Einsortiert unter:<a href='http://graberj.wordpress.com/category/net/'>.Net</a>, <a href='http://graberj.wordpress.com/category/programmieren/'>Programmieren</a> Tagged: <a href='http://graberj.wordpress.com/tag/net/'>.Net</a>, <a href='http://graberj.wordpress.com/tag/beschleuniger/'>Beschleuniger</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/graberj.wordpress.com/1745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/graberj.wordpress.com/1745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/graberj.wordpress.com/1745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/graberj.wordpress.com/1745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/graberj.wordpress.com/1745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/graberj.wordpress.com/1745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/graberj.wordpress.com/1745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/graberj.wordpress.com/1745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/graberj.wordpress.com/1745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/graberj.wordpress.com/1745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/graberj.wordpress.com/1745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/graberj.wordpress.com/1745/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/graberj.wordpress.com/1745/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/graberj.wordpress.com/1745/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1745&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://graberj.wordpress.com/2011/11/29/github-gist-code-schnipsel-einfach-veroffentlichen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fd2bd6ebacb744ce20c57a9e4cbb252d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">graberj</media:title>
		</media:content>

		<media:content url="http://graberj.files.wordpress.com/2011/11/gist.png?w=300" medium="image">
			<media:title type="html">Gist</media:title>
		</media:content>
	</item>
		<item>
		<title>SWT: GUI bei langen Aktionen nicht einfrieren lassen</title>
		<link>http://graberj.wordpress.com/2011/11/26/swt-gui-bei-langen-aktionen-nicht-einfrieren-lassen/</link>
		<comments>http://graberj.wordpress.com/2011/11/26/swt-gui-bei-langen-aktionen-nicht-einfrieren-lassen/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 15:33:09 +0000</pubDate>
		<dc:creator>Johnny Graber</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Beschleuniger]]></category>

		<guid isPermaLink="false">http://graberj.wordpress.com/?p=1718</guid>
		<description><![CDATA[Damit eine SWT-Anwendung bei langen Aktionen nicht einfriert braucht es einige Arbeiten die nicht gerade offensichtlich sind. Dies ist mein Ansatz um Java-Anwendungen reaktionsfreudiger zu machen.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1718&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Länger dauernde Aktionen sollten nie im GUI-Thread laufen. Dies gilt auch für <a href="http://eclipse.org/swt/">SWT</a>, der GUI-Bibliothek von IBM/Eclipse für Java. Allerdings gibt es bei SWT einige Punkte zu beachten, ohne die ein Umbau schnell sehr mühsam werden kann.</p>
<p>&nbsp;</p>
<h2> Ausgangslage</h2>
<p>Bei den meisten Erklärungen zu SWT wird im <a href="http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fevents%2FSelectionListener.html">SelectionListener</a> eines Knopfes alle Logik eingebaut, die beim Klick darauf ausgeführt werden soll. So lange die daraus resultierenden Aktionen schnell verarbeitet werden können ist dagegen auch nichts einzuwenden. </p>
<p>Dauert es aber länger friert einem sehr schnell das GUI ein. Je nach PC variieren die Auswirkungen von einem flackern der Anzeige bis zu kompletten Blockieren der Anwendung. Der Code wird in so einem Fall wohl meist so aussehen:</p>
<p><pre class="brush: java;">
workButtonSlow.addSelectionListener(new SelectionAdapter() {
	public void widgetSelected(SelectionEvent arg0) {
		progress.setSelection(0);
		workButtonSlow.setEnabled(false);
		
		// simuliert lange dauernde Aktion
		for (int i = 0; i &lt; 100; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				System.out.println(e.getMessage());
			}
			progress.setSelection(progress.getSelection() + 1);
		}

		workButtonSlow.setText(&quot;Thread beendet&quot;);
		workButtonSlow.setEnabled(true);
	}
});
</pre></p>
<p>&nbsp;</p>
<h2> Lösung: Threads und asyncExec</h2>
<p>Nach einigen Anläufen bin ich bei Threads und einer Synchronisierung des GUI über <code>asyncExec</code> gelandet. Die lange dauernden Aktionen werden in einen eigenen Thread ausgelagert und im SelectionListener nur noch gestartet. Die Verarbeitung erfolgt so losgelöst vom GUI-Thread und behindert das Neuzeichnen der Oberfläche nicht – dies genügt damit die Anwendung viel reaktiver erscheint.</p>
<p>Da man nun während der Ausführung der Aktion weiterarbeiten kann, steht man unter Umständen vor neuen Problemen. Falls die gleiche Aktion nicht noch einmal parallel dazu gestartet werden darf, muss man dies nun explizit verhindern. Je nach Anwendung genügt es den entsprechenden Knopf beim Start des Arbeitsthreads zu deaktivieren und erst beim beenden wieder zu aktivieren.</p>
<p>Eine Implementierung mit einer eigenen Thread-Klasse kann so aussehen:<br />
<pre class="brush: java;">
class LongRunningOperation extends Thread {
		private Display display;
		private ProgressBar progressBar;
		private Button workButton;

		/**
		 * Alles übergeben was aus diesem Thread erreichbar sein soll
		 */
		public LongRunningOperation(Display display, ProgressBar progressBar,
				Button workButton) {
			this.display = display;
			this.progressBar = progressBar;
			this.workButton = workButton;
		}

		/**
		 * Länger laufende Methode um eine Verarbeitung zu simulieren
		 */
		public void run() {
			for (int i = 0; i &lt; 100; i++) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					System.out.println(e.getMessage());
				}
				progressBar.setSelection(progressBar.getSelection() + 1);
				// ProgressBar kann nur via asyncExec aktualisiert werden!
				display.asyncExec(new Runnable() {
					public void run() {
						if (progressBar.isDisposed())
							return;

						progressBar.setSelection(progressBar.getSelection() + 1);
					}
				});
			}

			// Gleiches gilt für alle GUI-Elemente
			display.asyncExec(new Runnable() {
				public void run() {
					if (workButton.isDisposed())
						return;
					workButton.setText(&quot;Thread beendet&quot;);
					workButton.setEnabled(true);
				}
			});
		}
	}
</pre></p>
<p>Der Knopf über den die zeitintensive Aktion gestartet wird ist wie alle anderen GUI-Elemente in SWT aber nicht direkt aus einem anderen Thread heraus veränderbar. Damit der Ausführungskontext stimmt müssen alle Veränderungen dieser Elemente als Runnable der Methode <code>asyncExec</code> übergeben werden. Wichtig ist das man das Display-Objekt nutzt mit dem man die Shell der Anwendung initialisiert hat. </p>
<p>Versucht man asyncExec zu umgehen wird SWT mit dieser Exception antworten:</p>
<blockquote><p>Exception in thread &#8222;Thread-0&#8243; org.eclipse.swt.SWTException: Invalid thread access</p></blockquote>
<p>Sind alle Zugriffe entsprechend umgeformt, kann man im SelectionListener des Knopfes die Thread-Klasse starten:</p>
<p><pre class="brush: java;">
		workButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				progress.setSelection(0);
				workButton.setEnabled(false);
				new LongRunningOperation(s_display, progress, workButton)
						.start();
				workButton.setText(&quot;SelectionListener beendet!&quot;);
			}
		});
</pre></p>
<p>&nbsp;</p>
<h2> Fazit</h2>
<p>Mit dieser Umbauarbeit kann man auch lange laufende Aktionen ausführen ohne dass einem das GUI einfriert oder an Reaktionsfähigkeit einbüsst. Dieser Ansatz ist ein wenig aufwändig, erfüllt aber seinen Zweck. (Das ganze Beispiel ist auf <a href="https://gist.github.com/1364259">Github</a> verfügbar)</p>
<p>Falls es einfachere Wege gibt würde ich mich über einen Kommentar freuen.</p>
<br />Einsortiert unter:<a href='http://graberj.wordpress.com/category/eclipse/'>Eclipse</a>, <a href='http://graberj.wordpress.com/category/java/'>Java</a> Tagged: <a href='http://graberj.wordpress.com/tag/beschleuniger/'>Beschleuniger</a>, <a href='http://graberj.wordpress.com/tag/java/'>Java</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/graberj.wordpress.com/1718/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/graberj.wordpress.com/1718/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/graberj.wordpress.com/1718/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/graberj.wordpress.com/1718/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/graberj.wordpress.com/1718/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/graberj.wordpress.com/1718/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/graberj.wordpress.com/1718/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/graberj.wordpress.com/1718/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/graberj.wordpress.com/1718/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/graberj.wordpress.com/1718/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/graberj.wordpress.com/1718/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/graberj.wordpress.com/1718/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/graberj.wordpress.com/1718/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/graberj.wordpress.com/1718/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=graberj.wordpress.com&amp;blog=9035432&amp;post=1718&amp;subd=graberj&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://graberj.wordpress.com/2011/11/26/swt-gui-bei-langen-aktionen-nicht-einfrieren-lassen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fd2bd6ebacb744ce20c57a9e4cbb252d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">graberj</media:title>
		</media:content>
	</item>
	</channel>
</rss>
