<?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>Zeitalter3 - Browsergames Entwicklerblog &#187; Refactoring</title>
	<atom:link href="http://blog.zeitalter3.de/tag/refactoring/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zeitalter3.de</link>
	<description>Ein Blog über persistente Browsergames und deren Entstehung</description>
	<lastBuildDate>Sat, 07 Aug 2010 06:22:27 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>First Preview: Zeitgeist</title>
		<link>http://blog.zeitalter3.de/2009/09/25/first-preview-zeitgeist/</link>
		<comments>http://blog.zeitalter3.de/2009/09/25/first-preview-zeitgeist/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 21:21:33 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Zeitgeist-Framework]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Zeitgeist]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=642</guid>
		<description><![CDATA[Seit einiger Zeit herrscht verdächtige Stille in diesem Blog. Dies lag einerseits an meinem Jahresurlaub, andererseits habe ich die letzten Wochen damit verbracht das Zeitgeist-Framework aufzubereiten, zu dokumentieren und Beispiele dafür zu erstellen. Daneben habe ich das Administrations-Tool von Zeitgeist neu geschrieben und das Projekt-Repository ordentlich aufgeräumt. Das alles diente dem Zweck (Trommelwirbel) eine erste Version [...]]]></description>
			<content:encoded><![CDATA[<p>Seit einiger Zeit herrscht verdächtige Stille in diesem Blog. Dies lag einerseits an meinem Jahresurlaub, andererseits habe ich die letzten Wochen damit verbracht das <a href="http://blog.zeitalter3.de/2009/05/20/das-zeitgeist-framework/" target="_blank">Zeitgeist-Framework</a> aufzubereiten, zu dokumentieren und Beispiele dafür zu erstellen. Daneben habe ich das Administrations-Tool von Zeitgeist neu geschrieben und das Projekt-Repository ordentlich aufgeräumt. Das alles diente dem Zweck (<em>Trommelwirbel</em>) eine erste Version von Zeitgeist für externe Tester vorzubereiten.</p>
<p>In den kommenden Wochen werde ich Zeitgeist einer handvoll befreundeter Entwickler zugänglich machen, auf dass diese es auseinander nehmen können und mir möglichst schonungslos alle Designfehler und kleinen Faulheiten unter die Nase reiben. Dabei geht es darum zum ersten Mal das Framework wirklich in seiner Gänze an Dritte zu geben, damit diese es benutzen bzw. durchtesten können.</p>
<p><strong>Interesse?</strong></p>
<p>Wenn du jetzt gerade aufgehorcht und schon überlegt hast mit wem du ins Bett gehen musst, um ebenfalls an das Framework heranzukommen &#8211; keine Sorge: eine Mail genügt. Es muss nur die richtige Mail sein. Genauer gesagt musst du selbst einige Voraussetzungen erfüllen.</p>
<p>Zeitgeist ist ein PHP5 basiertes Framework, was ordentlich Gebrauch von OOP macht. Dazu kommt, dass ZG kein WYSIWYG Framework ist, das euch an die Hand nimmt, sondern nur ein ziemlich dünner Unterbau, der einem zwar viele Freiheiten lässt, aber auch viel abverlangt. Kurz: du solltest kein Einsteiger in Sachen Webentwicklung sein. Am besten hast du schon ein paar eigene, kleinere Projekte erfolgreich umgesetzt. Und damit meine ich nicht &#8220;phpBB installiert&#8221;, sondern eigene Applikationen und Plattformen entwickelt.</p>
<p>Ideal wäre es natürlich, wenn ihr gerade mit der Entwicklung eines kleinen Projekts beginnen wollt und genug Gottvertrauen habt, um auf ein völlig fremdes Framework zu setzen.</p>
<p><strong>Was habt ihr davon Zeitgeist zu nutzen?</strong></p>
<p>Mit einem Wort: Unterstützung. Ich rede nicht von First-Level-Support oder Hotlines, sondern davon, dass ich euch zuhören werde, jede Anregung beachte und zumindest überdenke, gerne zu konstruktiven Diskussionen bereit bin und natürlich euch bei Fragen zum Einsatz des Frameworks unterstützen will.</p>
<p>Dazu kommt, dass Zeitgeist selbst mitnichten ungetestete Alpha-Software ist. Das Framework wurde als Ganzes und in Teilen erfolgreich in mehreren kleinen und mittleren Projekten getestet. Natürlich kann und wird sich noch einiges am Framework verändern, jedoch ist es in jeder Hinsicht für den produktiven Einsatz verwendbar.</p>
<p><strong>Die Zukunft von Zeitgeist</strong></p>
<p>Zeitgeist wird mittelfristig Open Source werden und für alle zugänglich gemacht. Der Zeitplan sieht vor, dass dies allerdings noch bis mindestens 2010 dauert, also haltet nicht den Atem an. Der Plan sieht vor die Ergebnisse dieser geschlossenen Feedback-Runde einzuarbeiten und die Dokumentation weiter auszubauen. Dazu kommt eine Art FAQ und First-Steps-Dokument, um einsteigende Entwickler zu unterstützen. Das wird jedoch noch einige Zeit in Anspruch nehmen. Bis dahin bleibt es spannend.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2009/09/25/first-preview-zeitgeist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kurz gebloggt: ICO, Joel Spolsky und Tom Chick</title>
		<link>http://blog.zeitalter3.de/2009/01/29/kurz-gebloggt-ico-joel-spolsky-und-tom-chick/</link>
		<comments>http://blog.zeitalter3.de/2009/01/29/kurz-gebloggt-ico-joel-spolsky-und-tom-chick/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 16:28:58 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[ICO]]></category>
		<category><![CDATA[Metaplace]]></category>
		<category><![CDATA[mmog]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=527</guid>
		<description><![CDATA[ICO Partners benennen ihre 9 online games/MMO trends for 2009 (part 2). Joel sagt: &#8220;Es gibt keinen Grund bestehenden Code eines ganzen Projekts wegzuwerfen und neu anzufangen, nur weil die Programmierer das wollen&#8220;. Und er hat recht, auch nach 8 Jahren. Und wieder ein großartiger Artikel von Raph Koster: &#8220;Ways to make your virtual space more [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>ICO Partners benennen ihre <a href="http://www.icopartners.com/blog/archives/190" target="_blank">9 online games/MMO trends for 2009 (part 2)</a>.</li>
<li>Joel sagt: &#8220;<a href="http://www.joelonsoftware.com/articles/fog0000000069.html" target="_blank">Es gibt keinen Grund bestehenden Code eines ganzen Projekts wegzuwerfen und neu anzufangen, nur weil die Programmierer das wollen</a>&#8220;. Und er hat recht, auch nach 8 Jahren.</li>
<li>Und wieder ein großartiger Artikel von Raph Koster: &#8220;<a href="http://www.raphkoster.com/2009/01/28/ways-to-make-your-virtual-space-more-social/" target="_blank">Ways to make your virtual space more social</a>&#8220;</li>
<li>Wenn <a href="http://fidgit.com/about.php" target="_blank">Tom Chick</a> einen Rant schreibt, dann sollte man zuhören. So auch sein Artikel: &#8220;<a href="http://fidgit.com/archives/2009/01/five-ways-mmos-are-broken.php" target="_blank">Five reasons MMOs are broken</a>&#8220;. Und Scott Jennings hat dazu dann <a href="http://www.brokentoys.org/2009/01/28/answering-tom-chick-five-easy-pieces-and-one-snide-one/" target="_blank">auch noch was zu sagen</a>. Mein Take: Ja, Tom sieht primär WoW, aber er hat nicht unrecht, dass sich am Prinzip was ändern muss.</li>
</ul>
<p>Oh, und wie schon <a href="http://twitter.com/DirkSonguer/status/1156595761" target="_blank">getwittert</a> ist mir etwas tolles passiert. Das nervigste daran ist eindeutig nicht darüber reden zu dürfen. Narf! Wenn ihr trotzdem wissen wollt, wie es in Metaplace aussieht, <a href="http://www.raphkoster.com/2009/01/28/metaplace-beta-key-giveaway/" target="_blank">registriert euch schnell</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2009/01/29/kurz-gebloggt-ico-joel-spolsky-und-tom-chick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Zeitgeist Nachrichtensystem</title>
		<link>http://blog.zeitalter3.de/2008/11/23/das-zeitgeist-nachrichtensystem/</link>
		<comments>http://blog.zeitalter3.de/2008/11/23/das-zeitgeist-nachrichtensystem/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 14:11:54 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Zeitgeist-Framework]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Zeitgeist]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=435</guid>
		<description><![CDATA[Jetzt mal ernsthaft &#8211; ihr könnt euch ruhig trauen hier im Blog mit Hilfe der Kommentare zu fragen, anstatt mir umständlich eine Mail zu schreiben. Die Frage war: Was ist dieses angesprochene Message-System? Nun, einfach gesagt: Die Message-Klasse stellt Funktionalitäten bereit, um systemweite Textnachrichten zu verwalten. Das Prinzip der systemweiten Nachrichten sollte vielen bekannt sein, [...]]]></description>
			<content:encoded><![CDATA[<p>Jetzt mal ernsthaft &#8211; ihr könnt euch ruhig trauen hier im Blog mit Hilfe der Kommentare zu fragen, anstatt mir umständlich eine Mail zu schreiben.</p>
<p>Die Frage war:</p>
<p><strong>Was ist dieses angesprochene Message-System?</strong></p>
<p>Nun, einfach gesagt: <em>Die Message-Klasse stellt Funktionalitäten bereit, um systemweite Textnachrichten zu verwalten.</em></p>
<p>Das Prinzip der systemweiten Nachrichten sollte vielen bekannt sein, die schon einmal etwas tiefer in die  Dektop-Programmierung eingestiegen sind. Man kann es sich als eine Art Modul vorstellen, das von überall her angesprochen werden kann. An dieses Modul können Nachrichten übergeben und umgekehrt wieder angefordert werden. Auf diese Weise können alle Module eines Projekts miteinander kommunizieren.</p>
<p><span id="more-435"></span></p>
<p><strong>Ein Beispiel</strong></p>
<p>Nehmen wir einmal einen typischen Fall in einer Webapplikation: ein Benutzer kauft in einem B2B-Webshop den Inhalt seines Warenkorbs. Dieser einfache Klick setzt einige Abläufe in Gang &#8211; gehen wir der Einfachheit mal von folgenden Prozessen und Fragen aus, die das System nun anstößt:</p>
<ul>
<li>Ist der Benutzer eingeloggt?</li>
<li>Kenne ich alle nötigen Angaben des Benutzers?</li>
<li>Was ist denn der Inhalt des Warenkorbs</li>
<li>Sind die Waren überhaupt noch verfügbar?</li>
<li>Erstelle eine Rechnung</li>
<li>Informiere das Warenwirtschaftssystem</li>
</ul>
<p>Diese können leicht durch Klassen und deren Methoden beantwortet werden. Allerdings werden dabei viele, viele Zwischenfragen gestellt und lauter Klassen müssen ineinander greifen: Benutzerverwaltung, Warenkorb, Waren, Rechnungsstellung, Schnittstelle zum Warenwirtschaftssystem und so weiter. Der ganze Ablauf wird wahrscheinlich verwaltet durch eine Art Controller (in MVC), mit dem jede Klasse für sich sprechen kann. Doch wie können diese individuellen Klassen miteinander sprechen?</p>
<p><strong>Falsch!</strong></p>
<p>Einfache Antwort: in sauberem OOP <em>sollen</em> Arbeiterklassen auch gar nicht untereinander Daten austauschen. Gut, zugegeben. Aber abgesehen von Daten: wie wäre es, wenn sie Informationen über ihren Zustand austauschen? Oder sie alle wollen möglicherweise mit dem Controller oder gar dem Benutzer reden. Und dieses Mitteilungsbedürfnis kann eben über den einfachen Rückgabewert hinaus gehen. Wenn mir eine Methode einer Arbeiterklasse ein <em>false </em>zurückliefert, was ist denn eigentlich genau schief gelaufen? In welchem Zustand befindet sich dann die Arbeiterklasse? (An dieser Stelle würde ich ja gerne mit Exception Handling anfangen, aber die Implementation in PHP5 ist so mangelhaft, dass das leider nicht geht).</p>
<p>Also &#8211; gehen wir von einer Art Verbose-Modus innerhalb der Applikation aus, in dem jede Klasse ihre Schritte dokumentieren kann und alle anderen wissen, in welchem State sich die Applikation gerade befindet.</p>
<p><strong>Die Umsetzung<br />
</strong></p>
<p>Gundsätzlich könnte man jetzt das Problem mit globalen Variablen lösen. Mal abgesehen von dem &#8220;globale Variablen sind die Wurzel allen Übels&#8221;-Stigma sind sie wirklich nicht besonders sinnvoll. Es ist schwer im Blick zu halten, welche Funktion gerade was in welche Globale geschrieben hat, was Debugging und vor allem Testing zu einem Horrortrip macht.</p>
<p>Alternativ würden sich Session-Variablen anbieten, aber wenn man es genau betrachtet sind diese in dem Zusammenhang auch nichts anderes als Globale in Grün.</p>
<p><strong>Was ist daran schlecht?</strong></p>
<p>Das da:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="src" value="http://www.youtube.com/v/-FRm3VPhseI&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/-FRm3VPhseI&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1" allowfullscreen="true"></embed></object></p>
<p><strong>Warum machst du es dann doch, obwohl sogar Google sagt, dass es schlecht ist?</strong></p>
<p>Wer aufgepasst hat, der hat sich gemerkt, dass Singletons (über die wir hier reden) nicht per se schlecht sind. Man muss sie nur entsprechend designen. Denn grundsätzlich haben Singletons einige entscheidende Vorteile gegenüber einer Anzahl von &#8220;dummen&#8221; Globalen.</p>
<p>Zunächst einmal wäre da die <em>Nachvollziehbarkeit</em>. Die Klasse selbst kann nachvollziehen welche Methode oder Funktion gerade auf sie zugegreift und was diese verändert. Voraussetzung ist, diese Informationen fließen alle in eine Art Tracing-Mechanismus, was dem Entwickler zu jeder Zeit des Programms transparent macht, was an welcher Stelle passiert ist. In der Kombination mit dem Tracer bleibt dann nachvollziehbar, was genau mit dem Global State passiert (siehe Video).</p>
<p>Ich erwähnte bereits, dass das Nachrichtensystem die Informationen nicht nur speichert, sondern auch verwaltet. Eine Methode kann eine Nachricht mit einem <em>expliziten Empfänger</em> versehen. Somit erhält eine Methode an anderer Stelle bei einer Anfrage nach für sie relevanten Nachrichten auch nur die für sie gespeicherten Informationen.</p>
<p>Möglich ist auch eine effektive <em>Rechteverwaltung</em>, welche Module auf welche gespeicherten Informationen zugreifen bzw. diese verändern können.</p>
<p>Und schließlich: Nachrichten können über Aufrufe hinweg <em>gespeichert </em>werden. Ein Beispiel: wenn bei einem Aufruf einige Funktionen einen Fehler melden, der Benutzer daraufhin per Redirect auf eine andere Seite geleitet wird, kann das System immer noch nachvollziehen, welche Fehler eigentlich gemeldet wurden und dem Benutzer entsprechende Ausgaben präsentieren. Das ist eigentlich die Hölle für einen Global State, aber noch einmal: wir können leicht nachvollziehen wer den State wann gesetzt hat. Und umgekehrt können wir diesen auch leicht definieren, um ihn so testen zu können.</p>
<p><strong>Fazit</strong></p>
<p>Ja, das ist Overhead. Aber nicht so viel, wie man denkt. Macht es das Debuggen und Warten des Codes problematischer? Ja, ein bischen. Oder vielmehr: man sollte sich über ein paar Dinge im Klaren sein. Dann aber ist es immer nett, wenn man mehr Informationen zur Verfügung hat, was genau in der Applikation vorgeht &#8211; auch innerhalb der Applikation selbst.</p>
<p>Aber um eine Sache klarzustellen: wir reden hier von Nachrichten, Kommunikation und Übersicht. Die eigentilchen Arbeiterklassen sollten entsprechend korrektem OOP-Design erstellt werden (siehe oben, siehe Vortrag). Was nicht Sinn der Sache ist, dass (wie in unserem B2B-Shop-Beispiel) der Warenkorb plötzlich über das Nachrichtensystem von einer Arbeiterklasse zur nächsten gereicht wird. Dann sind wir in der Tat bei &#8220;Bad Global State&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2008/11/23/das-zeitgeist-nachrichtensystem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wie man seine Benutzer behandelt</title>
		<link>http://blog.zeitalter3.de/2008/08/24/wie-man-seine-benutzer-behandelt/</link>
		<comments>http://blog.zeitalter3.de/2008/08/24/wie-man-seine-benutzer-behandelt/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 10:33:04 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Zeitgeist-Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Zeitgeist]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=326</guid>
		<description><![CDATA[Nein, es geht ausnahmsweise mal nicht um Community Management, auch wenn die Überschrift es andeutet. Vielmehr soll es um User Handling bzw. die Nutzerverwaltung gehen, also den Ablauf, wie die Applikation an sich mit den Benutzern umgeht. Wie bereits erwähnt hat Zeitgeist eine recht komplexe Nutzerverwaltung. Ein Benutzer hat Kerndaten, zum Beispiel Nutzername, Passwort und [...]]]></description>
			<content:encoded><![CDATA[<p>Nein, es geht ausnahmsweise mal nicht um Community Management, auch wenn die Überschrift es andeutet. Vielmehr soll es um User Handling bzw. die Nutzerverwaltung gehen, also den Ablauf, wie die Applikation an sich mit den Benutzern umgeht.</p>
<p>Wie bereits <a href="http://blog.zeitalter3.de/2007/10/23/nutzerverwaltung-101/">erwähnt</a> hat Zeitgeist eine recht komplexe Nutzerverwaltung. Ein Benutzer hat Kerndaten, zum Beispiel Nutzername, Passwort und diverse Schlüssel. Dazu kommen weitere, applikationsabhängige Nutzerdaten, zum Beispiel Vorname, Nachname, Adresse usw. Normalerweise handelt es sich hierbei um 1:1 Beziehungen. Die Daten sind dennoch in eine extra Tabelle ausgelagert und besitzen eine eigene Verwaltung. Der Grund ist, dass man so von Applikation zu Applikation die Nutzerdaten leicht erweitern kann, oder (Beispielsweise bei Webshops mit mehreren Lieferadressen) einfach 1:n Beziehungen abgebildet werden können.</p>
<p>Darüber hinaus hat jeder Benutzer eine Anzahl von Rechten. Rechte sind Beschränkungen bzw. Freigaben von Aktionen der Applikation. Und schließlich hat ein Benutzer eine oder mehrere Rollen: Sammlungen von Rechten.</p>
<p>Unsere Hauptdarsteller sind also: <em>Nutzerverwaltung </em>(der ganze administrative Kram, einschließlich Login, Sicherheit, Nutzervariablen  etc.), <em>Nutzerdaten</em>, <em>Nutzerrechte </em>und <em>Nutzerrollen</em>.</p>
<p>Bei der Implementation begannen  die Probleme.</p>
<p><strong>Iteration 1: Die Superklasse</strong></p>
<p>Zunächst hatte ich alle Funktionalität in einer Klasse, die alle Aspekte der Benutzerverwaltung vereinigte. Schritt für Schritt aufgebaut wuchs sie langsam, aber stetig. Ich persönlich hasse es, wenn Klassen über eine bestimmte Größe hinauswachsen. Also war der logische Weg: die Klassen aufspalten. Aber wie?</p>
<p><strong>Iteration 2: Aufteilen in einzelne Dateien</strong></p>
<p>Da im Prinzip alle Komponenten zusammenarbeiten, wollte ich eigentlich alles in einer Klasse belassen. Mein erster Gedanke war also die Klasse einfach nur auf einzelne Dateien aufzuteilen und per Include zusammenzufassen.</p>
<p>Schnell zeigte sich: PHP kann zwar Inhalte von Methoden per Include aus externen Dateien einbinden, aber keine Methoden einer Klasse. Klingt zunächst mal komisch, nachdem ich die Kommentare der PHP-Entwickler zu dem Thema gelesen hatte, war mir aber einiges klar. Na gut, also anders.</p>
<p><strong>Iteration 3: Ableitungen und Zuflüsse</strong></p>
<p>Im Grunde ist das Szenario eines der wenigen sinnvollen Anwendungen für Multiple Inheritance, auch bekannt als Mehrfachvererbung. Im Grunde könnte ich die Nutzerdaten, Nutzerrecht und –Rollen einfach in einzelne Klassen packen und eine Benutzer-Klasse darüber von allen drei erben lassen. Doch, richtig, PHP kann keine Mehrfachvererbung.</p>
<p>Dem Vorschlag in einem Forum doch lieber Chain Inheritance zu nehmen, habe ich gleich den Vogel gezeigt. Auch Interfaces, die immerhin mehrfach geerbt werden dürfen, bringen mir hier gar nichts.</p>
<p><strong>Iteration 4: Die Rückkehr der Superklasse</strong></p>
<p>Also blieb es bei der Superklasse. Sie funktionierte tadellos und so lange ich keinen Blick in die Datei warf, war alles gut &#8211; Bis mir die Situation bei dem letzten Refakturierungslauf endgültig auf die Nerven ging. Ja, wir reden hier von einem ästhetischen Problem, aber das ist wohl bezeichnend für den Stil von Zeitgeist: Funktionalität und Lesbarkeit gehen Hand in Hand.</p>
<p><strong>Iteration 5: Die Worker-Konstruktion</strong></p>
<p>Also gut. Nutzerdaten, Nutzerrechte und –Rollen sind eigene Klassen. In diesen Klassen ist die jeweilige Logik der Komponenten untergebracht. Die Klassen werden von der Benutzerklasse ganz normal instanziert. Für die Kommunikation der Klassen untereinander sorgt ebenfalls die Benutzerklasse.</p>
<p>Es liegt eigentlich nahe die einzelnen Bereiche einfach in eigene Klassen auszulagern, in so fern frage ich mich, wieso ich es nicht die ganze Zeit so gemacht hatte. Auf der anderen Seite erfordert das Zusammenspiel der Klassen einiges an Overhead, was sich nur durch eine recht clevere Einbindung vermeiden lies: die Klassen werden nur geladen, wenn sie gebraucht werden. Wenn die Nutzerdaten nicht gebraucht werden, wird auch nichts geladen – weder die Klasse, noch die Daten aus der Datenbank.</p>
<p>Dazu kommt noch, dass sich die kleinen, abgeschlossenen Klassen wesentlich besser von den Unit Tests testen lassen.</p>
<p><strong>Fazit</strong></p>
<p>Wieso nicht gleich so? &#8211; Weil‘s Aufwand war.<br />
Hat es sich gelohnt? &#8211; Auf jeden Fall.<br />
Wird’s dabei bleiben? &#8211; Ich hoffe doch! Jetzt habe ich keine Lust mehr, das Ding anzufassen <img src='http://blog.zeitalter3.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2008/08/24/wie-man-seine-benutzer-behandelt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
