<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>UGamela Blog &#187; design patterns</title>
	<atom:link href="http://ugamela-blog.pheelgood.net/tag/design-patterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://ugamela-blog.pheelgood.net</link>
	<description>Entwicklung eines Browsergames</description>
	<lastBuildDate>Mon, 12 Dec 2011 18:28:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JavaScript OOP: patterns</title>
		<link>http://ugamela-blog.pheelgood.net/2010/02/22/javascript-oop-patterns-muster/</link>
		<comments>http://ugamela-blog.pheelgood.net/2010/02/22/javascript-oop-patterns-muster/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 01:50:06 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=308</guid>
		<description><![CDATA[Patterns &#8211; Muster auf Deutsch. Informatiker fassen gerne Probleme in Muster um sie zu katalogisieren. Eine Problemlösung kann so öfter wieder verwendet werden, Fehler werden vermieden. Manchmal stellen sie auch einfach einen Weg dar etwas elegant zu lösen. Besonders in objektorientierter Programmierung sind solche Muster bekannt: Entwurfsmuster. Nachdem ich mich jetzt während des Sommers mit [...]]]></description>
			<content:encoded><![CDATA[<p>Patterns &#8211; Muster auf Deutsch. Informatiker fassen gerne Probleme in Muster um sie zu katalogisieren. Eine Problemlösung kann so öfter wieder verwendet werden, Fehler werden vermieden. Manchmal stellen sie auch einfach einen Weg dar etwas elegant zu lösen. Besonders in objektorientierter Programmierung sind solche Muster bekannt: Entwurfsmuster.</p>
<p>Nachdem ich mich jetzt während des Sommers mit Objektorientierung, Softwarearchitektur und Entwurfsmustern beschäftigt hatte, suchte ich auch in JavaScript nach Mustern und Best Practice, und  nun möchte ich diese Erfahrungen auf meinem Blog teilen.</p>
<p><span id="more-308"></span></p>
<p>Vorab sollte erwähnt werden, dass JavaScript in mehreren Aspekten eine besondere Sprache ist. Es wird nicht umsonst geschmäht aufgrund unerklärlichen Verhaltens. Man sehe sich nur mal <a href="http://wtfjs.com/" target="_blank">wtfjs</a> an! Dennoch ist JavaScript auch sehr mächtig als objektorientierte Sprache. Closures und Prototypen sind recht unbekannt in der sehr von Java geprägten objektorientierten Welt. Die Umgewöhnung kann schwer fallen, auch ich hatte da meine Probleme. Zum Glück gibt es zum Beispiel Videos von Douglas Crockford auf YUI Theater, die einem helfen einen Einstieg zu finden.</p>
<p>Ich möchte nun hier zwei Funktionen vorstellen, die es auch in die neue ECMAScript Spezifikation geschafft haben: Function.prototype.bind und Object.create. Beide lassen sich mit einigen Tricks auch auf dem momentan verbreiteten JavaScript verwenden, bei Frameworks gehören sie zum Grundrepertoire.</p>
<p>Viel kann ich noch nicht zu prototypenbasierter Programmierung sagen, da ich selbst noch nicht ganz auf den Trichter gekommen bin, trotzdem habe ich schon Anwendungen gefunden und ziehe Nutzen in meinem sonst noch recht klassenbasierten Stil.</p>
<h2>Object.create</h2>
<pre class="brush: jscript; title: ; notranslate">if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}</pre>
<p>Diese schöne Funktion erzeugt ein Objekt auf Basis eines anderen Objekts, welches zum Prototypen wird. Vorsichtig muss man sein, wenn man lokale/private Variablen im Prototypen verwendet, da sich die beiden Objekte diese teilen. Der Prototyp sollte also ein neues Objekt sein, dass sonst nicht genutzt wird, oder die vermeintlichen Methoden müssen neu initialisiert werden, wie ich es in vorigem Blogeintrag mit dem aufrufen eines Konstruktors mache.</p>
<p>Ich möchte das Beispiel auch nochmal aufgreifen, wobei ich mittlerweile nochmal refaktorisiert habe.</p>
<pre class="brush: jscript; title: ; notranslate">Resource.prototype.create = function(newAmount) {
    var newResource = Object.create(this);
    Resource.call(newResource, newAmount, this.getType());
    return newResource;
};</pre>
<p>Mit dieser Methode ist es möglich Objekte der selben Resource anhand einer vorliegenden zu erstellen. Theoretisch könnte ich diese Methode auch clone() nennen, da ich aber gleichzeitig das neue Objekt initialisiere, behalte ich den namen der Basisfunktion &#8211; create(). clone() lässt sich damit aber recht leicht verwirklichen, man muss nur die Eigenschaften vom alten Objekt übergeben.</p>
<pre class="brush: jscript; title: ; notranslate">Resource.prototype.clone = function() {
    return this.create(this.getAmount());
}</pre>
<p>Schön, jetzt habe ich ein paar tolle neue Möglichkeiten Objekte zu erzeugen, was soll das nun?<br />
Unter den Entwurfsmustern gibt es eine Untermenge: Creational Patterns, Muster zur Konstruktion. Einige Muster, die sich mit verschiedenen Möglichkeiten der Konstruktion von Objekten beschäftigen. Alle vermeiden die Konstruktion mittels &#8220;new &lt;Klassenname&gt;&#8221;, weil dies (unter anderem) zu statisch ist.<br />
Wenn ich ein Objekt mit einer create() Methode übergebe, dann übergebe ich gleichzeitig die Möglichkeit ein neues Objekt des selben Typs zu erstellen, ohne mich explizit an den Typ zu binden. Die Konstruktion ist dynamisch. Aus diesem Grund kann ich auch leicht Vererbung anwenden ohne danach meinen ganzen Code nach &#8220;new &lt;Elternklassenname&gt;&#8221; durchsuchen zu müssen.</p>
<h2>Function.prototype.bind</h2>
<pre class="brush: jscript; title: ; notranslate">if (typeof Function.prototype.bind !== &quot;function&quot;) {
    Function.prototype.bind = function(context) {
        if (arguments.length &lt; 2 &amp;&amp; typeof arguments[0] === &quot;undefined&quot;) {
            return this;
        }
        var method = this, args = Array.prototype.slice.call(arguments, 1);
        return function() {
            var a = merge(args, arguments);
            return method.apply(context, a);
        };
    };
}</pre>
<p>Den Code dieser Funktion habe ich mir aus dem Prototype Framework geholt und von Abhängigkeiten befreit. Jede Funktion und insbesondere Methode ist ab jetzt mit der Funktionalität ausgerüstet, unabhängig von ihrem Objekt gemacht zu werden.<br />
Schonmal das probiert?</p>
<pre class="brush: jscript; light: true; title: ; notranslate">var func = someObject.someMethod;
func();</pre>
<p>Das geht schwer in die Hose wenn someMethod &#8220;this&#8221; verwendet, &#8220;this&#8221; is dann nämlich &#8220;window&#8221; &#8211; eine der Freuden an JavaScript.<br />
Stattdessen verwendet man besser:</p>
<pre class="brush: jscript; light: true; title: ; notranslate">var func = someObject.someMethod.bind();</pre>
<p>Theoretisch kann man auch bereits Parameter mitgeben.<br />
Diese Funktion findet häufig Verwendung, wenn man bei AJAX oder Effekten Callbacks übergibt und spart jedes Mal manuelles Umwickeln mit einer anonymen Funktion.</p>
<p>Die Tiefe von Patterns habe ich mit diesem Artikel wohl nicht erreicht, aber ich hoffe er ist trotzdem einigen Leuten hilfreich. Die vorgestellten Funktionen würde man wohl als Sugar (&#8220;Zucker&#8221;) bezeichnen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2010/02/22/javascript-oop-patterns-muster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Entwurfsmuster &#8211; Buch</title>
		<link>http://ugamela-blog.pheelgood.net/2009/09/11/entwurfsmuster-buch-gof/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/09/11/entwurfsmuster-buch-gof/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 17:34:30 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=268</guid>
		<description><![CDATA[Design Patterns &#8211; das Buch, das weit auch als &#8220;das GoF Buch&#8221; bekannt ist, gehört nicht zu den neuesten Büchern zum Thema, ist aber das Bekannteste und Altbewährte. Ich habe es die letzten Wochen das erste Mal gelesen bzw. bin es durchgegangen. Mein Fazit: Ein gutes Buch! Ich bereue keineswegs 50€ dafür ausgegeben zu haben. [...]]]></description>
			<content:encoded><![CDATA[<p>Design Patterns &#8211; das Buch, das weit auch als &#8220;das GoF Buch&#8221; bekannt ist, gehört nicht zu den neuesten Büchern zum Thema, ist aber das Bekannteste und Altbewährte. Ich habe es die letzten Wochen das erste Mal gelesen bzw. bin es durchgegangen. Mein Fazit:</p>
<p>Ein gutes Buch! Ich bereue keineswegs 50€ dafür ausgegeben zu haben. Werde es aber auch nochmal irgendwann auf englisch in die Hände bekommen müssen, wegen des Vokabulars.</p>
<p>Wie der Name schon sagt, handelt es von Entwurfsmustern. Diese Muster beschreiben wie man Objekte in Beziehung setzen kann, Arten von Beziehungen die gut funktionieren. Es hilft bei Problemlösungen und zeigt auf, wie eine Analyse auszusehen hat. Die Beschreibungen laufen über Vor- und Nachteil und detaillierte Beispiele.</p>
<p>Ich bin immer noch sehr dabei diese Art des Programmierens zu lernen, komme einem guten Niveau aber immer näher. Derweil versuche ich noch die Rolle von Prototypen in JavaScript zu verstehen um dann, selbst in JavaScript, Entwurfsmuster anzuwenden.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/09/11/entwurfsmuster-buch-gof/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Design Patterns: Dekorierer (Decorator) [vs. Vererbung]</title>
		<link>http://ugamela-blog.pheelgood.net/2009/02/24/design-patterns-dekorierer-decorator-vs-vererbung-php/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/02/24/design-patterns-dekorierer-decorator-vs-vererbung-php/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 16:10:45 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=201</guid>
		<description><![CDATA[Hab ja schon lange nichts mehr geschrieben, greife nun den Gedanken etwas über Design Patterns zu schreiben wieder auf. Vorerst muss ich darauf hinweisen, dass ich kein Profi bin und hier meine subjektive Meinung vertrete. Dies wird also kein Eintrag wie aus dem Lehrbuch, ich versuche nur etwas auf meine Weise klar zu machen. Einleitung [...]]]></description>
			<content:encoded><![CDATA[<p>Hab ja schon lange nichts mehr geschrieben, greife nun den Gedanken etwas über Design Patterns zu schreiben wieder auf.</p>
<p>Vorerst muss ich darauf hinweisen, dass ich kein Profi bin und hier meine subjektive Meinung vertrete. Dies wird also kein Eintrag wie aus dem Lehrbuch, ich versuche nur etwas auf meine Weise klar zu machen.</p>
<blockquote><p>Einleitung der <a title="Viererbande" href="http://de.wikipedia.org/wiki/Viererbande_(Softwareentwicklung)" target="_blank">GoF</a>: <em>Favorisiere Zusammensetzung vor Vererbung (&#8220;Favor object composition over class inheritance&#8221;) </em></p></blockquote>
<p><em>Vererbung</em> sollte für jeden, der schon mal ein paar Klassen geschrieben hat, klar sein; Stichwort dazu ist (in PHP) &#8220;extends&#8221;. <em>Komposition</em> ist schon ein wenig schwieriger. Die wichtigste Rolle spielt hier der <em>Dekorierer</em>.  <span id="more-201"></span></p>
<p>Hier nun ein bischen PHP-Code, hoffentlich schon selbsterklärend:</p>
<pre class="brush: php; title: ; notranslate">
interface Etwas
{
public function tuWas();
}
class EtwasImplementation implements Etwas
{
public function tuWas()
{
return 'Etwas tut was.';
}
}
class AnderesEtwas implements Etwas
{
public function tuWas()
{
return 'Dieses Etwas tut was Anderes, evtl. Ähnliches auf andere Weise.';
}
}
class EtwasDekorierer implements Etwas
{
protected $_Etwas;
public function __construct(Etwas $Etwas)
{
$this-&gt;_Etwas = $Etwas;
}
public function tuWas()
{
return $this-&gt;_Etwas-&gt;tuWas().' Und der Dekorierer verarbeitet das noch weiter, kann jedes Etwas erweitern.';
}
}</pre>
<p>Wie man sieht ist der EtwasDekorierer selbst ein Etwas, kann auch jeder Zeit die Stelle eines Etwas einnehmen, wie als würde er davon abstammen (Vererbung). Der klare Vorteil gegenüber der Vererbung ist nun, dass der EtwasDekorierer sowohl die EtwasImplementation als auch AnderesEtwas erweitern kann. Das, was erweitert wird, wird dadurch austauschbar. Mehrere Dekorierer lassen sich übrigens hervorragend verschachteln.</p>
<p>Hier noch ein kleines, etwas konkreteres Beispiel:</p>
<pre class="brush: php; title: ; notranslate">
class Logger # soll Methodenaufrufe des dekorierten Objekts loggen.
{
    protected $_Object;
    public function __construct($Object) #ggf prüfen ob es ein Objekt eines bestimmten Typs ist (per Typehint)
    {
        $this-&gt;_Object = $Object;
    }
    public function __call($method, $args);
    {
         printf('Methode %s eines Objekts der Klasse %s wurde aufgerufen \n', $method, get_class($this-&gt;_Object));
         # Hier kann man natürlich je nach Bedarf etwas Anderes einbauen... (e.g. In Datei schreiben etc.etc..)
         return call_user_func_array(array($this-&gt;_Object, $method), $args);
    }
}</pre>
<p>Der Nachteil am Dekorierer ist, dass man alles delegieren, also weiterleiten, muss. Besonders wenn der Dekorierer nur einen Teil der Methoden verändern soll ist das nervig alle Methoden an das dekorierte Objekt weiterzuleiten. PHP5s __call() kann da praktisch sein, obwohl dann zu überdenken ist, ob der Dekorierer nicht unnötig ist, gerade in PHP, wo OOP weniger performant ist.</p>
<p>Insgesamt wird mit dem Dekorierer eine weniger feste Bindung zwischen den Objekten gelegt, dadurch wird das Design flexibler.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/02/24/design-patterns-dekorierer-decorator-vs-vererbung-php/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP Programmierung &#8211; Entwurfsmuster (design patterns)</title>
		<link>http://ugamela-blog.pheelgood.net/2008/11/18/php-programmierung-entwurfsmuster-design-patterns/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/11/18/php-programmierung-entwurfsmuster-design-patterns/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 09:54:06 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=139</guid>
		<description><![CDATA[Vor ein-zwei Monaten habe ich Entwurfsmuster &#8211; in PHP &#8211; kennengelernt, obwohl ich davor schon viel früher über sie gestolpert war, hatte ich sie irgendwie nie richtig wahrgenommen oder einfach nicht verstanden. Wenn Programmieren abstrakt ist, dann sind es Entwurfsmuster erst recht. Die Beschreibungen der Muster sind gar so abstrakt, dass man umbedingt Beispiele für [...]]]></description>
			<content:encoded><![CDATA[<p>Vor ein-zwei Monaten habe ich Entwurfsmuster &#8211; in PHP &#8211; kennengelernt, obwohl ich davor schon viel früher über sie gestolpert war, hatte ich sie irgendwie nie richtig wahrgenommen oder einfach nicht verstanden.</p>
<p>Wenn Programmieren abstrakt ist, dann sind es Entwurfsmuster erst recht. Die Beschreibungen der Muster sind gar so abstrakt, dass man umbedingt Beispiele für die Anwendung braucht.</p>
<p>Auch wenn man sie leicht übersieht, stehen bereits im PHP Handbuch zwei Entwurfsmuster. <em>Singleton</em> und <em>Fabrik</em>. Ich möchte auf <em>Singleton</em> eingehen, hole aber noch etwas weiter aus.</p>
<p>Ich habe mich, als ich OOP anfing, gewundert wofür die <em>public</em>, <em>protected</em> und <em>private </em>Deklarationen sind und denn Sinn einfach nicht verstanden. In PHP dienen sie größtenteils gar nicht dem Programmierer selbst, sondern anderen Programmierern, die am selben Projekt schreiben. Sie schließen einfach die falsche Verwendung aus und kapseln Funktionen und Eigenschaften durch die Zugriffkontrolle. Für die Codefunktionalität sind sie somit unwichtig. Man könnte auch einfach alles <em>public</em> deklarieren, wenn man es trotzdem richtig verwendet (PHP4 ist noch alles public).</p>
<p><em>Singleton</em> geht auf diesem Weg weiter, er erlaubt nur eine Instanz eines bestimmten Objektes, auf welche gleichzeitig global zugegriffen werden kann.</p>
<p>Das benötigt man zum Beispiel bei der Datenbank, die meist nur eine einzige Verbindung umfasst.</p>
<p><a title="PHP Handbuch: Entwurfsmuster" href="http://docs.php.net/manual/de/language.oop5.patterns.php">http://docs.php.net/manual/de/language.oop5.patterns.php</a></p>
<p>Es gibt aber noch viele andere komplexere Entwurfsmuster. Ich werde demnächst nochmal das neue Schema für mein Projekt erklären.</p>
<p>Entwurfsmuster zählen definitiv zur Professionellen Programmierung, das Niveau ist deutlich anders, als das simple Programmieren von einfachen Websites.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/11/18/php-programmierung-entwurfsmuster-design-patterns/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

