<?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:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>Guggat emol Blog &#187; MPTT Modified Preorder Tree Traversal</title>
	<atom:link href="http://www.baldenhofer.eu/blog/category/it/design-pattern-it/feed" rel="self" type="application/rss+xml" />
	<link>http://www.baldenhofer.eu/blog</link>
	<description>Roland bloggt über IT, Programmieren und Linux</description>
	<lastBuildDate>Tue, 25 Oct 2011 22:53:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>MPTT Modified Preorder Tree Traversal</title>
		<link>http://www.baldenhofer.eu/blog/it/mptt-modified-preorder-tree-traversal</link>
		<comments>http://www.baldenhofer.eu/blog/it/mptt-modified-preorder-tree-traversal#comments</comments>
		<pubDate>Mon, 30 Nov 2009 22:34:44 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[MPTT]]></category>
		<category><![CDATA[Tree behaviour]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=1795</guid>
		<description><![CDATA[Nee, das ist keine Krankheit sondern eine Möglichkeit seine Bäume im Griff zu haben Ich bin beim CakePHP Programmieren darüber gestolpert. Wenn du dort Bäume verwalten willst, dann kannst du das Tree Behaviour verwenden. Bäume sind sehr praktisch, wenn du deine Daten hierachisch anordnen willst. Wenn du z.B. das Organigramm einer Firma abbilden willst, dann [...]]]></description>
			<content:encoded><![CDATA[<p>Nee, das ist keine Krankheit sondern eine Möglichkeit seine Bäume im Griff zu haben <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Ich bin beim CakePHP Programmieren darüber gestolpert.<br />
Wenn du dort Bäume verwalten willst, dann kannst du das <strong>Tree Behaviour</strong> verwenden.<br />
Bäume sind sehr praktisch, wenn du deine Daten hierachisch anordnen willst.<br />
Wenn du z.B. das Organigramm einer Firma abbilden willst, dann kannst du eine Baumstruktur verwenden:<br />
<img alt="Baumstruktur für Organigramm" src="/images/blog/grundlagen/tree_organigram.jpg" /><br />
So können die einzelnen Mitarbeiter schön einer Abteilung, und die Abteilung am Ende der Firma zugeordnet werden.<br />
Baumstrukturen kannst du auch gut verwenden, wenn du mal in die Verlegenheit kommst eine Navigation zu erstellen. Dort gibt es normalerweise Hauptpunkte und Unterpunkte. Und je nach Auftritt kann man das noch beliebig schachteln.<br />
Irgendwie müssen nun die einzelnen Elemente in einer Datenstruktur abgelegt werden.<br />
Bei MPTT werden die einzelnen Knoten so durchnummeriert, dass immer klar ist wo der linke und der rechte Knoten des entsprechenden Knotens liegt.<br />
Unser Organigramm wird wie folgt durchnummeriert:<br />
<img alt="Nummeriertes Organigramm" src="/images/blog/grundlagen/tree_organigram_numbered.jpg" /><br />
Wenn du nun deine Knoten mit einem Algrorithums durchläufst, musst du nur die Nummern entlanghangeln. Anhand der Information, ob dein Knoten links angelaufen werden soll, oder ob er rechts verlassen wird, kannst du schnell die hierachische Darstellung entsprechend aufbauen.<br />
Du läufst somit an deinem ersten Knoten auf der linken Seite los, gehst zum Folgeknoten ebenfalls auf die linke Seite und verlässt den Folgeknoten auf der rechten Seite. Das machst du so lange, bis zu zu deinem ersten Knoten auf der rechten Seite wieder vorbeikommst.<br />
Hier ein Bildchen, dass diese Aktion für die Abteilung Finanzen durchläuft:<br />
<img alt="Baum traversieren" src="/images/blog/grundlagen/tree_traversierung.jpg" /><br />
Bei dieser Traversierung handelt es sich um eine lineare Aktion, die im Rechner sauschnell durchgeführt werden kann.</p>
<h3>Wie sieht beim CakePHP MPTT die Datenstruktur aus?</h3>
<p>Ich nehm nun als Beispiel die Abteilung Finanzen. Die IDs sind frei erfunden. Ich geh einfach mal davon aus, dass die Firma die ID 1 hat&#8230;<br />
Bei CakePHP wurde für das Tree Behaviour folgende Datenstruktur angewendet:</p>
<table>
<td>id</td>
<td>lft</td>
<td>right</td>
<td>parent_id</td>
<td>some data</td>
<tr>
<td>2</td>
<td>2</td>
<td>9</td>
<td>1</td>
<td>Abteilung Finanzen</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>4</td>
<td>2</td>
<td>Franz Bauer</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
<td>2</td>
<td>Gundula Gerber</td>
</tr>
<tr>
<td>5</td>
<td>7</td>
<td>8</td>
<td>2</td>
<td>Helga Wichtig</td>
</tr>
</table>
<h3>Wozu wird die parent_id verwendet?</h3>
<p>Um schnell alle Kinderknoten eines Knotens selektieren zu können, wurde die parent_id mit eingebunden. Für das native MPTT wird das nicht benötigt.<br />
Wie du sehen kannst, handelt es sich bei der Abbildung in der Datenbank um eine flache Tabelle. Diese Struktur kann selektiert und in Arrays abgelegt durchlaufen werden.<br />
Falls du mal einen etwas komplexeren Baum kreieren willst, dann mach das nicht von Hand. Du verzählst dich garantiert!<br />
Es ist der Horror diese Datenstruktur &#8220;zu Fuß&#8221; zu befüllen.<br />
Bei CakePHP übernimmt dies vollumfänglich das entsprechende Modell. Und das ist auch vernünftig so.<br />
Diese Art von Bäumen abzubilden ist für den lesenden Zugriff sehr schnell. Das liegt daran, dass eine flache Hierachie hinterlegt wurde, die durch eine lineare Iteration durchlaufen werden kann.<br />
Das Einfügen von neuen Knoten irgendwo im Modell bedingt jedoch einige Updates. Alle anderen Knoten müssen entsprechend angepasst werden. Somit ist diese Baumstruktur Darstellung nicht sehr sinnvoll, falls du viele Updates und Inserts hast.<br />
Bei Organigrammen, Navigationen usw. werden die Daten jedoch häufiger gelesen als geschrieben. In solchen Fällen ist das MPTT eine coole Sache.</p>
<h3>Fazit</h3>
<p>Als ich meinen ersten Baum in CakePHP aufgebaut habe, bin ich fast verzweifelt. Das MPTT ist ein einfaches Pattern. Aber wenn man nicht weiß wie man es bedienen muss, oder wenn man glaubt man kann es von Hand betreuen, dann geht man unter. Die Befüllung sollte nur über entsprechende Automaten erfolgen.<br />
Im täglichen Gebrauch ist dieses Pattern sehr angenehm zu verwenden. Seit ich dieses Pattern verwende, sind meine Navigationen deutlich dynamischer und einfach zu verändern. Natürlich nur über eine entsprechende Oberfläche <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/mptt-modified-preorder-tree-traversal/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factory- und Adapter Pattern für die Erweiterung von WordPress</title>
		<link>http://www.baldenhofer.eu/blog/it/factory-und-adapter-pattern-fuer-die-erweiterung-von-wordpress</link>
		<comments>http://www.baldenhofer.eu/blog/it/factory-und-adapter-pattern-fuer-die-erweiterung-von-wordpress#comments</comments>
		<pubDate>Wed, 03 Jun 2009 16:41:32 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[bcd09]]></category>
		<category><![CDATA[buddyPress]]></category>
		<category><![CDATA[FuCamp]]></category>
		<category><![CDATA[Newssystem]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[WordPress MU]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=1314</guid>
		<description><![CDATA[Ich habe gestern im Artikel Ist das Newssystem einfach nur eine View auf eine Blogsoftware darüber gegrübelt dass ich mit dem Newssystem eigentlich nur eine Erweiterung von WordPress beschrieben habe. Vermutlich trifft das Newssystem am ehesten auf WordPress MU oder BuddyPress zu. Aber schlussendlich ist es nichts weiter als WordPress ein bisschen anders angesteuert und [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe gestern im Artikel <a href="http://www.baldenhofer.eu/blog/it/ist-das-newssystem-einfach-nur-eine-view-auf-eine-blogsoftware">Ist das Newssystem einfach nur eine View auf eine Blogsoftware</a> darüber gegrübelt dass ich mit dem Newssystem eigentlich nur eine Erweiterung von WordPress beschrieben habe.<br />
Vermutlich trifft das Newssystem am ehesten auf WordPress MU oder BuddyPress zu. Aber schlussendlich ist es nichts weiter als WordPress ein bisschen anders angesteuert und dargestellt.</p>
<h3>Was für Erkenntnisse habe ich heute?</h3>
<p>Ich habe mittlerweile erkannt, dass ich am Wochenende am Barcamp in Dornbirn locker über die Modularisierung und Benutzung von bestehenden Systemen sprechen kann.<br />
Am Beispiel des Newssystems müssen vermutlich nur </p>
<ul>
<li>Ein Endedatum, an dem die News (der Artikel) nicht mehr dargestellt werden darf.</li>
<li>Eine einfache Eingabe für die News, also keine komplette WordPress Eingabe sondern wirklich nur Titel und Beschreibung sowie Start- und Endedatum.</li>
<li>Einige Views, mit denen die News Einträge überall ohne das komplette WordPress Verhalten angezeigt werden können. Dies kann über RSS Feeds oder über explizit entwickelte Views erreicht werden.</li>
</ul>
<h3>Wie könnte man WordPress entsprechend einbinden?</h3>
<p>Nichts leichter als das!<br />
Wir nehmen eine Factory Klasse, die uns für die unterschiedlichen WordPress Versionen die entsprechenden Adapterklassen anzieht.<br />
Auf diese Weise sind wir vom WordPress entkoppelt und erhöhen nicht die Komplexität bei einem Update.<br />
Das Ganze könnte ungefähr so aussehen:<br />
<img src="/images/blog/buddypress/Adapter.png" alt="Adapter um WordPress oder BuddyPress Komponenten zu kapseln" /><br />
Ich erstelle einen Adapter, oder eventuell eine Fassade, mit der die Komponenten von WordPress oder BuddyPress an mein eigenes System angepasst werden.<br />
Da sich während eines WordPress Updates die Schnittstellendefinition verändern kann, wird pro WordPress Version ein dafür notwendiger Adapter oder Fassade geschrieben.<br />
Falls sich nichts ändert, kann natürlich der gleiche Adapter verwendet werden.<br />
Über eine Fabrikklasse kann die im Moment aktive Adapterklasse instanziiert und zurückgeliefert werden.<br />
Die Fabrikklasse kann relativ einfach die Version des aktuell verwendeten WordPress auslesen und entsprechend den richtigen Adapter zurückliefern.<br />
Cool oder?</p>
<h3>Wie sieht es mit der Komplexität aus?</h3>
<p>Auf dem <a href="http://fucamp.mixxt.de/">Fucamp</a> in Furtwangen habe ich über <a href="http://www.baldenhofer.eu/blog/guggat_emol/fucamp-erste-session-komplexitaet-verwalten>Komplexität</a> gesprochen.<br />
Wenn wir unsere eigenen Entwicklungen von den doch schon relativ komplexen WordPress oder BuddyPress Systemen entkoppeln, können wir hier stabile Systeme erstellen.<br />
Wir nehmen die Komplexität heraus, da wir gegen Interfaces programmieren.<br />
Das ist schon mal besser als noch mehr in schon bestehende Systeme einzubauen.</p>
<h3>Was können wir noch machen?</h3>
<p>Wir können, beispielsweise, die Userverwaltung aus WordPress auslagern.<br />
Das ist sinnvoll, falls wir weitere Systeme auf der gleichen Webapplikation verwenden wollen. Falls du also ansonsten dich zweimal auf der Webseite authentisieren müsstest, könnte dies von einer zentralen Komponente durchgeführt werden.<br />
Über unsere Fassaden / Adapter Lösung können wir dann z.B. Befehle schreiben. Wir können mit einem Befehlspattern (Command Pattern) relativ einfach und generisch die Login Prozedur aus WordPress ausgliedern.<br />
Somit können wir verschiedene komplexe und gute Applikationen miteinander verbinden.</p>
<h3>Was gefällt mir an dieser Lösung am Meisten?</h3>
<p>Ich finde diese Lösung so gut, da wir keine wiederverwendbaren Klassen und anderes Zeugs schreiben müssen. Wir können komplette Applikationen als Module ansehen und die guten Eigenschaften der Applikationen mitnutzen.<br />
Der bittere Beigeschmack der Wiederverwendbarkeit fällt weg.<br />
Leider hat in den letzten Jahren der Hype wiederverwendbare Software zu erstellen nachgelassen. Ich würde sagen, zum Glück hat der nachgelassen. Wir haben viel Zeit und Energie in die universellen Klassen gesteckt und eigentlich sehr häufig sehr wenig erreicht.<br />
Wenn wir bestehende Applikationen miteinander (entkoppelt) verbinden, können wir durch sinnvolle Komposition viel erreichen. </p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/factory-und-adapter-pattern-fuer-die-erweiterung-von-wordpress/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Newssystem]]></series:name>
	</item>
		<item>
		<title>Adapter Pattern als Antipattern</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-als-antipattern</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-als-antipattern#comments</comments>
		<pubDate>Sat, 18 Apr 2009 06:24:01 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Adapter]]></category>
		<category><![CDATA[Antipattern]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=764</guid>
		<description><![CDATA[Falls nur eine Interface Erweiterung benötigt wird, um eine Funktion für weitere Zwecke zu verwenden, ist das Adapter Pattern ein Overkill. Sehr häufig werden Adapter eingeführt ohne über die hiermit generierte Komplexität nachzudenken. Adapter für Adapter Eine weitere Falle ist, wenn man einen Adapter für einen Adapter baut. Einmal hatte mein Team ein Stück Code [...]]]></description>
			<content:encoded><![CDATA[<p>Falls nur eine Interface Erweiterung benötigt wird, um eine Funktion für weitere Zwecke zu verwenden, ist das Adapter Pattern ein Overkill. Sehr häufig werden Adapter eingeführt ohne über die hiermit generierte Komplexität nachzudenken.</p>
<h3>Adapter für Adapter</h3>
<p>Eine weitere Falle ist, wenn man einen Adapter für einen Adapter baut.<br />
Einmal hatte mein Team ein Stück Code übernommen und wir haben uns über die extreme Verkettung von Klassen gewundert. Wir kontrollierten das und fanden heraus, dass FÜNF Adapter hintereinander geschalten wurden um Funktionswerte zu maskieren. In dem Fall kann ich vom Adapter Pattern wirklich nur abraten und ein Refacturing vorschlagen <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Refacturing bedeutet hier, die fünf Adapter zu entfernen und die Interfaces aufzuräumen.<br />
Übrigens, beim Aufräumen konnte mein Team die Anzahl der Klassen von über 500 auf ca. 300 reduzieren. Danach sah das ganze System relativ übersichtlich aus.<br />
Wir waren sogar wieder in der Lage die Komplexität zu überschauen und eine gewisse Stabilität zu erzeugen.</p>
<h3>High Performance Anwendungen</h3>
<p>Wenn du eine extrem stark beanspruchte Komponente hast, ist das Adapter Pattern auch keine gute Lösung. Zum Beispiel in Realzeitsystemen blockiert dir der Adapter die Verarbeitung. Du kannst meistens nicht genau sagen wie lange ein Aufruf und die Initialisierung des Adapters dauert. Er erhöht die Komplexität des Systems und kann dir somit ziemlich viele Schwierigkeiten machen. Also sei bei Realzeit- oder Komponenten die extrem häufig verwendet werden, mit Adaptern vorsichtig.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-als-antipattern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Adapter Pattern Einsatzbereiche</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-einsatzbereiche</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-einsatzbereiche#comments</comments>
		<pubDate>Wed, 15 Apr 2009 08:59:51 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Adapter]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=762</guid>
		<description><![CDATA[Das Adapter Pattern findest du an ziemlich vielen Orten. Immer dann, wenn ein &#8220;altes&#8221; auf ein &#8220;neues&#8221; System stößt und die Schnittstellen nicht zusammen passen wollen ist das Adapter Pattern, zusammen mit dem Facade Pattern einen Blick wert. Der Unterschied zwischen Adapter und Facade ist, dass eine Facade Komplexität versteckt. Ein Adapter wird eigentlich immer [...]]]></description>
			<content:encoded><![CDATA[<p>Das Adapter Pattern findest du an ziemlich vielen Orten. Immer dann, wenn ein &#8220;altes&#8221; auf ein &#8220;neues&#8221; System stößt und die Schnittstellen nicht zusammen passen wollen ist das Adapter Pattern, zusammen mit dem <a href="http://www.baldenhofer.eu/blog/it/design-pattern-it/facade-pattern-problemstellung">Facade Pattern</a> einen Blick wert. Der Unterschied zwischen Adapter und Facade ist, dass eine Facade Komplexität versteckt. Ein Adapter wird eigentlich immer nur auf eine Klasse angewendet und nur dazu verwendet eine Umwandlung durchzuführen.<br />
Beispiele:</p>
<ul>
<li>Umwandlung eines DOM XML Dokuments in ein JSON Array</li>
<li>Anpassung bestehender Interfaces um neue Klassen darauf zugreifen zu lassen.</li>
<li>Anpassung von Funktionsübergabewerten um z.B. mit weniger Übergabeparametern dennoch eine entsprechende Funktion aufzurufen</li>
</ul>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-einsatzbereiche/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Adapter Pattern Deklaration</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-deklaration</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-deklaration#comments</comments>
		<pubDate>Fri, 10 Apr 2009 19:00:00 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Adapter]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=760</guid>
		<description><![CDATA[Das Adapter Pattern ist relativ einfach deklariert. Unser Adapter muss zwischen die miteinander zu verbindenden Interfaces eingeschoben werden. Meistens muss es noch aktiv Daten anpassen, damit die unterschiedlichen Interfaces sich auch verstehen können. Beispielsweise kann das eine Interface ein Datum in String Form liefern und die Consumer Klasse erwartet ein Datum im UNIX-Timestamp Format als [...]]]></description>
			<content:encoded><![CDATA[<p>Das Adapter Pattern ist relativ einfach deklariert.<br />
Unser Adapter muss zwischen die miteinander zu verbindenden Interfaces eingeschoben werden. Meistens muss es noch aktiv Daten anpassen, damit die unterschiedlichen Interfaces sich auch verstehen können.<br />
Beispielsweise kann das eine Interface ein Datum in String Form liefern und die Consumer Klasse erwartet ein Datum im UNIX-Timestamp Format als Integer. Hier wird unser Adapter den String in einen Integer umwandeln und übergeben.<br />
<img alt="Adapter Beispiel für String-Integer Konvertierung" src="/images/blog/pattern/Adapter.png" /><br />
Du kannst Adapter immer nach diesem Strickmuster zusammenbauen.<br />
Die klugen Menschen, die wikipedia befüllen, haben das Adapter Pattern noch etwas tiefgründiger beschrieben. Du kannst im <a href="http://en.wikipedia.org/wiki/Adapter_pattern">Adapter Pattern Artikel</a> noch mehr darüber erfahren.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-deklaration/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Adapter Pattern Problemstellung</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-problemstellung</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-problemstellung#comments</comments>
		<pubDate>Tue, 07 Apr 2009 18:50:40 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Adapter]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=758</guid>
		<description><![CDATA[In unserer dreidimensionalen, normalen Welt, sind Adapter etwas völlig normales. Fahr mal in die Schweiz und versuch den Stecker deines Föns in eine Steckdose reinzuwürgen. Oder nehme den Fön mit nach England und versuch es mal da. Unsere Stecker passen nicht in die Schweizer oder Englischen Steckdosen. Und was haben die klugen Elektrotechniker mit dem [...]]]></description>
			<content:encoded><![CDATA[<p>In unserer dreidimensionalen, normalen Welt, sind Adapter etwas völlig normales. Fahr mal in die Schweiz und versuch den Stecker deines Föns in eine Steckdose reinzuwürgen. Oder nehme den Fön mit nach England und versuch es mal da.<br />
Unsere Stecker passen nicht in die Schweizer oder Englischen Steckdosen.<br />
Und was haben die klugen Elektrotechniker mit dem Problem gemacht?<br />
Richtig, sie haben in endlosen Stunden das Adapter Pattern erfunden <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Sie haben für unsere Stecker einen Adapter gebaut der auf der einen Seite die Form (das <a href="http://www.baldenhofer.eu/blog/it/programmieren/gegen-schnittstellen-interfaces-programmieren">Interface</a>) unserer Steckdosen hat. Auf der anderen Seite haben sie einen Stecker (das weitere Interface) erstellt, dass in die Englische Steckdose reinpasst. </p>
<h3>Schöne Geschichte und wozu braucht ein Informatiker einen Adapter?</h3>
<p>Wenn wir uns nicht gerade in einem Schulungsblog aufhalten, bauen wir nicht alle Systeme selbst. Normalerweise möchtest du deine Klasse an ein schon bestehendes Interface anschließen. Und manchmal kommt es dann vor, dass die beiden Interfaces nicht die gleiche Definition haben. Du musst entweder dein Interface anpassen oder einen Adapter zwischen die bestehenden Interfaces einfügen.<br />
Sehr häufig verbinden wir zwei schon vorhandene Applikationen miteinander. Die Applikationen wurden erstellt, die Interfaces deklariert und getestest.<br />
Niemand möchte hergehen und zum Beispiel Microsoft Word Programmteile anpassen um eine Erweiterung für ein daran anzuschliessendes Archivsystem zu erstellen. Das wäre wirklich kontraproduktiv. Wir werden zwischen dem Archivsystem und dem Word einen Adapter einführen.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/adapter-pattern-problemstellung/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Observer Pattern als Antipattern</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-als-antipattern</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-als-antipattern#comments</comments>
		<pubDate>Fri, 03 Apr 2009 05:09:54 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Antipattern]]></category>
		<category><![CDATA[Observer]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=784</guid>
		<description><![CDATA[Mit dem Observer Pattern können wir die Observer bei Änderungen des Subjekts informieren. Das ist prinzipiell eine super Sache. Wenn du jedoch ein Subjekt mit hunderten von Observern verknüpfst, wirst du sehr bald Geschwindigkeitseinbusen erfahren. Ein Beispiel aus meiner Spielkiste Ich erstellte mal eine dynamische HTML Generierung, die bei jeder Änderung des Modells informiert wurde. [...]]]></description>
			<content:encoded><![CDATA[<p>Mit dem Observer Pattern können wir die Observer bei Änderungen des Subjekts informieren. Das ist prinzipiell eine super Sache. Wenn du jedoch ein Subjekt mit hunderten von Observern verknüpfst, wirst du sehr bald Geschwindigkeitseinbusen erfahren.</p>
<h3>Ein Beispiel aus meiner Spielkiste</h3>
<p>Ich erstellte mal eine dynamische HTML Generierung, die bei jeder Änderung des Modells informiert wurde. Die Texte innerhalb der Modelle änderten sich beim Aufruf des betroffenen Anwendungsfalls mehrfach. Der Aufruf der Observer führte dazu, dass das zu generierende HTML Dokument mehrfach aufgebaut und verändert wurde. Und der Aufbau des HTML Dokuments führte zu einer grotten langsamen Reaktionszeit. Ich baute komplexe Tabellen mit dieser Vorgehensweise zusammen. Beim Aufbau der Tabellen ist mir dann das Gesicht eingeschlafen. Zu viele Mitteilungen können das System blockieren.</p>
<h3>Welche Gegenmassnahme rettete mich?</h3>
<p>Abhilfe fand ich, indem ich die Textänderungen erst in die Modelle einfügte und dann nach der vollständigen Bearbeitung die Werte aus den Modellen übernahm. Mein Observer Pattern war dann auf Stufe Anwendungsfall eingesetzt. Sobald der Anwendungsfall komplett abgearbeitet wurde, konnte ich mit einem einzigen Zugriff die komplexen HTML Tabellen aufbauen.</p>
<h3>Tipp</h3>
<p>Falls du viele Änderungen auf dem Subjekt hast, und dir die Geschwindigkeit in den Keller geht, solltest du die notify() Methode überdenken und eventuell eine andere Art der Benachrichtigung verwenden.<br />
Design Pattern sind dazu da dir das Leben zu erleichtern. Ein geiles Design muss jedoch immer noch funktionieren.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-als-antipattern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Observer Pattern Deklaration</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-deklaration</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-deklaration#comments</comments>
		<pubDate>Wed, 01 Apr 2009 10:04:58 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Observer]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=782</guid>
		<description><![CDATA[Im Observer Pattern Problemstellung habe ich über die Benachrichtigung des Observers durch das Subjekt erwähnt. Lass uns das mal im Klassenmodell ansehen: Da hab ich aber schön ein Klassenmodell aus dem Internet abgepinselt gelle? Im Internet wimmelt es von diesen Diagrammen. Aber ich habe mich entschieden dieses Diagramm dennoch einmal mehr zu zeichnen. Wie funktioniert [...]]]></description>
			<content:encoded><![CDATA[<p>Im <a href="http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-problemstellung">Observer Pattern Problemstellung</a> habe ich über die Benachrichtigung des Observers durch das Subjekt erwähnt.<br />
Lass uns das mal im Klassenmodell ansehen:<br />
<img alt="Observer Klassenmodell" src="/images/blog/pattern/Observer.png" /><br />
Da hab ich aber schön ein Klassenmodell aus dem Internet abgepinselt gelle?<br />
Im Internet wimmelt es von diesen Diagrammen. Aber ich habe mich entschieden dieses Diagramm dennoch einmal mehr zu zeichnen.<br />
Wie funktioniert das Ganze jetzt?<br />
Wir haben eine Interface Deklaration, die uns eine Methode update() bereitstellt. Jeder Observer muss dieses Interface implementieren.<br />
Auf der Subjekt-Seite wird normalerweise eine Basisklasse definiert, die folgende Methoden beinhaltet:</p>
<h4>add</h4>
<p>Fügt einen Observer (Beobachter) in die interne Liste hinzu. Die registrierten Observer werden später bei Änderungen aufgerufen.</p>
<h4>remove</h4>
<p>Ein zuvor hinzugefügter Observer wird wieder entfernt und nicht mehr informiert.</p>
<h4>notify</h4>
<p>Wenn eine Änderung im Subjekt stattgefunden hat, wird mit notify jeder Observer über diese Änderung informiert.</p>
<h3>Sequenzdiagramm zum Observer-Pattern</h3>
<p>Um den Ablauf ein bisschen besser verstehen zu können, habe ich hier ein Sequenzdiagramm gemalt.<br />
<img alt="Sequenzdiagramm um den Observerablauf zu beschreiben" src="/images/blog/pattern/ObserverSequenz.png" /><br />
Zuerst registriert sich der Observer mit add() am Subjekt.<br />
Das Subjekt erfährt zwei Änderungen die es mit update() dem Observer mitteilt.<br />
Mit remove() entfernt sich der Observer wieder vom Subjekt und keine weiteren update() Meldungen werden an den Observer übergeben.</p>
<h3>Beispiel mit konkreten Klassen</h3>
<p>Die in <a href="http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-problemstellung">Observer Pattern Problemstellung</a> gezeigten Klassen können in unserem Observer Pattern wie im Folgenden gezeigt eingebaut werden.<br />
<img alt="Obser Demonstration" src="/images/blog/pattern/ObserverDemo.png" /><br />
Die einzelnen Observer (View Klassen) registrieren sich jeweils mit add() am Subjekt. Das Subjekt informiert die Observer über die update() Methode, wenn sich etwas im Subjekt verändert hat.<br />
In diesem Demo habe ich immer noch die Observer und das Subjekt direkt miteinander verbunden. Wie bei Gegen Interfaces Programmieren festgestellt, sind wir mit dieser Lösung noch nicht voneinander entkoppelt. Das Observer Pattern beschreibt nur die Registrierung der Observer und die Mitteilung bei Subjektänderung an die Observer. Die Entkopplung von Subjekt und Observer findet nur in soweit statt, dass die Observer sich hinter einem Interface verstecken.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-deklaration/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Observer Pattern Problemstellung</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-problemstellung</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-problemstellung#comments</comments>
		<pubDate>Tue, 31 Mar 2009 07:13:30 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Observer]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=780</guid>
		<description><![CDATA[Stell dir vor du baust ein Modell um zu einer Person bestimmte Daten abzuspeichern. Um die Daten des Modells schön darstellen zu können erstellst du diverse Ansichst (View) Klassen. Jetzt musst du irgendwie auf die Personendaten zugreifen können. Wir könnten also einen Unsinn, wie hier dargestellt, erstellen: Superdoof oder? Ich habe mich ja im Gegen [...]]]></description>
			<content:encoded><![CDATA[<p>Stell dir vor du baust ein Modell um zu einer Person bestimmte Daten abzuspeichern.<br />
Um die Daten des Modells schön darstellen zu können erstellst du diverse Ansichst (View) Klassen.<br />
Jetzt musst du irgendwie auf die Personendaten zugreifen können.<br />
Wir könnten also einen Unsinn, wie hier dargestellt, erstellen:<br />
<img alt="Zugriff auf Daten ohne Observer" src="/images/blog/pattern/AccessWithoutObserve.png" /><br />
Superdoof oder?<br />
Ich habe mich ja im <a href="http://www.baldenhofer.eu/blog/it/programmieren/gegen-schnittstellen-interfaces-programmieren">Gegen Schnittstellen (Interfaces) Programmieren</a> schon ziemlich über solche Konstrukte ausgelassen gelle?<br />
Aber in dem Fall ist es noch schlimmer. Wir haben nicht nur gegen konkrete Implementierungen programmiert, nein wir haben uns auch noch ein paar andere Schwierigkeiten eingehandelt.</p>
<h3>Keine Benachrichtigung bei Datenänderung</h3>
<p>Unser PersonenModell lebt ein einsames und langweiliges Dasein.<br />
Immer wenn jemand etwas von ihm will, wird es aufgerufen. Es kann sich nicht mit den anderen Objekten unterhalten.<br />
Vermutlich wird es vereinsamen und den Job wechseln <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Spaß beiseite. Ein Problem ist, dass bei einer Veränderung der Personendaten die umliegenden Objekte nicht informiert werden. Wenn also das EditPersonView Objekt Daten an das PersonModell Objekt übergibt, werden die ListNamesView, ShowPersonView und ShowPersonAgeView Objekte davon nicht informiert.<br />
Wir könnten natürlich hergehen und unsere Objekte dazu verdonnern, alle paar Sekunden auf das PersonModel zuzugreifen.<br />
Aber zum Einen kriegen wir so keine sofortige Information von einem Change mit und unser Overhead im Aufrufen wird relativ massiv. Wir verbrennen kostbare CPU Zeit.</p>
<h3>Keine Entkopplung der Systeme</h3>
<p>Ok, wir programmieren nicht nur nicht gegen Interfaces sondern können unsere Daten und Ansichten nicht voneinander trennen. Falls wir das PersonModell mal austauschen wollen, muss das in allen darauf zugreifenden Objekten bekannt gemacht werden.<br />
Das wird richtig lustig, wenn du dann den Code von deinem Kollegen übernehmen darfst. Du wirst ihn für solch einen Pfusch lieben <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Was macht das Observer Pattern besser?</h3>
<p>Mit dem Observer Pattern werden die Modelle von der Ansicht entkoppelt.<br />
Die Ansichtsobjekte (die Observer) registrieren sich an dem zu überwachenden Modell (dem Subjekt).<br />
Observer wird in Deutsch als Beobachter übersetzt. Die Ansichtsobjekte beobachten somit das Subjekt.<br />
Immer wenn eine Eigenschaft sich im Modell ändert, wird diese Information den<br />
registrierten Observer mitgeteilt.</p>
<p>Hier noch zwei Links die Observer etwas detaillierter erklären. Ich werde natürlich noch die Deklaration und die mit Observer möglichen Antipattern erläutern.<br />
<a href="http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)">Observer Wiki</a><br />
<a href="http://www.techfak.uni-bielefeld.de/~dstoesse/SeminarDesignPatterns/Observer_Handout.pdf">Schöne Seminararbeit zu diesem Thema</a></p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/observer-pattern-problemstellung/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Wann wird das Fassaden Pattern zum Antipattern?</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/wann-wird-das-fassaden-pattern-zum-antipattern</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/wann-wird-das-fassaden-pattern-zum-antipattern#comments</comments>
		<pubDate>Fri, 27 Mar 2009 04:57:44 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[antipatterns]]></category>
		<category><![CDATA[facade]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=675</guid>
		<description><![CDATA[Schade, jetzt haben wir endlich mal ein Pattern gesehen mit dem man komplizierte Sachen verstecken können und ich möchte schon wieder meckern Wie bei allen schönen Sachen im Leben machen Fassaden Pattern manchmal ziemlich dick. Wenn du in deinen Programmen alles kapselst und hinter eine Fassade versteckst, wirst du vor lauter Fassaden den Programmcode nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Schade, jetzt haben wir endlich mal ein Pattern gesehen mit dem man komplizierte Sachen verstecken können und ich möchte schon wieder meckern <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Wie bei allen schönen Sachen im Leben machen Fassaden Pattern manchmal ziemlich dick.<br />
Wenn du in deinen Programmen alles kapselst und hinter eine Fassade versteckst, wirst du vor lauter Fassaden den Programmcode nicht mehr finden.<br />
Es ist zwar prinzipiell gut, komplexe Abläufe zu kapseln und zu verstecken, doch auch hier sollte mit Vorsicht herangegangen werden.<br />
Mach nie zu viele Fassaden. Sie sollten wirklich komplexe Abläufe und die dazugehörigen Objekte verstecken. Und es sollte auch nur dann gemacht werden, wenn du die Fassade öfters verwendest. Ein schlecht strukturierter Code wird durch eine Fassade schlussendlich nicht besser lesbar.<br />
Ich hatte einmal in einem online Webshop in der Mitte eine Riesenklasse, die alle anderen Klassen versteckte. Nach einer Weile mussten wir immer mehr Fassaden um die Fassaden herumwickeln um an die benötigte Funktionalität heranzukommen. Wir bauten einen sogenannten Lava Code. Das bedeutet, dass wir immer mehr alten, nicht mehr benötigten Code, hatten. Niemand traute sich jedoch an den alten Code heran, da jeder befürchtete, dass der Code nicht mehr richtig funktioniert wenn wir ihn ändern. Stattdessen wurden weitere Fassaden eingebaut.<br />
Wenn dir so etwas über den Weg läuft gibt es nur eines:<br />
Aufräumen.<br />
Putze deinen Code, kontrolliere was du wie anders kapseln kannst und geh mit Revers Engineering an die Sache heran. Ansonsten wird es wirklich hässlich.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/wann-wird-das-fassaden-pattern-zum-antipattern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>Asynchrone Kommunikation mit JavaScript und Facade Pattern</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/asynchrone-kommunikation-mit-javascript-und-facade-pattern</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/asynchrone-kommunikation-mit-javascript-und-facade-pattern#comments</comments>
		<pubDate>Thu, 26 Mar 2009 05:18:02 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[facade]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=671</guid>
		<description><![CDATA[Bei AJAX muss, unter Anderem, eine asynchrone Kommunikation mit dem Server stattfinden. Sonst ist es ja kein Asynchronous JavaScript and XML gelle? Man kann nun die Kommunikation ziemlich mies in jedes JavaScript reinwursteln und so eine Kommunikation mit dem Server anfangen. Man kann aber auch die Komplexität dieser Kommunikation vor dem eigentlichen Entwickler verstecken und [...]]]></description>
			<content:encoded><![CDATA[<p>Bei AJAX muss, unter Anderem, eine asynchrone Kommunikation mit dem Server stattfinden. Sonst ist es ja kein<a href="http://de.wikipedia.org/wiki/Ajax_(Programmierung)"><strong> A</strong>synchronous <strong>J</strong>avaScript <strong>a</strong>nd <strong>X</strong>ML<br />
</a> gelle?</p>
<p>Man kann nun die Kommunikation ziemlich mies in jedes JavaScript reinwursteln und so eine Kommunikation mit dem Server anfangen.</p>
<p>Man kann aber auch die Komplexität dieser Kommunikation vor dem eigentlichen Entwickler verstecken und das Fassaden Pattern anwenden.</p>
<p>Ich habe hier ein Beispiel zusammengebaut bei dem du mit folgenden JavaScript Code eine Kommunikation mit dem Server durchführen kannst:</p>
<div class="geshi no javascript">
<div class="head">/**</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">*</span> Ruft den Server auf um ihn um eine Antwort zu bitten.</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="me1">*</span><span class="sy0">/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> onInitialLoad<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">asyncCommunication</span> = <span class="kw2">new</span> AsyncCommunication<span class="br0">&#40;</span>showHello<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&quot;message&quot;</span><span class="br0">&#41;</span>.<span class="me1">innerHTML</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; = <span class="st0">&quot;Der Server sagt noch nix&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; asyncCommunication.<span class="me1">callServer</span><span class="br0">&#40;</span><span class="st0">&quot;http://www.baldenhofer.eu/programmieren/serverResponse.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Callback Funktion.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> showHello<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; request = <span class="kw1">this</span>.<span class="me1">request</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&quot;message&quot;</span><span class="br0">&#41;</span>.<span class="me1">innerHTML</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; = <span class="st0">&quot;Der Server sagt: &quot;</span>+request.<span class="me1">responseText</span>+<span class="st0">&quot; zu dir&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In diesem Beispiel wird eine HTML Seite erwartet in der irgendwo ein Element mit der ID <strong>message</strong> vorkommt.<br />
Wenn das Dokument geladen wird, habe ich die onInitialLoad() Funktion aufgerufen.<br />
Diese Funktion schreibt zuerst einmal in das message Element den Text &#8220;Der Server sagt noch nix&#8221;.<br />
Weiterhin wird mit</p>
<div class="geshi no javasript">
<div class="head">this.asyncCommunication = new AsyncCommunication(showHello);</div>
<ol>
<li class="li1">
<div class="de1">asyncCommunication.callServer(&quot;http://www.baldenhofer.eu/programmieren/serverResponse.php&quot;);</div>
</li>
</ol>
</div>
<p>Auf dem Webserver ein Antwortdokument aufgerufen.<br />
Damit das Ganze noch irgendwie einen dynamischen Text vom Server lädt, habe ich ein kleines Testscript mit dem fantastischen Namen serverResponse.php erstellt. Da drin steht ein echo &#8220;hallo Welt!&#8221;;<br />
Der Server gibt also &#8220;hallo Welt&#8221; zurück.<br />
Und wenn die ganze asynchrone Kommunikation klappt, wird die Callback Funktion showHello() aufgerufen.<br />
Diese Funktion habe ich zuvor in der onInitialLoad beim Konstruktor mit übergeben.</p>
<h3>Was haben wir jetzt davon?</h3>
<p>Schau dir mal ein paar AJAX Kommunikationsbeispiele im Internet an. Du wirst tonnenweise Code usw. finden. Der Code ist relativ komplex und wenn er überall in deinem Programm dupliziert wird, nicht gerade wartungsfreundlich.<br />
Ich habe den Code in einer Klasse gekapselt und somit die Komplexität auf diese Klasse reduziert. Immer wenn ich eine asynchrone Kommunikation mit dem Server durchführen will, kann ich diese allgemeingültige Klasse aufrufen und diese versteckt mir den komplexen Code.<br />
Das bedeutet, diese Klasse bildet eine Fassade die mir die Komplexität versteckt.</p>
<h3>Beispielcode für die Fassade</h3>
<p>Hier ist der Beispielcode mit dem man die asynchrone Kommunikation durchführen kann.</p>
<div class="geshi no javascript">
<div class="head">/**</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">*</span> Diese Klasse verwaltet die asynchrone Kommunikation zum Webserver.</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="me1">*</span> <span class="sy0">@</span>param callBackFunc Die Funktion die nach der vollständigen.</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="me1">*</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Übertragung vom Webserver aufgerufen werden soll.</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="me1">*</span><span class="sy0">/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> AsyncCommunication<span class="br0">&#40;</span>callBackFunc<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Angabe, dass die Kommunikation zum Webserver vollständig</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// abgeschlossen wurde.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">READY_STATE_COMPLETE</span> = <span class="nu0">4</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Angabe der callBack Funktion die bei Reaktionen vom Webserver</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// aufgerufen werden soll.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">callBackFunction</span> = callBackFunc;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Das Request Objekt</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">request</span> = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Funktion um den gewünschten Request zum Webserver absetzen zu können.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @param url Der URL, der aufgerufen werden soll.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">AsyncCommunication.<span class="me1">prototype</span>.<span class="me1">callServer</span> = <span class="kw2">function</span><span class="br0">&#40;</span>url<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>window.<span class="me1">XMLHttpRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">request</span> = <span class="kw2">new</span> XMLHttpRequest<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>window.<span class="me1">AcitiveXObject</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">request</span> = <span class="kw2">new</span> ActiveXObject<span class="br0">&#40;</span><span class="st0">&quot;Microsoft.XMLHTTP&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">request</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> loader=<span class="kw1">this</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">request</span>.<span class="me1">onreadystatechange</span>=<span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loader.<span class="me1">callBack</span>.<span class="me1">call</span><span class="br0">&#40;</span>loader<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">request</span>.<span class="kw3">open</span><span class="br0">&#40;</span><span class="st0">&#39;GET&#39;</span>, url, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">request</span>.<span class="me1">send</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">catch</span><span class="br0">&#40;</span>err<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Webserveraufruf voll schief gange!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Ruft nach der Rückgabe vom Server die zuvor deklarierte Callback</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Funktion auf.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">AsyncCommunication.<span class="me1">prototype</span>.<span class="me1">callBack</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">request</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> readyState = <span class="kw1">this</span>.<span class="me1">request</span>.<span class="me1">readyState</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>readyState == <span class="kw1">this</span>.<span class="me1">READY_STATE_COMPLETE</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">callBackFunction</span>.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Du siehst, innerhalb dieser Klasse habe ich die Initialisierung des Kommunikationsobjektes, die eigentliche Kommunikation und die Callback Funktion mit der Überprüfung der Rückgabewerte gekapselt.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/asynchrone-kommunikation-mit-javascript-und-facade-pattern/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
		<item>
		<title>AJAX Kommunikation ohne Fassaden Pattern</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/ajax-kommunikation-ohne-facade-pattern</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/ajax-kommunikation-ohne-facade-pattern#comments</comments>
		<pubDate>Wed, 25 Mar 2009 15:38:25 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=655</guid>
		<description><![CDATA[Du möchtest mit JavaScript eine asynchrone Kommunikation mit dem Webserver durchführen. Das möchtest du tun um zum Beispiel die aktuellen Fußballergebnisse, ohne einen Reload Button drücken zu müssen, immer wieder darzustellen. Oder du möchtest einen Chat programmieren und da wäre es doch auch vernünftig, wenn dich dass System immer wieder informieren würde wenn dein Chatpartner [...]]]></description>
			<content:encoded><![CDATA[<p>Du möchtest mit JavaScript eine asynchrone Kommunikation mit dem Webserver durchführen. Das möchtest du tun um zum Beispiel die aktuellen Fußballergebnisse, ohne einen Reload Button drücken zu müssen, immer wieder darzustellen. Oder du möchtest einen Chat programmieren und da wäre es doch auch vernünftig, wenn dich dass System immer wieder informieren würde wenn dein Chatpartner etwas von sich gegeben hat.</p>
<p>Um mit dem Server kommunizieren (oder auf gut Schwäbisch schwätze) zu können, müssen wir uns ein <a href="http://www.w3schools.com/XML/xml_http.asp">XMLHttpRequest Objekt </a>für Firefox, Safari usw. erzeugen und für IEs brauchen wir ein ActiveXObject. Weiterhin müssen wir eine<a href="http://de.wikipedia.org/wiki/R%C3%BCckruffunktion"> Callback Funktion</a> an dieses XMLHttpRequest oder ActiveXObject anbinden um die <a href="http://de.wikipedia.org/wiki/Ajax_(Programmierung)#R.C3.BCckmeldung">Rückmeldung des Servers</a> verarbeiten zu können.</p>
<p>Ein möglicher Code könnte ungefähr so aussehen:</p>
<div class="geshi no javascript">
<div class="head">// Globale Variable mit der des Gschwätz (die Kommunikation)</div>
<ol>
<li class="li1">
<div class="de1"><span class="co1">// mit dem Webserver verwaltet wird.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> serverRequest;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Diese Konstante gibt an, dass die Kommunikation mit</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// dem Webserver erfolgreich beendet wurde.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> READY_STATE_COMPLETE=<span class="nu0">4</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Initialisiert das serverRequest Objekt um überhaupt</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* mit dem Server reden zu können.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Ich habe diese Art im Buch Ajax in Action gefunden.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Mir selbst gefällt diese Initialisierung mehr als die sonst</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* übliche try-catch Vorgehensweise wie beispielsweise unter</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* &lt;a href=&quot;http://www.admin-wissen.de/eigene-tutorials/webentwicklung/ajax-tutorial/einfuehrung-in-ajax/&quot;&gt;Einführung in Ajax&lt;/a&gt; beschrieben.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> initXMLHTTPRequest<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> request = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>window.<span class="me1">XMLHttpRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; request = <span class="kw2">new</span> XMLHttpRequest<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>window.<span class="me1">AcitiveXObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; request=<span class="kw2">new</span> ActiveXObject<span class="br0">&#40;</span><span class="st0">&quot;Microsoft.XMLHTTP&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> request;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Hiermit senden wir unseren Request vom Client an den Server.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> sendRequest<span class="br0">&#40;</span>url, params<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; serverRequest=initXMLHTTPRequest<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>serverRequest<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Wir müssen angeben welche Funktion mit den Daten</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// des Webservers umgehen soll.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; serverRequest.<span class="me1">onreadystatechange</span>=processAnswer;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; serverRequest.<span class="kw3">open</span><span class="br0">&#40;</span><span class="st0">&quot;GET&quot;</span>, url, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; serverRequest.<span class="me1">setRequestHandler</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type&quot;</span>, <span class="st0">&quot;application/x-www-form-urlencoded&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; serverRequest.<span class="me1">send</span><span class="br0">&#40;</span>params<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Hier kommt endlich unsere Funktion mit der wir</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* die Antwort des Servers verarbeiten.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> processAnswer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> ready = serverRequest;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ready==READY_STATE_COMPLETE<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// Unser super Fußball oder Chat Code&#8230;.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Diesen Code müssten wir immer in unsere Funktionen in so ähnlicher Weise reinfummeln. Wir hätten außerdem noch mit der globalen Variable diverse Schwierigkeiten. Stell dir vor du möchtest über die Fußballergebnisse auf der gleichen Seite chatten. Dann weist du unter Umständen nicht mehr, welche Antwort vom Server nun zum Fußball oder zum Chat gehört.</p>
<h3>Facade Pattern hierfür verwenden</h3>
<p>Wenn wir unseren Code nochmal anschauen, wäre eine Kapselung der ganzen Kommunikation gar nicht so schlecht.<br />
Wir könnten den ganzen Kommunikations- und Webserver Rückmeldungskram in ein dafür vorgesehenes <a href="http://www.baldenhofer.eu/blog/it/programmieren/objekte">Objekt</a> verbuddeln.<br />
Diesem Objekt geben wir im Konstruktor mit, welche Callback Funktion wir aufrufen wollen und welche URL verwendet werden soll.</p>
<p>Wir kapseln also die ganze Komplexität des Serveraufrufs und können dieses Objekt immer wieder verwenden ohne die Details des Serveraufrufs zu kennen.</p>
<p>Wie wir diese Klasse aufbauen erkläre ich in einem nächsten Artikel.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/ajax-kommunikation-ohne-facade-pattern/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[Programmieren]]></series:name>
	</item>
		<item>
		<title>Facade Pattern Problemstellung</title>
		<link>http://www.baldenhofer.eu/blog/it/design-pattern-it/facade-pattern-problemstellung</link>
		<comments>http://www.baldenhofer.eu/blog/it/design-pattern-it/facade-pattern-problemstellung#comments</comments>
		<pubDate>Wed, 25 Mar 2009 07:43:31 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[facade]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=654</guid>
		<description><![CDATA[Manchmal ist die Welt komplizierter als sie sein sollte. Wenn wir zum Beispiel ohne Sinn und Verstand eine AJAX Kommunikation aufbauen wollen, dann würden wir alles in ein Script reinfummeln und müssten mehrere Funktionen hintereinander aufrufen. Ich habe hierzu einen kleinen Beitrag (AJAX Kommunikation ohne Fassaden Pattern) geschrieben. Die Nachteile dieser Vorgehensweise sind: Komplexe und [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal ist die Welt komplizierter als sie sein sollte.</p>
<p>Wenn wir zum Beispiel ohne Sinn und Verstand eine AJAX Kommunikation aufbauen wollen, dann würden wir alles in ein Script reinfummeln und müssten mehrere Funktionen hintereinander aufrufen. Ich habe hierzu einen kleinen Beitrag (<a href="http://www.baldenhofer.eu/blog/it/programmieren/ajax-kommunikation-ohne-facade-pattern">AJAX Kommunikation ohne Fassaden Pattern</a>) geschrieben.</p>
<p>Die Nachteile dieser Vorgehensweise sind:</p>
<ul>
<li>Komplexe und ineinander verzahnte Funktionen müssen aufgerufen werden.</li>
<li>Jeder muss sich mit der Komplexität auseinander setzen</li>
<li>Die Kosten bei Wartung und Erweiterung sind hoch</li>
</ul>
<p>Das Fassaden Pattern (Facade Pattern auf Englisch) schützt den einzelnen Programmierer vor der Komplexität.<br />
Wir können eine einfach zu bedienende Schnittstelle erstellen. Diese Schnittstelle verbirgt das komplizierte System, dass wir ansonsten verwenden müssten.<br />
Wir können somit komplexe Abläufe an einer Stelle einfach aufrufen. Es werden weniger Fehler beim Aufruf und Ablauf komplexer Abläufe entstehen. Und wir können die schwierigen Codeabschnitte kapseln. Dann brauchen wir nicht immer den besten Entwickler um kleine Änderungen am System vorzunehmen.<br />
Hier eine kleine Grafik, die dass Fassaden Pattern darstellen soll:<br />
<img src="/images/blog/pattern/Facade.png" alt="Darstellung des Fassaden Patterns" /></p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/design-pattern-it/facade-pattern-problemstellung/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[Design Pattern]]></series:name>
	</item>
	</channel>
</rss>

