<?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>build broken &#187; Clean Code Developing</title>
	<atom:link href="http://blog.aztec-project.org/category/clean-code-developing/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aztec-project.org</link>
	<description>but we can fix it! Sometimes :)</description>
	<lastBuildDate>Fri, 11 Jun 2010 12:52:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>(Spreu + Weizen).Select(Programmierer)</title>
		<link>http://blog.aztec-project.org/2010/03/14/spreu-weizen-selectprogrammierer/</link>
		<comments>http://blog.aztec-project.org/2010/03/14/spreu-weizen-selectprogrammierer/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 10:41:36 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Clean Code]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=935</guid>
		<description><![CDATA[Obwohl wir Jeff Atwood schon vor Monaten von unseren Bloggerliste gestrichen haben, ich habe ihn noch nicht aus meinem Googlereader entfernt. Er ist ein Typ, der liebt viel Wirbel zu verursachen (Scott Hanselmann nennt ihn aus den Wörtern friend und enemy &#8220;my friendemy&#8221; ) aber manchmal trifft er den Nagel auf den Kopf. So auch [...]]]></description>
			<content:encoded><![CDATA[<p>Obwohl wir <a href="http://www.codinghorror.com/blog/" target="_blank">Jeff Atwood</a> schon vor Monaten von unseren Bloggerliste gestrichen haben, ich habe ihn noch nicht aus meinem Googlereader entfernt. Er ist ein Typ, der liebt viel Wirbel zu verursachen (<a href="http://www.hanselman.com/blog/" target="_blank">Scott Hanselmann</a> nennt ihn aus den Wörtern <em>friend</em> und <em>enemy</em> &#8220;my friendemy&#8221; <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) aber manchmal trifft er den Nagel auf den Kopf. So auch in seinem letzten Artikel <a href="http://www.codinghorror.com/blog/2010/02/the-nonprogramming-programmer.html" target="_blank">&#8220;The Non-Programming Programmer&#8221;</a>.</p>
<blockquote><p>&#8230;<br />
I wrote that article in 2007, and I am stunned, but not entirely surprised, to hear that three years later &#8220;the vast majority&#8221; of so-called programmers who apply for a programming job interview are unable to write the smallest of programs. To be clear, hard is a relative term &#8212; we&#8217;re not talking about complicated, Google-style graduate computer science interview problems. This is extremely simple stuff we&#8217;re asking candidates to do. And they can&#8217;t. <strong>It&#8217;s the equivalent of attempting to hire a truck driver and finding out that 90 percent of the job applicants can&#8217;t find the gas pedal or the gear shift.</strong></p></blockquote>
<p>Aus den Unmengen von Kommentaren zu urteilen, ist das ein Problem, mit dem sehr viele zu kämpfen haben. Sein Artikel beschäftigt sich mit der Arbeit von Personen, die Einstellungsgespräche führen, und er versucht ein paar Tipps zu geben, wie man dieses Verfahren führen soll.</p>
<p>Ich musste allerdings beim Lesen ständig auf die Situation &#8220;danach&#8221; denken, wenn diese NPPs (sprich Non- Programming Programmers) bereits aus irgendeinem Grund eingestellt wurden. Aus Erfahrung weiß ich genau, was mir viel über jemanden verraten würde: weiß er/sie etwas über Clean Code, kennt er die Folgen vom Creepy Code und wie ist die persönliche Einstellung dazu? Also zusammengefasst: geht es um einen <strong>professionellen Softwareentwickler</strong>? Dafür würden auch ein Code-Review oder ein paar Fragen reichen.</p>
<p>Was haltet ihr von Coding bei der Einstellung? Ist das auch in Europa üblich? Würde das die unpassenden Personen ausfiltern? Oder soll man sich die Zeit nehmen und dem Kandidaten &#8220;ungesehen&#8221; die Probezeit anbieten? Würde das vielleicht zu viele Personen ausfiltern? Kann man sich das überhaupt erlauben in der heutigen Zeit der Fachkräftemangel? (Gut, man fragt sich natürlich, ob wir hier über &#8220;Fachkraft&#8221; sprechen dürfen&#8230;)</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f03%2f14%2fspreu-weizen-selectprogrammierer%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f03%2f14%2fspreu-weizen-selectprogrammierer%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/03/14/spreu-weizen-selectprogrammierer/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Softwarezellen &#8211; eine Lösung um die Komplexität zu beherrschen</title>
		<link>http://blog.aztec-project.org/2010/01/27/softwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen/</link>
		<comments>http://blog.aztec-project.org/2010/01/27/softwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 10:01:52 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Clean Code Developing]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=866</guid>
		<description><![CDATA[Wir haben wie viele von uns in der Webentwicklung vor vielen Jahren mit Scriptsprachen und mit prozeduralen &#8211; Spaghetti-Code &#8211; angefangen. Mit der Zeit wuchs unsere Webpräsenz zu einer unüberschaubaren Anwendung mit manchen Seiten, die keiner von uns mehr anfassen wollte &#8211; aus Angst vor den Konsequenzen. Um etwas Ordnung in die Webanwendungen zu bringen, [...]]]></description>
			<content:encoded><![CDATA[<p>Wir haben wie viele von uns in der Webentwicklung vor vielen Jahren mit Scriptsprachen und mit prozeduralen &#8211; Spaghetti-Code <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  &#8211; angefangen. Mit der Zeit wuchs unsere Webpräsenz zu einer unüberschaubaren Anwendung mit manchen Seiten, die keiner von uns mehr anfassen wollte &#8211; aus Angst vor den Konsequenzen.</p>
<p>Um etwas Ordnung in die Webanwendungen zu bringen, haben wir also vor 4 Jahren angefangen, nach einem 3-Schichten-Modell zu entwickeln. Wir haben neue Funktionalitäten und neue Anwendungen nur noch so gebaut und wir waren für eine kurze Zeit zufrieden. Alles lief gut. Als wir den Umstieg auf .NET begonnen haben, haben wir weiterhin nach einem Mehr-Schichten-Modell gearbeitet, wir haben nur die Anzahl der Schichten erhöht.</p>
<p>Die Anwendungen wuchsen weiter, wir haben immer mehr Bereiche ausgelagert und diese hauptsächlich mit Webservices angesprochen. Währenddessen waren wir daran, unser Hauptprodukt, ein Portal für unseren Kunden mit der neuen Technologie entsprechend der alten Anforderung neu zu bauen. Und dann ist es passiert: ehe wir uns versahen, hatten wir ein riesiges Projekt, das alle mögliche Anwendungen eingebunden bzw. durch Webservices angesprochen hat. Die Grenzen waren fließend, eventuelle Änderungen an anderen Anwendungen konnten das Projekt unbuildbar machen, also ein ähnlicher Zustand wie vor paar Jahren zuvor.</p>
<p>Die Weiterentwicklung hat nicht nur in unserer Art zu Programmieren stattgefunden, wir selbst haben uns auch weiterentwickelt, wir haben die Community kennen gelernt. Bei den Open Space-Veranstaltungen haben wir <a href="http://lieser-online.de/" target="_blank">Stefan</a> und <a href="http://ralfw.de/default.html" target="_blank">Ralf</a> kennengelernt und durch sie eine andere Sichtweise der Dinge: die <a href="http://weblogs.asp.net/ralfw/archive/tags/Software+Cells/default.aspx" target="_blank">Modellierung einer Lösung durch Softwarezellen</a>.</p>
<p>Wir haben sie zu uns eingeladen und uns die Idee erklären lassen. Das Stichwort heißt <a href="http://de.wikipedia.org/wiki/Holon" target="_blank">Holon</a>. Wikipedia definiert ein Holon folgendermaßen:</p>
<blockquote><p>Der Begriff Holon (von griech. ὅλος, hólos und ὀν, on „ganzes Seiendes“) wurde von Arthur Koestler geprägt und bedeutet ein Ganzes, das Teil eines anderen Ganzen ist. Es wird auch als &#8220;Ganzes/Teil&#8221; umschrieben.</p></blockquote>
<p>Jede Anwendung ist ein Ganzes, die aus Teilen besteht, die ihrerseits auch als Ganze zu betrachten sind.</p>
<p>Seit dem Besuch von Ralf und Stefan haben wir uns die Artikelserie von Ralf von <a href="http://dotnetpro.de/" target="_blank">dotnetpro</a> durchgelesen, die Webcasts (<a href="https://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032298692" target="_blank">Teil 1</a>, <a href="https://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032298700" target="_blank">Teil 2</a>) angeschaut und wir haben angefangen, diese Modellierung auszuprobieren. </p>
<p>Wir haben noch einen langen und interessanten Weg vor uns, aber eins ist jetzt schon sicher: wir werden versuchen unsere nächste Projekte durch Softzellen modellieren.</p>
<p>Solange die Komplexität nicht wieder die Überhand gewinnt <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f27%2fsoftwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen%2f" target="_blank"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f27%2fsoftwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen%2f" alt="kick it on dotnet-kicks.de" border="0"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/01/27/softwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Refaktorisierung &#8211; mal anders erklärt</title>
		<link>http://blog.aztec-project.org/2010/01/18/refaktorizierung-mal-anders-erklaert/</link>
		<comments>http://blog.aztec-project.org/2010/01/18/refaktorizierung-mal-anders-erklaert/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 21:09:06 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Buchempfehlung]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Refaktorisierung]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=844</guid>
		<description><![CDATA[Ich lese gerade das Buch Agile Principles, Patterns and Practices in C# from Robert C. Martin und Micah Martin. Dabei bin ich auf eine so tolle Metapher gestoßen, dass ich sie hier unbedingt niederschreiben wollte (die Übersetzung ist frei von mir): Refaktorisierung ist, wie die Küche nach dem Abendessen aufzuräumen. Das erste Mal, wenn du [...]]]></description>
			<content:encoded><![CDATA[<p>Ich lese gerade das Buch <a href="http://www.amazon.de/Agile-Principles-Patterns-Practices-C/dp/0131857258" target="_blank">Agile Principles, Patterns and Practices in C#</a> from Robert C. Martin und Micah Martin. Dabei bin ich auf eine so tolle Metapher gestoßen, dass ich sie hier unbedingt niederschreiben wollte (die Übersetzung ist frei von mir):</p>
<blockquote><p>Refaktorisierung ist, wie die Küche nach dem Abendessen aufzuräumen. Das erste Mal, wenn du das überspringst, bist mit der Kochen schneller fertig. Aber das Fehlen von sauberem Geschirr und sauberem Arbeitsplatz führt dazu, dass die Vorbereitung diesmal länger dauert. Am liebsten würdest du das Aufräumen wieder überspringen. Tatsache ist, dass du <b>heute</b> ohne das lästige Geschirrspülen wieder schneller fertig wärst. Aber der Schmutz wächst und wächst. Jedes Mal dauert es länger, das richtige Küchengerät zu finden, die vertrockneten Schmutzschichten vom Geschirr ab zu kratzen, und so weiter und so fort. Das Vorbereiten des Abendessens dauert ewig&#8230;<br />
Das Überspringen der Abwasch macht das Kochen eigentlich nicht wirklich schneller.</p>
<p>Das Ziel von Refaktorisierung ist die Bereinigung des Codes, jeden Tag, jede Stunde, jede Minute. Wir wollen nicht den Code versauen. Wir wollen nicht ständig gezwungen zu sein, schmutzigen Bits und Bytes sauber zu schrubben. Wir wollen jeder Zeit in der Lage zu sein, unser System mühelos zu erweitern und zu verändern. Der wichtigste Faktor, der uns das möglich macht, ist die Sauberkeit des Codes. </p></blockquote>
<p>Das Buch habe zwar noch nicht ganz durch, aber was ich bis jetzt gelesen habe, kann ich nur unterschreiben. Es beinhaltet die Prinzipien, wie man in einem agilen Team sauberen Code plant und Mustern und Beispiele, wie man ihn schreibt. Und wie ihr ja sieht, ist es in eine ganz tolle Art geschrieben <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f18%2frefaktorizierung-mal-anders-erklaert%2f" target="_blank"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f18%2frefaktorizierung-mal-anders-erklaert%2f" alt="kick it on dotnet-kicks.de" border="0"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/01/18/refaktorizierung-mal-anders-erklaert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design by Contract &#8211; jetzt auch mit C# &#8211; Teil 2</title>
		<link>http://blog.aztec-project.org/2009/11/05/design-by-contract-teil-2/</link>
		<comments>http://blog.aztec-project.org/2009/11/05/design-by-contract-teil-2/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 07:51:51 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Unit-Tests]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=801</guid>
		<description><![CDATA[Der vorherige DbC-Artikel ist ziemlich &#8220;abstrakt&#8221; ausgefallen, es haben einfach Beispiele gefehlt. Das möchte ich hiermit nachholen. Erstens muss man die IDE anpassen: im März kommt .NET 4.0 raus und da wird Design by Contract mitgeliefert. Man kann das Konzept aber jetzt schon anwenden, wenn man die Assembly zusätzlich installiert. Danach muss man die dll [...]]]></description>
			<content:encoded><![CDATA[<p>Der vorherige DbC-Artikel ist ziemlich &#8220;abstrakt&#8221; ausgefallen, es haben einfach Beispiele gefehlt. Das möchte ich hiermit nachholen.</p>
<p>Erstens muss man die IDE anpassen: im März kommt .NET 4.0 raus und da wird Design by Contract  mitgeliefert. Man kann das Konzept aber jetzt schon anwenden, wenn man die <a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx" target="_blank">Assembly</a> zusätzlich installiert. Danach muss man die dll referenzieren und im Eigenschaftenfenster des Projektes im neuen Tab <i>Code Contracts</i> das Runtime Checking einstellen.</p>
<p>Jetzt zum Code: Nehmen wir eine ganz einfache Klasse <code>Bill</code> deren Objekte mit einem <code>IRepository</code> gespeichert bzw. geladen werden.</p>
<div style="font-family: Courier New; font-size: 9pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;<span style="color: blue;">using</span> System.Diagnostics.Contracts;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;<span style="color: blue;">namespace</span> ContractsPrototyp</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;{</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">Bill</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">int</span> Id { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">string</span> Number { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">double</span> Value { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;10</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;11</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;12</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">interface</span> <span style="color: #2b91af;">IRepository</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;13</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;14</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Bill</span> GetBill(<span style="color: blue;">string</span> number);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;15</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> SaveBill(<span style="color: #2b91af;">Bill</span> bill);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;16</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</div>
<p>Die Kontrakte kann man in den einzelnen Methoden oder für eine ganze Klasse schreiben (unter dem Attribut <code>ContractInvariantMethode</code>) aber ich finde am schönsten, dass man die auch auslagern kann: durch eine gegenseitige Markierung können Kontrakt-Klassen und Interfaces als &#8220;Paare&#8221; definiert werden:</p>
<div style="font-family: Courier New; font-size: 9pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;11</span>&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: #2b91af;">ContractClass</span>(<span style="color: blue;">typeof</span>(<span style="color: #2b91af;">RepositoryContracts</span>))]</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;12</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">interface</span> <span style="color: #2b91af;">IRepository</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;13</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;14</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Bill</span> GetBill(<span style="color: blue;">string</span> number);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;15</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> SaveBill(<span style="color: #2b91af;">Bill</span> bill);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;16</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;17</span>&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: #2b91af;">ContractClassFor</span>(<span style="color: blue;">typeof</span>(<span style="color: #2b91af;">IRepository</span>))]</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;18</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">RepositoryContracts</span>:<span style="color: #2b91af;">IRepository</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;19</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;20</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">Bill</span> GetBill(<span style="color: blue;">string</span> number)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;21</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;22</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Contract</span>.Requires(!<span style="color: blue;">string</span>.IsNullOrEmpty(number));</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;23</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> <span style="color: blue;">null</span>;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;24</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;25</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;26</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">void</span> SaveBill(<span style="color: #2b91af;">Bill</span> bill)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;27</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Contract</span>.Ensures(bill.Id &gt; 0);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</div>
<p>Eine Vorbedingung wird mit <code>Contract.Requires</code> und eine Nachbedingung mit <code>Contract.Ensures</code> definiert. Beide Methoden bekommen boolische Ausdrücke. Diese Ausdrücke müssen frei von Seiteneffekten sein. </p>
<p>Die eigentliche Implementierung der Klasse schaut dann so aus:</p>
<div style="font-family: Courier New; font-size: 9pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;31</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">Repository</span>:<span style="color: #2b91af;">IRepository</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;33</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">Bill</span> GetBill(<span style="color: blue;">string</span> nummer)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;35</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">//W&#252;rde das Objekt aus Datenhaltung laden</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">Bill</span>();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;37</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;38</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;39</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">void</span> SaveBill(<span style="color: #2b91af;">Bill</span> bill)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;40</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">//W&#252;rde das Objekt speichern und ihm eine Id zuweisen</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;42</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (BillIsValid( bill )) bill.Id++;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;43</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;44</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;45</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> BillIsValid(<span style="color: #2b91af;">Bill</span> bill)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;46</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;47</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> !<span style="color: blue;">string</span>.IsNullOrEmpty(bill.Nummer);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;49</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</div>
<p>Woher können wir wissen, dass das funktioniert? Es ist einfach, wir schreiben ein Paar Tests dazu!<br />
Bei Kontraktverletzung wird eine Exception geworfen. Um diese &#8211; und dadurch die genaue Verletzung &#8211; überprüfen zu können braucht man etwas Workaround:</p>
<div style="font-family: Courier New; font-size: 9pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;55</span>&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: #2b91af;">TestFixture</span>]</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;56</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">BillTests</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;57</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;58</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: #2b91af;">IRepository</span> m_repository;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">string</span> m_message;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;60</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [<span style="color: #2b91af;">SetUp</span>]</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">void</span> Setup()</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;63</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;64</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_repository = <span style="color: blue;">new</span> <span style="color: #2b91af;">Repository</span>();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;65</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_message = <span style="color: blue;">string</span>.Empty;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;66</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Contract</span>.ContractFailed += ( sender, e ) =&gt;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;67</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.SetUnwind();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_message = e.Message;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
</div>
<p>Danach sind die Tests dann einfach:</p>
<div style="font-family: Courier New; font-size: 9pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [<span style="color: #2b91af;">Test</span>]</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">void</span> Laden_mit_leerer_Nummer_verletzt_Kontrakt()</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;76</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">try</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;78</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_repository.GetBill( <span style="color: blue;">null</span> );</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">catch</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;83</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">//Nichts </span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;84</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;85</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;86</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Assert</span>.That( m_message, <span style="color: #2b91af;">Is</span>.EqualTo( <span style="color: #a31515;">&quot;Precondition failed: !string.IsNullOrEmpty(number)&quot;</span> ) );</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;87</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;88</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [<span style="color: #2b91af;">Test</span>]</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">void</span> Speichern_Rechnung_ohne_Nummer_verletzt_Kontrakt()</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;92</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;93</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">try</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_repository.SaveBill( <span style="color: blue;">new</span> <span style="color: #2b91af;">Bill</span>{Value = 25} );</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">catch</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;98</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;99</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">//Nichts </span></p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;100</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;101</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;102</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Assert</span>.That( m_message, <span style="color: #2b91af;">Is</span>.EqualTo( <span style="color: #a31515;">&quot;Postcondition failed: bill.Id &gt; 0&quot;</span> ) );</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;103</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
</div>
<p>Ich hoffe, das Beispiel ist ausführlich genug, um die Vorteile von DbC zu highlighten. <a href="http://www.lieser-online.de/blog/" target="_blank">Stefan</a>, vielen dank noch mal für den Artikel, ich habe mich natürlich von dir inspirieren lassen.</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f11%2f05%2fdesign-by-contract-teil-2%2f" target="_blank"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f11%2f05%2fdesign-by-contract-teil-2%2f" alt="kick it on dotnet-kicks.de" border="0"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/11/05/design-by-contract-teil-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Clean Code Teil 2</title>
		<link>http://blog.aztec-project.org/2009/11/04/clean-code-teil-2/</link>
		<comments>http://blog.aztec-project.org/2009/11/04/clean-code-teil-2/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 14:16:02 +0000</pubDate>
		<dc:creator>Andreas Seebauer</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Buch]]></category>
		<category><![CDATA[CCD]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=762</guid>
		<description><![CDATA[Endlich ist es geschafft. Ich habe das Buch &#8220;Clean Code&#8221; von Robert C. Martin a.k.a. Uncle Bob durchgelesen. Nach dem ersten Teil hier nun die versprochene Fortsetzung meiner Zusammenfassung: 10 Classes Die erste Regel von Klassen lautet: Sie sollten klein sein. Die zweite Regel von Klassen lautet: Sie sollten noch kleiner sein als das. Klassen [...]]]></description>
			<content:encoded><![CDATA[<p>Endlich ist es geschafft. Ich habe das Buch &#8220;Clean Code&#8221; von Robert C. Martin a.k.a. Uncle Bob durchgelesen. Nach dem <a href="http://blog.aztec-project.org/2009/08/11/clean-code-teil-1/" target="_blank">ersten Teil</a> hier nun die versprochene Fortsetzung meiner Zusammenfassung:</p>
<p><strong>10 Classes</strong></p>
<p>Die erste Regel von Klassen lautet: Sie sollten klein sein.<br />
Die zweite Regel von Klassen lautet: Sie sollten noch kleiner sein als das.</p>
<p>Klassen sollten eine hohe Kohäsion haben.<br />
Kohäsion ist ein Maß dafür, wie stark die Methoden und Daten einer Klasse miteinander zu tun haben. Zur Verdeutlichung:<br />
Eine Klasse, in der jede Membervariable von jeder Methode der Klasse verwendet wird, ist maximal kohäsiv.</p>
<p>Bei Klassen sollten folgende Prinzipien beachtet werden:</p>
<ul>
<li>Das <strong>Single Responsibility Principle</strong> (<strong>SRP</strong>), welches besagt:</li>
<p>Eine Klasse oder ein Modul sollte nur einen Grund haben sich zu ändern. Eine Klasse sollte sich nur um <strong>EINE</strong> Sache kümmern.</p>
<li>Das <strong>Open Close Principle</strong> (<strong>OCP</strong>), welches besagt:</li>
<p>Klassen sollten offen für Erweiterungen sein, aber geschlossen für Modifikation.</p>
<li>Das <strong>Dependency Inversion Priniciple</strong> (<strong>DIP</strong>), welches besagt:</li>
<p>Klassen sollten von Abstraktionen abhängen und nicht von konkreten Klassen.</ul>
<p><strong>11 Systems</strong></p>
<p>Separiere Konstruktion von Benutzung.<br />
Realisiert werden kann das durch Dependency Injection.</p>
<p>Dependency Injection = Klassen bekommen ihre Abhängigkeiten von außen über den Konstruktor oder Setter übergeben. Dieses Pattern unterstützt das SRP, da sich die Klasse nicht mehr um das Instanzieren dieser Abhängigkeiten kümmern muss. Realisiert wird das ganze über Inversion of Control Container wie Windsor, Spring und wie sie alle heißen. Bei diesen Containern werden die Abhängigkeiten einmalig definiert, so dass man sich bei der Instanzierung nicht mehr darum kümmern muss.</p>
<p>Wenn Objekte zu einer bestimmten Zeit erstellt werden müssen, sollten Factories verwendet werden.</p>
<p>Systeme werden nicht von heute auf morgen gebaut. Sie werden nach und nach ausgebaut. Um sicherzustellen, dass dabei noch alles funktioniert, gibt es TDD, Refaktorisieren und Separation of Concerns.</p>
<p><strong>12 Emergence</strong></p>
<p>Viele Leute sagen, dass Kent Beck’s 4 &#8220;Rules of Simple Design&#8221; einem sehr helfen, gut designte Software zu erstellen.</p>
<p>Kent Beck sagt:<br />
ein Design ist „simple“, wenn:</p>
<ul>
<li> alle Tests durchlaufen</li>
<li> kein doppelter Code vorhanden ist</li>
<li> wenn es die Absicht des Programmierers ausdrückt</li>
<li> die Anzahl von Klassen und Methoden minimiert sind</li>
</ul>
<p>in der Reihenfolge.</p>
<p><strong>13 Concurrency</strong></p>
<p>In Multithread-Anwendungen bekommt man schon bei minimaler Anforderung ein Problem mit der Komplexität. Da mit steigender Komplexität auch die Fehleranfälligkeit steigt, gibt es ein paar Prinzipien, die diese minimieren können:</p>
<p>Die Concurrency Defense Principles</p>
<ul>
<li><strong>Single Responsibility Principle</strong></li>
<p>Trenne multithreaded Code von nicht-multithreaded Code</p>
<li><strong>Limit the Scope of Data</strong></li>
<p>Man sollte den Bereich, in dem multithreaded Code verwendet wird, möglichst klein halten.</p>
<li><strong>Use Copies of Data</strong></li>
<p>Verschiedene Threads sollten nicht mit demselben Objekt arbeiten. Wenn möglich sollte mit Kopien von diesem Objekt gearbeitet werden.</p>
<li><strong>Independence</strong></li>
<p>Threads sollten so unabhängig wie möglich sein</p>
<li><strong>Library</strong></li>
<p>Natürlich sollte man die Bibliothek, die man für Multithread-Anwendungen verwendet, sehr gut kennen.</ul>
<p><strong>14 Successive Refinement</strong></p>
<p>Um Clean Code schreiben zu können, muss man erst Dirty Code schreiben und ihn dann bereinigen.</p>
<p>Einer der besten Wege, ein Programm zu ruinieren, ist, massive Änderungen an der Struktur vorzunehmen, um das Programm zu verbessern. Um das zu verhindern, nutzt man die Disziplinen von TDD. Eines der zentralen Doktrinen dieses Ansatzes ist es, das System zu jeder Zeit lauffähig zu halten. Mit TDD ist es also nicht erlaubt eine Veränderung am System vorzunehmen, die das System bricht.</p>
<p><strong>15 JUnit Internals</strong></p>
<p>JUnit Internals halt&#8230; (Kapitel überlesen)</p>
<p><strong>16 Refactoring SerialDate</strong></p>
<p>War mir eindeutig zu Java-lastig&#8230; (Kapitel überlesen)</p>
<p><strong>17 Smells and Heuristics</strong></p>
<p>In diesem Kapitel zeigt Uncle Bob eine Liste von Smells und wie man sie beseitigen kann. Er lobt das Buch &#8220;Refactoring&#8221; von Martin Fowler. Dieses Buch steht eh schon ganz oben auf meiner To-do-Liste. Das werde ich also demnächst angehen.</p>
<p><strong>Zusammenfassung</strong></p>
<p>An dieser Stelle ein Dank an mein Entwicklerteam, dass ich das Buch so lange in Beschlag nehmen durfte <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (Teil 2 ging irgendwie zäher). Einen großen Dank auch an <a href="http://www.aspnetzone.de/blogs/peterbucher/" target="_blank">Peter Bucher</a> und <a href="http://weblog.drescher-hackel.de" target="_blank">Rene Drescher-Hackel</a> für ihre Ergänzungen bzw. Einwände. Man darf sicherlich nicht alles so ganz ernst nehmen und man kann es auch übertreiben (siehe Pyramiden etc.). Natürlich sollte man nicht blind durch die Welt laufen, sondern auch Dinge hinterfragen, aber man muss sagen, dass die Punkte von <a href="http://www.clean-code-developer.de/" target="_blank">CCD</a> (das ja auf diesem Buch beruht) durchaus plausibel sind. Ich denke schon, dass <a href="http://www.clean-code-developer.de/" target="_blank">CCD</a> unerfahrenen aber auch erfahrenen Entwicklern einen SOLIDen Weg  zeigt, den man gehen kann und der sogar schon gepflastert ist. Man kann sich natürlich auch mit der Machete durch dichten Dschungel schlagen, was natürlich cool ist <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  &#8211; aber halt wesentlich langsamer. Es sei denn man ist Chuck Norris.</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f11%2f04%2fclean-code-teil-2%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f11%2f04%2fclean-code-teil-2%2f" alt="kick it on dotnet-kicks.de" border="0"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/11/04/clean-code-teil-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Design by Contract &#8211; jetzt auch mit C#</title>
		<link>http://blog.aztec-project.org/2009/10/26/design-by-contract-mit-c/</link>
		<comments>http://blog.aztec-project.org/2009/10/26/design-by-contract-mit-c/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 08:03:39 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Clean Code]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=674</guid>
		<description><![CDATA[Bald kommt .NET 4.0 raus, zusammen mit einem für C# neuen Konzept: Kontrakte im Code mit Spec# festzulegen. Wikipedia definiert DbC folgendermaßen: Design by contract (kurz DbC; englisch Entwurf gemäß Vertrag) oder Programming by Contract ist ein Konzept aus dem Bereich der Softwareentwicklung. Ziel ist das reibungslose Zusammenspiel einzelner Programmmodule durch die Definition formaler „Verträge“ [...]]]></description>
			<content:encoded><![CDATA[<p>Bald kommt .NET 4.0 raus, zusammen mit einem für C# neuen Konzept: Kontrakte im Code mit <b>Spec#</b> festzulegen. </p>
<p>Wikipedia definiert DbC folgendermaßen:</p>
<blockquote><p>Design by contract (kurz DbC; englisch Entwurf gemäß Vertrag) oder Programming by Contract ist ein Konzept aus dem Bereich der Softwareentwicklung. Ziel ist das reibungslose Zusammenspiel einzelner Programmmodule durch die Definition formaler „Verträge“ zur Verwendung von Schnittstellen, die über deren statische Definition hinausgehen. Entwickelt und eingeführt wurde es von Bertrand Meyer mit der Entwicklung der Programmiersprache Eiffel.</p></blockquote>
<p><a href="http://www.lieser-online.de/blog/" target="_blank">Stefan Lieser</a> hat über das neue Konzept einen sehr guten Artikel in <a href="http://www.visualstudio1.de/" target="_blank">www.visualstudio1.de</a> geschrieben, mit Begriffsklärung und Anwendungsbeispiele. Kurz zusammengefasst ist die Rede von Folgendem: anstelle, dass man in jeder Methode auf not-null or not-empty usw. prüft, schreibt man die Erwartungen als Code hin. Diese werden von Tools wie z.B. Resharper erkannt und bei fehlerhaften Aufruf der Methode, wird der Entwickler gewarnt. Am besten finde ich, dass man den Kontrakt-Code z.B. für einen Interface in eine separate Klasse schreiben kann und diese wird durch Attribute (<code>ContractClassFor</code>) gefunden. Also wird dadurch der eigentliche Code nicht größer.</p>
<p>Das soll nicht bedeuten, dass der Entwickler der Methode die Verantwortung von sich schiebt <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , sondern dass er Bedingungen der &#8220;Nutzung&#8221; offenlegt, Informationen, die bisher nur durch das Anschauen des Codes oder durch mündliche/schriftliche Mitteilung möglich war. Mit <b>Spec#</b> kann man die <b>Intention-Revealing Interfaces</b> ganz genau schreiben: mit veröffentlichten und kompilierten Bedingungen.</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f10%2f26%2fdesign-by-contract-mit-c%2f" target="_blank"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f10%2f26%2fdesign-by-contract-mit-c%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/10/26/design-by-contract-mit-c/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Gibt es negative Energien in der deutschen ALT.NET Bewegung?</title>
		<link>http://blog.aztec-project.org/2009/08/26/gibt-es-negative-energien-in-der-deutschen-alt-net-bewegung/</link>
		<comments>http://blog.aztec-project.org/2009/08/26/gibt-es-negative-energien-in-der-deutschen-alt-net-bewegung/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 14:33:57 +0000</pubDate>
		<dc:creator>Stefan Kölle</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Open Space]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=592</guid>
		<description><![CDATA[Im Podcast &#8220;Talking with Jeremy Miller about ALT.NET&#8221; spricht James Avery mit Jeremy Miller über ALT.NET und die Community allgemein. Beim ALT.NET Open Spaces in Seattle wurde wieder eine sehr negative Session angesetzt, &#8220;Why so mean?&#8221;. Scott Hanselman stellt hier sehr provokant die Frage, warum die Community immer mehr Energie aufwendet um zu Kritisieren, anstatt [...]]]></description>
			<content:encoded><![CDATA[<p>Im Podcast <a href="http://www.altnetpodcast.com/episodes/18-talking-with-jeremy-miller-about-alt-net" target="_blank">&#8220;Talking with Jeremy Miller about ALT.NET&#8221;</a>  spricht James Avery mit Jeremy Miller über ALT.NET und die Community allgemein.</p>
<p>Beim ALT.NET Open Spaces in Seattle wurde wieder eine sehr negative Session angesetzt, &#8220;Why so mean?&#8221;. Scott Hanselman stellt hier sehr provokant die Frage, warum die Community immer mehr Energie aufwendet um zu Kritisieren, anstatt die neuen Technologien positiv nach aussen zu tragen. Dies kann ich nach meinen jetzigen Erfahrungen beim .NET Open Spaces in Ulm nicht bestätigen. Bei uns habe ich keinerlei negative Energie gespürt.</p>
<p>Andererseits sehe ich es genauso wie Jeremy: Ansätze, die teilweise gegeneinander arbeiten. DDD widerspricht meiner Meinung nach oft den bisher genutzten Kapselungen. Was nun besser oder schlechter ist kann ich derzeit noch nicht sagen, dazu kenne ich selbst DDD zu wenig. Die Mehrheit der ALT.NET Community hat wohl noch nicht einen allgemeingültigen Weg zur Verfügung, der aus dem bisher eingebrachten Wissen entstanden ist.</p>
<p>Was wohl langfristig nötig ist, dass wir uns über den Grundgedanken von ALT.NET wieder bewusst werden. Der entstehende Code soll clean, korrekt und erweiterbar sein. Also eine auf den Code zentrierte Produktentwicklung. Der Weg mit CCD sehe ich damit als den Richtigen und CCD spricht auch gerade einen positiven Aspekt an.</p>
<p>Seht ihr ähnliche Tendenzen wie Jeremy in der deutschen Community?</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f08%2f26%2fgibt-es-negative-energien-in-der-deutschen-alt-net-bewegung%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f08%2f26%2fgibt-es-negative-energien-in-der-deutschen-alt-net-bewegung%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/08/26/gibt-es-negative-energien-in-der-deutschen-alt-net-bewegung/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Clean Code Teil 1</title>
		<link>http://blog.aztec-project.org/2009/08/11/clean-code-teil-1/</link>
		<comments>http://blog.aztec-project.org/2009/08/11/clean-code-teil-1/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 10:03:42 +0000</pubDate>
		<dc:creator>Andreas Seebauer</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Buch]]></category>
		<category><![CDATA[CCD]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=497</guid>
		<description><![CDATA[Da es für einen Entwickler wichtig ist, sich ständig weiterzuentwickeln, sollte man sich durch Austausch mit anderen Entwicklern, aktives Programmieren oder eben Bücher weiterbilden. Das Buch, das ich gerade lese, heißt Clean Code von Robert C. Martin a.k.a. Uncle Bob. Ich bin momentan bei der Hälfte des Buches und muss sagen, dass ich von dem [...]]]></description>
			<content:encoded><![CDATA[<table border="0" width="685px">
<tbody>
<tr>
<td>
<div><a href="http://blog.aztec-project.org/wp-content/uploads/2009/08/c0025902_49cff1bd96e00.jpg" target="_blank"><img class="size-medium wp-image-505 alignleft" title="Clean Code" src="http://blog.aztec-project.org/wp-content/uploads/2009/08/c0025902_49cff1bd96e00-225x300.jpg" alt="Clean Code" width="95" height="126" /></a></p>
<p>Da es für einen Entwickler wichtig ist, sich ständig weiterzuentwickeln, sollte man sich durch Austausch mit anderen Entwicklern, aktives Programmieren oder eben Bücher weiterbilden. Das Buch, das ich gerade lese, heißt Clean Code von Robert C. Martin a.k.a. Uncle Bob. Ich bin momentan bei der Hälfte des Buches und muss sagen, dass ich von dem Buch ziemlich begeistert bin. Da ich denke, dass es vielen Entwicklern helfen würde, besseren Code zu schreiben, habe ich den Text ein wenig verkürzt und zusammengefasst &#8211; was natürlich nicht heißt, dass man dieses Buch nicht lesen muss. Meiner Meinung nach ist es absolute Pflichtlektüre für jeden Entwickler, der was auf sich hält.</p>
<p>Hier also meine kleine Zusammenfassung.</p></div>
<h3><strong>Kapitel 1 Clean Code</strong></h3>
<p>In diesem Kapitel wird beschrieben, was Clean Code ist und dass man „Clean Code“ schreiben muss, um sich selbst einen professionellen Softwareentwickler nennen zu dürfen. Was Clean Code ausmacht, hat <a href="http://blog.aztec-project.org/author/chi/" target="_blank">Christina</a> schon in ihrem Artikel <a href="http://blog.aztec-project.org/2009/07/14/clean-code-developing/" target="_blank">„Clean Code Developer – The Yellow Brick Road of the Coder“</a> beschrieben. Außerdem wichtig sind :<br />
<strong>LeBlanc’s Gesetz : Later equals never</strong><br />
und<br />
<strong>die Boy Scout Rule : Leave the campground cleaner than you found it</strong>.</p>
<h3><strong>Kapitel 2 Meaningful Names</strong></h3>
<p>Benennung in einem Projekt ist sehr wichtig, sei es um das Gesuchte zu finden oder um den Sinn einer Variablen oder einer Methode ohne langes Überlegen zu erkennen. Man sollte bei der Vergabe von Namen so gründlich vorgehen, wie man es für seinen Erstgeborenen tun würde. In der heutigen Zeit ist die Ungarische Notation absoluter Quatsch. Die IDE kennt den Typ, warum sollte man das in den Variablennamen integrieren?</p>
<h3><strong>Kapitel 3 Funktionen</strong></h3>
<p>Die erste Regel von Funktionen lautet: Sie sollte klein sein.<br />
Die zweite Regel von Funktionen lautet: Sie sollte noch kleiner sein als das.<br />
Eine Funktion sollte nur eine Sache tun. Macht sie mehr als eine Sache, steigt die Komplexität. Und Komplexität ist schlecht.<br />
Eine gute Benennung der Funktionen ist, wenn der Name beschreibt, was die Funktion macht. Dabei darf der Name ruhig lang sein, wenn es der Lesbarkeit des Codes dienlich ist.<br />
Flagargumente sind verboten! Durch dieses Flag macht die Methode schon mehr als eine Sache und wir wären wieder bei der Sache mit der Komplexität. Böse.<br />
Die ideale Anzahl von Parametern einer Funktion ist 0! Aber da nicht immer alles ideal laufen kann, sind 1, 2 auch okay. Aber mehr als 3 ist verboten. Okay?<br />
Last but not least eine sehr wichtige Grundregel: Don’t Repeat Yourself!<br />
Denn: Durch Verdopplung des Codes steigt der Wartungsaufwand proportional.</p>
<h3><strong>Kapitel 4 Kommentare</strong></h3>
<p>Kommentare sind schlecht, denn sie lügen! Ja, LÜGE! Code wird häufig verändert durch neue Anforderungen oder Refaktorisierungsmaßnahmen, der dazugehörige Kommentar aber meist nicht, wodurch schlechte bzw. in die Irre führende Kommentare entstehen. Es gilt also: Keine Kommentare sind besser als schlechte Kommentare. Man sollte die Zeit, die man für das Schreiben von Kommentaren aufbringen würde, lieber für die Refaktorierung der Methode verwenden. Denn Code sollte sich selbst erklären und ist außerdem die aktuellste Dokumentation. Nur schlechter Code muss kommentiert werden.<br />
<strong>Auskommentieren des Codes ist verboten!</strong> Andere Programmierer, die den auskommentierten Code sehen, werden diesen nicht löschen, da sie denken, dass es einen Grund haben muss, dass er dort steht und dass er zu wichtig ist, um gelöscht zu werden. Somit bleibt dieser &#8220;Kommentar&#8221; auf ewig dort und müllt unseren &#8220;Clean Code&#8221; zu. Heutzutage muss man nichts mehr auskommentieren. Durch Versionskontrolle geht nichts mehr verloren.</p>
<h3><strong>Kapitel 5 Formatting</strong></h3>
<p>Eine perfekte Formatierung gibt es nicht, vielleicht für jeden Einzelnen, aber nicht für ein Team. Jeder hat seine Vorlieben. Letzendlich ist nur wichtig, dass sich das Team auf <strong>EINE</strong> Formatierung einigt. Jeder in diesem Team muss sich daran halten, auch wenn es für einen selbst nicht die optimale Lösung ist. Der Nutzen einer gemeinsamen „Sprache“ ist einfach zu groß, denn Kommunikation ist das A und O.</p>
<h3><strong>Kapitel 6 Objects and Data Structures</strong></h3>
<p>Es wird grundsätzlich zwischen Objekten und Data Structures unterschieden.<br />
Objekte enthalten Businesslogik und sollten ihre interne Struktur nach außen hin verbergen, also keine Properties, welche die Member-Variablen des Objekts zurückgeben oder verändern lassen. Nur das Objekt selbst sollte seinen internen Status ändern können, wobei bei Objekten auf das Gesetz von Demeter zu achten ist:<br />
Es besagt, dass Objekte nur mit Objekten in ihrer unmittelbaren Umgebung kommunizieren sollen.<br />
Also:<br />
Methode m der Klasse k sollte nur Methoden nutzen von:</p>
<ul>
<li> k</li>
<li> Ein Objekt, dass von m erstellt wurde</li>
<li> Ein Übergabeparameter an m</li>
<li> Ein Memberobjekt von k</li>
</ul>
<p>Data Structures sind zum Beispiel Data Transfer Objects, kurz DTOs. Das sind Klassen ohne Methoden, also reine Datenträger. Eine spezielle Form von DTOs sind Active Records. Diese Objekte haben Methoden wie Save() und Find(), enthalten jedoch keine Businesslogik.</p>
<h3><strong>Kapitel 7 Error Handling</strong></h3>
<p>Moderne Programmiersprachen haben ein Feature namens Exceptions. Das sollte man auch nutzen. Fehlercodes oder ähnliches sind veraltet. Eine gute Exception sollte allerdings so viel Information liefern, dass man auch ohne Debuggen den Fehler identifizieren kann, sonst kann man sich die ganze Mühe auch sparen.<br />
Außerdem noch 2 wichtige Grundregeln:<br />
<strong>Don’t Return null</strong> – somit wird es unnötig auf null zu prüfen<br />
und<br />
<strong>Don’t Pass null </strong>– null an eine Methode zu übergeben ist noch schlimmer als null zu returnen</p>
<h3><strong>Kapitel 8 Boundaries</strong></h3>
<p>Man sollte unbedingt das Adapterpattern anwenden, wenn man 3rd party Code verwendet. 3rd party code sollte an so wenig stellen wie möglich verwendet werden, um Abhängigkeiten zu vermeiden.</p>
<h3><strong>Kapitel 9 Unit Tests</strong></h3>
<p>Die 3 Gesetze von TDD:</p>
<ol>
<li> Man darf keinen produktiven Code schreiben, solange man keinen fehlgeschlagenen Unit Test geschrieben hat.</li>
<li> Man darf nicht mehr als nötig schreiben, um einen Unit Test fehlschlagen zu lassen, und Fehler beim Kompilieren bedeutet einen fehlgeschlagenen Test.</li>
<li> Man darf nicht mehr produktiven Code als nötig schreiben, um einen fehlgeschlagenen Test zu reparieren.</li>
</ol>
<p>Außerdem gilt: Tests sollten genauso “Clean Code” sein wie produktiver Code. Tests sollten genauso evolvierbar sein. Denn wenn sich der Code verändert, muss sich der Test auch verändern.<br />
Ein Test sollte nur ein Szenario abdecken &#8211; wieder das Thema Komplexität.</p>
<p>Clean Tests folgen noch 5 anderen Regeln:<br />
<strong>F</strong>ast<br />
<strong>I</strong>ndependent<br />
<strong>R</strong>epeatable<br />
<strong>S</strong>elf Validating<br />
<strong>T</strong>imely</p>
<p>Teil 2 gibt es <a href="http://blog.aztec-project.org/2009/11/04/clean-code-teil-2/" target="_blank">hier</a></p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f08%2f11%2fclean-code-teil-1%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f08%2f11%2fclean-code-teil-1%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/08/11/clean-code-teil-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Clean Code Developer &#8211; The Yellow Brick Road of the Coder</title>
		<link>http://blog.aztec-project.org/2009/07/14/clean-code-developing/</link>
		<comments>http://blog.aztec-project.org/2009/07/14/clean-code-developing/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 13:14:46 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[CCD]]></category>
		<category><![CDATA[Community]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=455</guid>
		<description><![CDATA[Seit dem ich Code schreibe, steht für mich ein klarer und verständlicher Code an oberster Stelle. Ich hatte dann vor ca. eineinhalb Jahren Code Complete und The Pragmatic Programmer gelesen und dadurch die ersten Antworten bekommen, WIE man den Code unter Kontrolle hält. Anfang 2009 sind wir &#8211; ich und Stefan &#8211; durch den Podcast [...]]]></description>
			<content:encoded><![CDATA[<p>Seit dem ich Code schreibe, steht für mich ein klarer und verständlicher Code an oberster Stelle. Ich hatte dann vor ca. eineinhalb Jahren <a href="http://www.amazon.de/Code-Complete-Deutsche-Ausgabe-Second/dp/386063593X/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1247574862&amp;sr=8-2" target="_blank">Code Complete</a> und <a href="http://www.amazon.de/Pragmatische-Programmierer-Andrew-Hunt/dp/3446223096/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1247574887&amp;sr=1-1" target="_blank">The Pragmatic Programmer</a> gelesen und dadurch die ersten Antworten bekommen, WIE man den Code unter Kontrolle hält. Anfang 2009 sind wir &#8211; ich und Stefan &#8211; durch den <a href="http://www.hanselman.com/blog/HanselminutesPodcast145SOLIDPrinciplesWithUncleBobRobertCMartin.aspx" target="_blank">Podcast von Hanselman und Uncle Bob</a> auf das Thema SOLID gestoßen &#8211; und darüber auch eine ausgiebige Diskussion geführt. Eins war uns klar: die Ideen, die dahinter stecken, könnten die Antwort auf unsere Suche sein.</p>
<p>Deshalb hat mich sehr gefreut, als ich von der Seite <a href="http://blog.aztec-project.org/2009/06/06/clean-code-developer/" target="_blank">Clean Code Developer</a> erfahren habe. Ihr Inhalt hat mich sofort begeistert. Sie beschreibt einen &#8211; wahrscheinlich DEN &#8211; möglichen Weg um ein <strong>professioneller Softwareentwickler</strong> zu werden.</p>
<p>Am letzten Wochenende auf dem <a href="http://ulm.netopenspace.de" target="_blank">.NET Open-Space-Süd</a> habe ich das große Vergnügen gehabt, <a href="http://www.lieser-online.de/blog/" target="_blank">Stefan Lieser</a>, einen der Gründer von <a href="http://clean-code-developer.de/" target="_blank">Clean Code Developer</a>-Seite kennen zu lernen und so konnte ich in den 2 Tagen viel über den Weg von einem <em>Creepy-Code-Programmer</em> zu einem <em>Clean-Code-Programmer</em> erfahren.</p>
<p>Die Grundidee ist ganz einfach: genauso wie ein Arzt oder ein Architekt, muss auch ein professioneller Softwareentwickler Verantwortung für seine Arbeit und für die Ergebnisse dieser Arbeit übernehmen. Er/sie muss sicherstellen, dass der Code korrekt, evolvierbar und effizient ist und dass er selbst immer sein Bestes gibt. Damit ist nicht gemeint, dass jeder ein Guru sein muss. Nein, professioneller Softwareentwickler ist derjenige, der an einem Wertesystem festhält und immer die Qualität des Codes vor den Augen hat.</p>
<p>Viele werden sagen &#8220;Wozu die Mühe, es funktioniert auch so!&#8221;. Klar, wenn man nur für den Jetzt programmiert. Dann, nach kurzer Zeit passiert das unvermeidliche: jemand &#8211; oder der Entwickler selbst &#8211; muss den furchterregend schlechten Code bugfixen/verändern. All diese Entwickler, die solche Aufgaben hatten, werden Tests zu schätzen wissen. Diese Tests kosten  zwar etwas Mühe aber bescheren einem einen ruhigen Schlaf.</p>
<p>Zu einem genauso großen Problem führt, wenn man das elementarste aller Prinzipien nicht respektiert: <strong>D</strong>on&#8217;t-<strong>R</strong>epeat-<strong>Y</strong>ourself (<a href="http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself" target="_blank">DRY</a>). Wie oft passiert, dass man eine Methode, ein Verhalten anpassen muss und überall nach verstreuten Kopien vom Code suchen muss? Könnt ihr jedes Mal garantieren, dass ihr alle erwischt habt? Das wäre keine Frage, wenn der Entwickler des Codes das DRY-Prinzip respektiert.</p>
<p>Der Code, den ein Entwickler schreibt, gehört meistens nicht ihm. Ich bin sicher, keiner von uns möchte als &#8220;Creepy-Coder&#8221; beschimpft werden, wenn jemand anderer unserer Code verstehen oder weiterentwickeln muss.</p>
<p>Nimmt eure Arbeit ernst und werdet ein professioneller Entwickler. Ihr werdet nach kürzester Zeit die Freude an einem korrekten und qualitativen Code entdecken und auch eure Teamkollegen und Chefs werden dafür dankbar sein.</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f07%2f14%2fclean-code-developing%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f07%2f14%2fclean-code-developing%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/07/14/clean-code-developing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Clean-Code-Developer</title>
		<link>http://blog.aztec-project.org/2009/06/06/clean-code-developer/</link>
		<comments>http://blog.aztec-project.org/2009/06/06/clean-code-developer/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 12:05:28 +0000</pubDate>
		<dc:creator>Thomas Christian</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Architektur]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=132</guid>
		<description><![CDATA[Heute habe ich einen recht interessanten Artikel gelesen. In diesem ging es darum besseren Code zu schreiben, zu warten und im allgemeinen besser mit ihm umzugehen. Die Rede ist dabei von Clean-Code-Developer. Dabei geht es weder darum neue Technologien zu verwenden, noch darum neue Sprachen zu erlernen. Eigentlich ist es eher ein kleiner Leitfaden um [...]]]></description>
			<content:encoded><![CDATA[<p>Heute habe ich einen recht interessanten Artikel gelesen. In diesem ging es darum besseren Code zu schreiben, zu warten und im allgemeinen besser mit ihm umzugehen. Die Rede ist dabei von <a href="http://www.clean-code-developer.de" target="_blank">Clean-Code-Developer</a>.</p>
<p>Dabei geht es weder darum neue Technologien zu verwenden, noch darum neue Sprachen zu erlernen. Eigentlich ist es eher ein kleiner Leitfaden um  sich stetig zu verbessern, und das wollen wir doch im Allgemeinen eh, sonst würde dieser Blog-Eintrag wohl auch nicht gelesen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/06/06/clean-code-developer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
