<?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; WordPress Themes putzen</title>
	<atom:link href="http://www.baldenhofer.eu/blog/tag/design-pattern/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>WordPress Themes putzen</title>
		<link>http://www.baldenhofer.eu/blog/it/wordpress-themes-putzen</link>
		<comments>http://www.baldenhofer.eu/blog/it/wordpress-themes-putzen#comments</comments>
		<pubDate>Wed, 29 Jul 2009 08:52:49 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[refacturing]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=1706</guid>
		<description><![CDATA[Wenn ich gerade mal nicht beim Arbeiten, auf unserer Baustelle oder am Schlafen bin fummle ich ein klein wenig an WordPress herum. Ute hat mir den Auftrag erteilt ein aufgeräumtes, einfach zu verstehendes und für miradlo taugliches Theme zu erstellen. Das sind ja nun drei Wünsche auf einmal gelle? Ich bin also mal in ein [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn ich gerade mal nicht beim Arbeiten, auf unserer Baustelle oder am Schlafen bin fummle ich ein klein wenig an WordPress herum.<br />
Ute hat mir den Auftrag erteilt ein aufgeräumtes, einfach zu verstehendes und für miradlo taugliches Theme zu erstellen.</p>
<p>Das sind ja nun drei Wünsche auf einmal gelle? <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ich bin also mal in ein WordPress Theme reingestiegen und wollte gleich wieder raus gehen.<br />
Da drin findet sich ein buntes Gemisch aus HTML-Tags und PHP Code.<br />
Ich war wirklich überrascht wie schlecht man solche Ansichten aufbauen kann.</p>
<ul>
<li>Vollkommen unübersichtlich</li>
<li>Verwendung von PHP 4 Sprachbefehlen (if &#8230; :  &#8230; endif)</li>
<li>Aufruf von diversen Helferfunktionen aus den unterschiedlichsten Bereichen</li>
<li>Wartbarkeit ist für diese Themes eher ein Fremdwort</li>
</ul>
<p>So, nachdem ich erst einmal lauthals geflucht habe, habe ich mir überlegt was ich damit anfangen will.</p>
<h3>Was habe ich zuerst gemacht?</h3>
<p>Ich bin hingegangen und habe mir ein paar Helfermethoden erstellt.</p>
<ul>
<li>Methode mit der ein dynamischer Text innerhalb eines zu definierenden HTML Tags ausgegeben wird.<br />
Diese Methode kann mit ein paar Parametern aufgerufen werden und ich kann hiermit ca. 60% vom HTML Code aus dem Theme verbannen.</li>
<li>Methode mit der komplexe HTML Tags dargestellt werden können.<br />
Um Listen usw. zu generieren, habe ich noch eine weitere Methode erstellt. Damit spare ich noch mehr HTML Code ein.</li>
<li>Methode um WordPress Funktionen zu rappen und Funktionen die keinen String zurückgeben dennoch in HTML Tags umzuwandeln.<br />
Damit konnte ich dann ungefähr 90% aller HTML Tags aus dem Theme entfernen.</li>
</ul>
<h3>Was bringen diese Methoden?</h3>
<p>Ich kann hiermit (fast) sämtlichen HTML Code aus dem Theme entfernen.<br />
Das Theme beinhaltet eine Aneinanderreihung der darzustellenden WordPress Funktionen. Wenn diese Funktionen in richtiger Reihenfolge dort eingebunden werden, sind sie sehr einfach zu überschauen und zu verstehen.</p>
<p>Ich habe damit meinem Theme die Lesbarkeit enorm verbessert.</p>
<h3>Was mach ich als nächstes?</h3>
<p>Wenn ich wieder dazu komme, werde ich alle Theme Dokumente entsprechend umwandeln und dokumentieren.<br />
Danach sieht die Welt mit WordPress gleich viel aufgeräumter aus.<br />
Weiterhin möchte ich die letzten &#8220;Geheimnisse&#8221; des WordPress Aufbaus verstehen.<br />
Was ich bisher gesehen habe ist, dass die einzelnen Funktionen nach Themengebieten geordnet in den einzelnen Dateien hinterlegt sind.<br />
Die meisten  Funktionen so gebaut, dass sie Strings ausgeben können oder direkt mit echo ihre Ausgaben in den Themes durchführen.<br />
Leider ist das nicht ganz durchgängig. Einige Funktionen können nur Strings zurückliefern oder nur echo durchführen. Hier sehe ich eine ziemliche inkonsistenz des Systems.<br />
Diese Inkonsistenz kapsle ich mit meinen Helfermethoden. Somit kann ich einigermassen gleichmässig mit den Funktionen umgehen.</p>
<h3>Was halte ich zur Zeit von WordPress?</h3>
<p>Nach anfänglichem Erschrecken habe ich feststellen dürfen, dass WordPress durchaus eine logische Struktur mit sich bringt. Bei vielen Architekturen sammelt sich der &#8220;Unsinn&#8221; in den Views. Das kommt oft vor, da die Anwender nicht wissen, wo sie ihre Funktionalität einfügen sollen.</p>
<p>Ich denke mal wenn die eigenen Themes sauber aufgeräumt sind, dann wird dieses System auch einfacher zu warten und pflegen sein.<br />
Sobald ich weiter komme, werde ich euch darüber informieren.</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/wordpress-themes-putzen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</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>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>
		<item>
		<title>Head First Design Patterns</title>
		<link>http://www.baldenhofer.eu/blog/unterricht/head-first-design-patterns</link>
		<comments>http://www.baldenhofer.eu/blog/unterricht/head-first-design-patterns#comments</comments>
		<pubDate>Fri, 20 Mar 2009 23:49:42 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Bücher]]></category>
		<category><![CDATA[Unterricht]]></category>
		<category><![CDATA[buchbeschreibung]]></category>
		<category><![CDATA[Design Pattern]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=591</guid>
		<description><![CDATA[Die Head First Buchreihe beschreibt in einer spielerischen Art und Weise die jeweiligen Themen. Ziel dieser Bücher ist es, dem Leser das jeweilige Themengebiet schnell und verständlich näher zu bringen. Das Buch Head First Design Patterns von O&#8217; Reilly (ISBN 0-596-00712-4) erklärt auf witzige Art- und Weise wie man Design Patterns verwenden kann. Für wen [...]]]></description>
			<content:encoded><![CDATA[<p>Die<a href="http://headfirstlabs.com/"> Head First</a> Buchreihe beschreibt in einer spielerischen Art und Weise die jeweiligen Themen. Ziel dieser Bücher ist es, dem Leser das jeweilige Themengebiet schnell und verständlich näher zu bringen.</p>
<p>Das Buch <a href="http://www.headfirstlabs.com/books/hfdp/">Head First Design Patterns</a> von O&#8217; Reilly (ISBN 0-596-00712-4) erklärt auf witzige Art- und Weise wie man Design Patterns verwenden kann.</p>
<h2>Für wen ist dieses Buch geeignet?</h2>
<p>Wenn du einen guten Überblick über die Standard Design Patterns erlernen willst, ist dieses Buch wirklich zu empfehlen.</p>
<p>Du solltest dich ein wenig mit Java oder C# auskennen. Dann kannst du die Programmbeispiele verstehen. Viel Programmiererfahrung brauchst du jedoch nicht.</p>
<p>Nach der Lektüre dieses Buchs wirst du den Ablauf und die Verwendung von Design Patterns verstanden haben. Es ist ein sehr gut lesbares und verständliches Lehrbuch.</p>
<h2>Für was ist das Buch nicht geeignet?</h2>
<p>Für die tägliche Arbeit mit Design Patterns ist dieses Buch nicht sehr sinnvoll, da die einzelnen Design Patterns durch Fallbeispiele erarbeitet und ziemlich ausschweifend ist. Eine Zusammenfassung der beschriebenen Design Patterns ist nicht vorhanden.</p>
<h2>Themen des Design Patterns Buches</h2>
<p>Folgende Design Patterns werden beschrieben:</p>
<ul>
<li>Observer Pattern</li>
<li>Decorator Pattern</li>
<li>Factory Pattern</li>
<li>Singleton Pattern</li>
<li>Command Pattern</li>
<li>Adapter und Facade Patterns</li>
<li>Template Method Pattern</li>
<li>Iterator und Composite Patterns</li>
<li>State Pattern</li>
<li>Proxy Pattern</li>
<li>Compound Patterns (MVC usw.)</li>
</ul>
<p>Nach dem Buch kannst du erkennen, welche Patterns du wann benötigst und kannst dich an das Designen von eigenen Applikationen mittels Pattern herantrauen.</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/unterricht/head-first-design-patterns/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Design Patterns</title>
		<link>http://www.baldenhofer.eu/blog/unterricht/php-design-patterns</link>
		<comments>http://www.baldenhofer.eu/blog/unterricht/php-design-patterns#comments</comments>
		<pubDate>Fri, 20 Mar 2009 12:44:41 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Bücher]]></category>
		<category><![CDATA[Unterricht]]></category>
		<category><![CDATA[buchbeschreibung]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=594</guid>
		<description><![CDATA[Das Buch PHP Design Patterns von O&#8217;Reilly (ISBN-10 3-89721-442-3) behandelt die klassischen Design Patterns und wie sie unter PHP zum Einsatz kommen können. Stephan Schmidt gibt einen Überblick wie in PHP die Objektorientierte Programmierung Einzug gehalten hat. Dann beschreibt er diverse Regeln, die beim Software-Design eingehalten werden sollen. Die einzelnen Design Patterns hat er in [...]]]></description>
			<content:encoded><![CDATA[<p>Das Buch <a href="http://www.phpdesignpatterns.de/auflage-1/">PHP Design Patterns</a> von O&#8217;Reilly (ISBN-10 3-89721-442-3) behandelt die klassischen Design Patterns und wie sie unter PHP zum Einsatz kommen können.</p>
<p>Stephan Schmidt gibt einen Überblick wie in PHP die Objektorientierte Programmierung Einzug gehalten hat.</p>
<p>Dann beschreibt er diverse Regeln, die beim Software-Design eingehalten werden sollen.</p>
<p>Die einzelnen Design Patterns hat er in die Gruppen Erzeugungsmuster, Strukturmuster und Verhaltensmuster aufgeteilt. Komplexere Patterns hat er im Kapitel Enterprise Patterns beschrieben.</p>
<p>Bei der Beschreibung der Design Patterns hat er sich an die Standard Beschreibung von Design Patterns gehalten.</p>
<p>Er verwendet jeweils die Unterkapitel Motivation, Zweck des Patterns, Implemntierung, Fallstricke, Definition des Patterns, Konsequenzen und weitere Anwendungen.</p>
<h2>Für wen ist dieses Buch?</h2>
<p>Wenn du mit PHP Applikationen erstellen willst und ein sauberes Design anwenden willst, ist dieses Buch sehr hilfreich. Du kannst es während der täglichen Arbeit als Referenzbuch verwenden. Es beschreibt die einzelnen Design Patterns verständlich und ziemlich abschliessend. Mir hat das Buch sehr gut gefallen.</p>
<h2>Für wen ist dieses Buch nicht geeignet?</h2>
<p>Wenn du das erste Mal mit Design Patterns zu tun hast, ist dieses Buch ein wenig trocken. Zum Reinkommen in Design Patterns kann ich eher das <a href="http://www.baldenhofer.eu/blog/guggat_emol/head-first-design-patterns">Head First Design Patterns</a> Buch empfehlen.</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/unterricht/php-design-patterns/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

