<?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; OOP</title>
	<atom:link href="http://ugamela-blog.pheelgood.net/tag/oop/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>Class Resource</title>
		<link>http://ugamela-blog.pheelgood.net/2010/02/17/class-resource-javascript-valueobject-prototype-pattern-2/</link>
		<comments>http://ugamela-blog.pheelgood.net/2010/02/17/class-resource-javascript-valueobject-prototype-pattern-2/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 22:40:16 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=300</guid>
		<description><![CDATA[Ich kam noch nie dazu hier einen Codefetzen vorzustellen (außer des Beitrags zum Dekorierer). Nun nutze ich diese Gelegenheit eine meiner ersten JavaScript Klassen zu besprechen. Gleichzeitig handelt es sich um das Muster Wertobjekt (ValueObject), welches unveränderlich ist. Vorweg muss noch gesagt werden, dass alle Attribute als Konvention protected gelten, public wird nicht benötigt und [...]]]></description>
			<content:encoded><![CDATA[<p>Ich kam noch nie dazu hier einen Codefetzen vorzustellen (außer des  Beitrags zum Dekorierer). Nun nutze ich diese Gelegenheit eine meiner  ersten JavaScript Klassen zu besprechen.</p>
<p>Gleichzeitig handelt es sich um das Muster Wertobjekt (ValueObject),  welches unveränderlich ist.</p>
<p>Vorweg muss noch gesagt werden, dass alle Attribute als Konvention  protected gelten, public wird nicht benötigt und private lässt sich über  Closures realisieren. Einfache Attribute tragen zudem den  Anfangsbuchstaben ihres Typs (z.B. s für String).</p>
<p>Objekte der Klasse stellen eine Menge eines Rohstoffs dar.</p>
<pre class="brush: jscript; title: ; notranslate">/**
 * Represents an amount of a resource
 * @param {number} amount
 * @param {string} type
 */
function Resource(amount, type) {
    var nAmount = amount;
    var sType = type;

    if (amount &lt; 0) {
        throw new IllegalArgumentException(&quot;amount has to be positive&quot;);
    }

    /**
     * @method Resource
     * @return {number} amount of the resource
     */
    this.getAmount = function() {
        return nAmount;
    };

    /**
     * @method Resource
     * @return {string} resource type
     */
    this.getType = function() {
        return sType;
    };
}

/**
 * Addition of two resources produces a new resource with the sum amount
 * the new object uses the old one as prototype
 * @param {Resource} resource
 * @return {Resource} new Resource object
 */
Resource.prototype.plus = function(resource) {
    if (!(resource instanceof Resource &amp;&amp; this.getType() == resource.getType())) {
        throw new IllegalArgumentException(&quot;resources don't match.&quot;);
    }
    var newRes = Object.create(this); // create a new object based on the current one
    // execute the Resource constructor on it
    Resource.call(newRes, this.getAmount() + resource.getAmount(), this.getType());
    return newRes;
};

/**
 * Subtraction of two resources produces a new resource with a smaller amount
 * @param {Resource} resource
 * @return {Resource} new Resource object
 */
Resource.prototype.minus = function(resource) {
    if (!(resource instanceof Resource &amp;&amp; this.getType() == resource.getType())) {
        throw new IllegalArgumentException(&quot;resources don't match.&quot;);
    }
    if (this.getAmount() &lt; resource.getAmount()) {
        throw new IllegalArgumentException(&quot;can't substract a higher amount&quot;);
    }
    var newRes = Object.create(this);
    Resource.call(newRes, this.getAmount() - resource.getAmount(), this.getType());
    return newRes;
};</pre>
<p>Interessant ist vor allem die Stelle, an der dynamisch neue Objekte der selben Klasse zurückgegeben werden (plus() und minus()), ich möchte Resource noch erweitern können und evtl. für die verschiedenen Rohstoffsorten eigene Klassen ableiten, daher sollten diese Methoden dann nicht nach einer mathematischen Operation auf die Klasse Resource zurückschrumpfen. In PHP kann man &#8220;new&#8221; einfach einen String übergeben, in Java muss man einen Umweg über eine Factory oder Reflection machen.</p>
<p>In JavaScript bietet es sich an, das momentane Objekt als Prototyp für das neue zu verwenden und dieses durch den Resource Konstruktor zu initialisieren.</p>
<p>Ich weiß noch nicht, ob mir dieses Pattern noch öfter begegnen wird, aber vor allem bei Wertobjekten (ValueObject), die mit Vererbung erweiterbar bleiben sollen ist dies praktisch. Allgemein wenn man ein neues Objekt des selben Typs wie das momentane zurückgeben möchte.</p>
<p>Jetzt kann ich eine Kindklasse ResourceContainer schreiben, die noch Funktionalität für Gewicht und Volumen des Rohstoffs bereitstellt (z.B zum Beladen von Schiffen):</p>
<pre class="brush: jscript; title: ; notranslate">/**
 * stores resources, adds weight and volume to a resource object
 * @inherits Resource
 * @param {Object} amount
 * @param {Object} type
 */
function ResourceContainer(amount, type) {
    Resource.call(this, amount, type); // inherit priviledged Resource methods
}
ResourceContainer.prototype = Object.create(Resource.prototype); // inherit nonpriviledged Resource methods

Resource.DESITY.metal = 7.85;
Resource.WEIGHT.metal = 1000;

/**
 * @return {number} weight of the resoure amount
 */
ResourceContainer.prototype.getWeight = function() {
    return this.getAmount() * Resource.WEIGHT[this.getType()];
};

/**
 * @return {number} volume of the resource amount
 */
ResourceContainer.prototype.getVolume = function() {
    return this.getAmount() * Resource.DENSITY[this.getType()];
};</pre>
</pre>
<p>Ich beginne langsam die Prototypennatur von JavaScript zu verwenden, bin aber immer noch sehr von Klassen von PHP und Java geprägt.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2010/02/17/class-resource-javascript-valueobject-prototype-pattern-2/feed/</wfw:commentRss>
		<slash:comments>2</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>Statusbericht</title>
		<link>http://ugamela-blog.pheelgood.net/2009/08/21/statusbericht/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/08/21/statusbericht/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 16:15:52 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=259</guid>
		<description><![CDATA[Ich dachte es wird Zeit für einen Statusbericht, ich bin gerade wieder dabei intensiv zu programmieren und zu lernen. Leider muss ich zugeben, dass ich in den letzten Wochen nicht wirklich vorwärts gekommen war. Fehlende Motviation und Wissen waren wohl die Gründe. Momentan begreife ich die Objekt-Orientierung in JavaScript, die doch relativ schwierig zu entdecken [...]]]></description>
			<content:encoded><![CDATA[<p>Ich dachte es wird Zeit für einen Statusbericht, ich bin gerade wieder dabei intensiv zu programmieren und zu lernen.</p>
<p>Leider muss ich zugeben, dass ich in den letzten Wochen nicht wirklich vorwärts gekommen war. Fehlende Motviation und Wissen waren wohl die Gründe. Momentan begreife ich die Objekt-Orientierung in JavaScript, die doch relativ schwierig zu entdecken ist, zumindest war sie das für mich. Wohl einfach aufgrund der größtenteils funktionalen Verwendung von JS. JS OOP programmiert sich zudem ganz anders wie PHP OOP, weil JavaScript vorallem auf Prototypen setzt.</p>
<p><span id="more-259"></span></p>
<p>Bei einer Website können mittlerweile client- und serverseitig Skripte aufgerufen werden, der Trend tendiert zur Zeit vor allem zur Clientseite, wobei es immer noch der Server ist, der die wirkliche Validation übernehmen muss. Der Client bleibt manipulierbar und somit unsicher. Auch ich habe mich dem Trend angeschlossen. Dabei setze ich vor allem auf OOP in JS und verlagere so viel wie möglich in den Browser. So wird die Seite bei mir von JavaScript generiert und läd nicht neu. Alles läuft über XHR (XMLHttpRequests &#8211; AJAX) und JavaScript. JS bestimmt wie die Seite aussieht, der Server gibt nur noch den Rahmen vor, erlaubt bestimmte Dinge (Zugriffe auf Daten), die Aufbereitung übernimmt der Browser.</p>
<p>Im MVC Modell gesehen verwaltet JavaScript hier die Views und bekommt dafür auch Models zur Verfügung gestellt, wenn auch eingeschränkter als auf PHP-Seite. Die Models stehen trotzdem in einer gewissen Verbindung, auch wenn diese nicht stetig ist, weil ich nicht andauernd unnötige Requests abschicken will, das würde nur zu einer Serverüberlastung führen. Gleichzeitig erzeugt dies einen sehr praktischen clientseitigen Cache, den ich vielleicht von Google Gears unterstützen werde.</p>
<p>Momentan schreibe ich an der Verbindung zwischen Client und Server, die möglichst abstrahiert werden soll (zusammengefasst und einfach verfügbar gemacht) &#8211; auch für weitere Entwicklungen.</p>
<p>Für zukünftige Entwickler wird somit auf jeden Fall PHP sowie JS Erfahrung vorrausgesetzt werden. Das schöne an einem Framework ist allerdings, dass man es nicht verstehen muss um es zu benutzen, wenn es gut geschrieben ist und auf kritische Stellen hingewiesen wird. Dafür gibt es zum Glück dann eine Community und Tutorials, die geschrieben werden [uA von mir]. Daher keine Angst, wenn das jetzt alles wie spanisch klang, es wird viele Erklärungen geben.</p>
<p>Ich freue mich schon auf das Verbesserungspotential, das eine Community bietet, wenn man als OpenSource veröffentlicht. Diese Idee treibt mich auch weiterhin an, ich habe aber noch einige schwierige Dinge zu schreiben bevor ich mich überhaupt endlich dem Spielinhalt widmen kann, denn zur Zeit schreibe ich immer noch am Grundgerüst des Spiels, das möglichst variabel und erweiterbar sein soll.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/08/21/statusbericht/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fortschritt, PHP und JavaScript, OOP</title>
		<link>http://ugamela-blog.pheelgood.net/2009/06/23/fortschritt-php-und-javascript-oop/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/06/23/fortschritt-php-und-javascript-oop/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 09:12:58 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=234</guid>
		<description><![CDATA[Die Entwicklung des (PHP-)Codes schleicht eher voran, als dass es wirklich vorwärts geht. Dafür formt sich eine Idee, die mehr und mehr auf die browserseitige Scriptsprache JavaScript setzt. Ich habe bereits geschrieben, dass ich Templates mit JavaScript parse, nun sollen ganze Inhalte nur mit JavaScript generiert werden. Views des MVC werden in dieser Sprache geschrieben. [...]]]></description>
			<content:encoded><![CDATA[<p>Die Entwicklung des (PHP-)Codes schleicht eher voran, als dass es wirklich vorwärts geht. Dafür formt sich eine Idee, die mehr und mehr auf die browserseitige Scriptsprache JavaScript setzt. Ich habe bereits geschrieben, dass ich Templates mit JavaScript parse, nun sollen ganze Inhalte nur mit JavaScript generiert werden. Views des MVC werden in dieser Sprache geschrieben. Dabei muss man aber extrem auf die Sicherheit aufpassen. Clientseitig darf man nur mit Daten arbeiten, die sowieso öffentlich sind. Ein gewisser Arbeitsaufwand bleibt deshalb immer auf der Serverseite hängen, die bei diesem Projekt mit PHP gebaut ist.</p>
<p>Nun verwende ich zu großen Anteilen die zwei verbreitetsten Websprachen, die beide von vielen Leuten verachtet werden, weil sie vor allem von Amateuren verwendet werden.</p>
<p>Besonders JavaScript scheint eine interessante Vorgeschichte zu haben. Vor einigen Monaten, als ich anfing JS zu lernen, kam ich auf D. Crockford und habe mir seine Videovorträge angesehn. Ich habe JS somit direkt OOP gelernt, wie es sich eigentlich gehört. JS ist sehr objekt-orientiert, Crockford nennt sie &#8220;ausdrucksstark&#8221;. Die genau Übersetzung ist mir unklar, ist aber auch egal, denke ich.</p>
<p>Ich kann diesen <a href="http://javascript.crockford.com/javascript.html">Artikel</a> nur empfehlen, notfalls auch <a href="http://www.pseliger.de/translations/Douglas-Crockford/missunderstood-JavaScript.html">übersetzt</a>, für diejenigen die weniger gut Englisch können. Um Englisch kommt man aber beim Programmieren kaum herum und Crockford schreibt und redet eigentlich ein sehr gut verständliches und deutliches Englisch. Auch seine <a href="http://developer.yahoo.com/yui/theater/">Videos</a> kann ich nur weiterempfehlen, es lohnt sich!</p>
<p>Ich entwerfe also ein kleines Grundgerüst in JavaScript, das mit dem serverseitigen Teil, den ich in PHP geschrieben habe, zusammenarbeitet. Dabei ist vor allem der ganze AJAX-Kram sehr nervig. Da alles asyncron ist, muss man ständig mit Callbacks arbeiten (Man übergibt die Funktion, die ausgeführt wird, sobald der Request abgeschlossen ist und die Daten zur Verfügung stehen), was ständig zu Verschachtelungen führt, die ich eigentlich umgehen möchte.</p>
<p>Derweil feiere ich mein Abi und mache ein wenig Urlaub mit Freunden. Ich werde also nicht permanent hieran arbeiten, aber hoffentlich dennoch vorwärts kommen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/06/23/fortschritt-php-und-javascript-oop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript / AJAX: Callbacks umgehen, Verkettung von Befehlen</title>
		<link>http://ugamela-blog.pheelgood.net/2009/04/04/javascript-ajax-callbacks-umgehen-verkettung-von-befehlen-avoid-callbacks-chaining-oop/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/04/04/javascript-ajax-callbacks-umgehen-verkettung-von-befehlen-avoid-callbacks-chaining-oop/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 13:12:59 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=221</guid>
		<description><![CDATA[Ich beschäftige mich zur Zeit intensiv mit JavaScript, da es mir clientseitig einige Arbeit abnehmen soll. Beispiel: JavaScript Templateparser Ich stehe immer noch zu OOP und auch JavaScript untersützt OOP hochgradig, allerdings in einer für PHPler ungewohnten Form: mit Prototypes, ohne Klassen. Überhaupt ist in JavaScript alles ein Objekt oder &#8211; noch besser &#8211; eine [...]]]></description>
			<content:encoded><![CDATA[<p>Ich beschäftige mich zur Zeit intensiv mit JavaScript, da es mir clientseitig einige Arbeit abnehmen soll.</p>
<p>Beispiel: <a href="http://ugamela-blog.pheelgood.net/2008/12/18/javascript-template-parser/">JavaScript Templateparser</a></p>
<p>Ich stehe immer noch zu OOP und auch JavaScript untersützt OOP hochgradig, allerdings in einer für PHPler ungewohnten Form: mit Prototypes, ohne Klassen. Überhaupt ist in JavaScript alles ein Objekt oder &#8211; noch besser &#8211; eine Funktion! Ich habe hier keine Zeit eine JavaScript Einführung zu geben, ich bitte daher um selbständige Fortbildung um diesen Artikel verstehen zu können.</p>
<p><span id="more-221"></span></p>
<p>AJAX Requests sind asynchron, laufen also immer mit Callbacks. Ich verwende <a href="http://jquery.com/" target="_blank">jQuery</a> als JS-Framework.</p>
<pre class="javascript">$.get(url, function(data) {
    // callback code
});</pre>
<p>Wenn ich nun mehrere Requests brauche, weil ich &#8211; im Falle des Templateparsers &#8211; Template, Sprache und Daten brauche, dann gibt das eine häßliche Verschachtelung:</p>
<pre class="javascript">$.get(tplurl, function(tpl) { // hole Template
    $.get(lngurl, function(lng) { // hole Sprache
        $.get(url, function(data) { // hole Daten
            $.bindTo(tpl, data, lng, '#content'); // parse das Template mit den Daten und der Sprache nach #content
        });
    });
});</pre>
<p>Und das ist noch vereinfacht&#8230; Dabei hätte ich viel lieber, wobei die Templates und die Sprache gecacht werden sollen:</p>
<pre class="javascript">$.get(url, function(data) {
    $tpl(tplID).bindTo(data, lngID, '#content');
});</pre>
<p>Nun.. wie bekommen wir das Callback weg?</p>
<p>Analyse des Problems:</p>
<p>Wir wollen anstatt eines Callbacks eine Verkettung per Punktschreibweise (Objektmethodenaufrufe), das bedeutet die Befehle die auf das Templateobjekt ausgeführt werden, werden höchstwahrscheinlich AJAX Requests beinhalten, auch wenn der Cache verwendet werden kann, müssen wir innerhalb mit Callbacks arbeiten, aber wir können sie nach außen hin verstecken, solange dem Coder gewahr ist, dass der bindTo-Aufruf auch asynchron ist. Für den Fall, dass man doch weiter abhängigen Code hat, führt kein Weg an weiteren Callbacks vorbei.</p>
<p>$tpl(tplID, callback).bindTo(data, params{lang,callback&#8230;})</p>
<p>Trotzdem wird das Aussehen komprimiert und etwas lese- und schreibfreundlicher.</p>
<p>Nun, wie ist das im Inneren gelöst?</p>
<p>Wir definieren zuerst eine Funktion get() (private), die das Template auftreibt, sei es aus dem Cache oder per Request. In beiden Fällen führt sie (oder der zugehörige Request) das interne Callback aus, sofern es gesetzt ist.</p>
<p>Das Objekt besitzt nun die public Methode bindTo, welche zuerst das interne Callback definiert (mit dem echten internen bindTo Code) und dann get() aufruft. Dazu kommen noch die beiden äußeren Callbacks von $tpl und bindTo, die wie das interne Callback am Ende von get() aufgerufen werden, sofern sie definiert sind.</p>
<p>Folge: Beim Aufruf von $tpl(tplID) passiert noch nichts besonderes, außer das ein Objekt zu Rückgabe gebildet wird. Der Aufruf von bindTo() auf dem Objekt stößt nun den Request an, welcher danach das echte bindTo ausführt!</p>
<p>So. Das wollte ich loswerden <img src='http://ugamela-blog.pheelgood.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , vielleicht hilft es ja irgendwem oder animiert Leute JavaScript zu lernen&#8230;</p>
<p>Bei echtem Verwendungsinteresse des Codes einfach Mail an mich.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/04/04/javascript-ajax-callbacks-umgehen-verkettung-von-befehlen-avoid-callbacks-chaining-oop/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>Vergleich PHP vs. Python</title>
		<link>http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 20:55:55 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=189</guid>
		<description><![CDATA[PHP muss nicht so schlecht sein, wie alle sagen. Mit PHP lassen sich auch größere Projekte verwirklichen, aber dafür gedacht ist es weniger. Für kleine Sites ohne größeren serverseitigen Rechenaufwand ist es gut geeignet und auch überschaubar. Mit PHPs OOP lässt sich etwas anfangen, aber die Vorzüge echter objekt orientierter Sprachen bietet es nicht. Am Ruf darf man sich dann nicht stören.

Python sollte verwendet werden wenn OOP von belang ist, damit hebt es sich am stärksten von PHP ab. Wenn auf eurem Webspace Python verfügbar ist, dann kann ich nur dazu animieren das einmal auszuprobieren!]]></description>
			<content:encoded><![CDATA[<p>Dieser Artikel ist mittlerweile veraltet. Für eine neuere Version, auch hinsichtlich NodeJS bitte diesem Link folgen: <a href="../2011/05/31/javascript-nodejs-vs-php-vs-python/">http://ugamela-blog.pheelgood.net/2011/05/31/javascript-nodejs-vs-php-vs-python/</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>PHP und Python unterscheiden sich stark, daher wird dieser Vergleich vor allem auf die Verwendbarkeit für ein Browsergame abzielen.</p>
<p><span id="more-189"></span></p>
<p>Python lässt sich, im Gegensatz zu PHP, welche eine pure Websprache ist, für jegliche Anwendung verwenden. PHP wird sehr gerne für Websiten verwendet, der Code ist schnell geschrieben, besondere Strukturen würden zwar nicht schaden, sind aber nicht von Nöten, weshalb kaum einer sich wirklich Mühe gibt. Dementsprechend ist auch der Ruf sehr schlecht. Es gibt viel zu viel Spaghetticode, allein UGamela war ein Beweis.</p>
<p>Ich persöhnlich habe mich sehr mit OOP und Designpatterns angefreundet und überzeugt ein gut strukturiertes stabiles Spielgerüst zu bauen. Es ist eindeutig ein Anreiz einmal OpenSource-Code mit Qualität aufzubauen, es wird viel zu viel geklagt wenn man sich mal umhört. Auch da geht der Abscheu zu PHP mit einher. Wenn man in höheren Kreisen erzählt man schreibe ein Browsergame in PHP wird man komisch angesehn. Zu Recht, denn PHP scheint denkbar ungeeignet:</p>
<p>Ein Browsergame ist mit nichts im Web wirklich vergleichbar und trotzdem versucht man es in einer Scriptsprache zu schreiben, die denkbar ungeeignet ist, schon allein aufgrund Performance. Um den Überblick im Spiel halten zu können (Wartbarkeit) und auch mal kurz neue Features einzufügen oder zu testen (Erweiterbarkeit &amp; Flexibilität) muss der Code gut strukturiert sein, sonst wird das nach kürzester Zeit chaotisch, wenn er es nicht sowieso schon war.</p>
<p>Noch ein paar weitere Dinge die ich für das Spiel brauche:</p>
<ol>
<li>Eine einfache Sprache, denn das Spiel soll möglichst von jedem erweitert werden können</li>
<li>Verfügbarkeit auf Webservern, evtl. Webspaces und wenig Installationsaufwand</li>
<li>Wahrscheinlich ein CMS oder Framework, das mir Funktionen zur Userverwaltung abnimmt</li>
</ol>
<p>1) Bieten PHP und Python beide, mir scheint Python sogar noch einfacher durch das Wegfallen der Klammern und die automatische Einrückung.</p>
<p>2) Hier schlägt PHP eindeutig Python, es ist quasi überall verfügbar, Standard.</p>
<p>3) In PHP sowie auch Python vorhanden, den PHP Frameworks wird aber allen keine besonders gute Performance zugesprochen.</p>
<p><em><strong><br />
</strong></em></p>
<p><em><strong>Allgemeines Fazit:</strong></em></p>
<p>PHP muss nicht so schlecht sein, wie alle sagen. Mit PHP lassen sich auch größere Projekte verwirklichen, aber dafür gedacht ist es weniger. Für kleine Sites ohne größeren serverseitigen Rechenaufwand ist es gut geeignet und auch überschaubar. Mit PHPs OOP lässt sich etwas anfangen, aber die Vorzüge echter objekt orientierter Sprachen bietet es nicht. Am Ruf darf man sich dann nicht stören.</p>
<p>Python sollte verwendet werden wenn OOP von belang ist, damit hebt es sich am stärksten von PHP ab. Wenn auf eurem Webspace Python verfügbar ist, dann kann ich nur dazu animieren das einmal auszuprobieren!</p>
<p><em><strong>Mein Fazit:</strong></em></p>
<p>Python ist denkbar besser geeignet, vor allem weil ich mir soviel Struktur wünsche. Ich freue micht jetzt schon auf den sauberen Code, habe die Semikolons und Klammern satt. Ein einfacher (billig) Webspace ist sowieso denkbar ungeeignet für ein Browsergame. PostgreSQL wird hervorragend passen, das unterstützt sogar innerhalb Python Aufrufe (Ersatz für die MySQL Procedures). In wieweit ich ein Framework wie Zope, Django oder Pylons zur Hand nehme steht noch nicht fest.</p>
<p>Ich möchte hiermit alle UGamela Interessierten dazu auffordern einmal in Python hineinzuschnuppern, der Aufwand könnte sich lohnen!</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Typen von Referenzen in PHP, Objekte löschen</title>
		<link>http://ugamela-blog.pheelgood.net/2008/12/19/typen-von-referenzen-in-php-objekte-loeschen/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/12/19/typen-von-referenzen-in-php-objekte-loeschen/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 12:59:48 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=175</guid>
		<description><![CDATA[Wieder was gelernt: Es gibt in PHP zwei Typen von Objektreferenzen, auch wenn es keine Dokumentation dazu gibt (Wer eine findet bitte sagen..!). Im Handbuch steht nur: Objekte werden immer als Referenz übergeben Das stimmt natürlich, nur ist es nicht ganz so einfach. Das Problem fällt allerdings erst auf, wenn man Objekte kontrolliert zerstören will. [...]]]></description>
			<content:encoded><![CDATA[<p>Wieder was gelernt:</p>
<p>Es gibt in PHP zwei Typen von Objektreferenzen, auch wenn es keine Dokumentation dazu gibt (Wer eine findet bitte sagen..!).</p>
<p>Im Handbuch steht nur: <em>Objekte werden immer als Referenz übergeben</em></p>
<p>Das stimmt natürlich, nur ist es nicht ganz so einfach. Das Problem fällt allerdings erst auf, wenn man Objekte kontrolliert zerstören will.</p>
<blockquote><p>$obj = NULL; # (1)</p></blockquote>
<p>Sollte ein Objekt zerstören, wie unset(). Doch was wenn man vorher</p>
<blockquote><p>$obj2 = $obj;</p></blockquote>
<p>gemacht hat? Plötzlich zerstört der erste Befehl (1) nichtmehr, er setzt nur die erste Variable auf NULL. Nun das selbe ein bischen verändert:</p>
<blockquote><p>$obj2 = &amp;$obj; # &amp; für Referenz sollte eigentlich nicht nötig sein</p></blockquote>
<p>(1) Führt nun dazu, dass beide Variablen NULL sind. Huch?</p>
<p>Diese Referenzen heißen entweder hard/soft oder echt/unecht, wie auch immer.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/12/19/typen-von-referenzen-in-php-objekte-loeschen/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP5 OOP Interfaces</title>
		<link>http://ugamela-blog.pheelgood.net/2008/12/09/php5-oop-interfaces/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/12/09/php5-oop-interfaces/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 21:31:23 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Datenbankabtraktion]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=168</guid>
		<description><![CDATA[Zu Deutsch &#8220;Schnittstellen&#8221;. Ich habe gemerkt, dass dieser Begriff sofort zu einer Fehlinterpretation führt, jedenfalls wars bei mir so. Ich hab diesen ganzen OOP Kram sowieso mind. zehn Mal lesen müssen, bis ich ihn annähernd gerafft hab. Einige Sachen sind mir immer noch unklar. Die letzten Tage bin ich aber endlich darauf gekommen, wofür man [...]]]></description>
			<content:encoded><![CDATA[<p>Zu Deutsch &#8220;Schnittstellen&#8221;. Ich habe gemerkt, dass dieser Begriff sofort zu einer Fehlinterpretation führt, jedenfalls wars bei mir so. Ich hab diesen ganzen OOP Kram sowieso mind. zehn Mal lesen müssen, bis ich ihn annähernd gerafft hab. Einige Sachen sind mir immer noch unklar.</p>
<p>Die letzten Tage bin ich aber endlich darauf gekommen, wofür man diese Interfaces in PHP verwenden kann.</p>
<h3>Zuerst einmal: <span style="text-decoration: underline;">Was ist so ein Interface?</span></h3>
<p>Interfaces sind Klassen, die bestimmte Funktionen vorbestimmen. Die Funktionen bilden dann eine Schnittstelle, also eine bestimmte Möglichkeit von anderen Objekten angesprochen zu werden. Im Gegensatz zu anderen Klassen werden Schnittstellen implementiert (&#8220;implements&#8221;). Dadurch kann eine Klasse mehrere Schnittstellen haben, aber nur von einer einzigen normalen Klasse abstammen.</p>
<p>Man muss also nur die Schnittstelle kennen, um die Klasse verwenden zu können, die sie implementiert. Anders gesagt, man kann die Klasse so verwenden wie man die Schnittstelle als Klasse verwenden würde.</p>
<h3>Sehr konkrete Beispiele liefert PHP selbst mit einigen Schnittstellen:</h3>
<p>ArrayAcces: Die Objekte einer Klasse lassen sich wie Arrays ansprechen.<br />
Iterator: Die Eigentschaften einer Objekts lassen sich iterieren, also auf eine bestimmte Weise durchlaufen.</p>
<h3>Interfaces lassen sich aber auch noch weit abstrakter verwenden:</h3>
<p>Ich schreibe ein Interface Datenbankverbindung, das ich aus praktischen Gründen dokumentiere. Ich weise nochmal darauf hin, dass dieses Interfaces keinen Programmcode enthält, es gibt nur Struktur vor.</p>
<p>Danach schreibe ich einen Dekorierer für meine mysqli Klasse und achte derweil auch etwas darauf, wie PDO aufgebaut ist, denn wahrscheinlich wird das eine weitere mögliche Datenbankverbindung (-&gt;Interfacename&#8230;) mysqli wird etwas zurechtgebogen und erweitert.</p>
<p><span style="text-decoration: underline;"><strong>Resultat:</strong></span> Ich kann verschiedene Datenbankklassen nach ein paar Anpassungen verwenden. Ich benutze mysqli, weil es anscheinend die schnellste ist, was MySQL angeht. Letztlich verwende ich Typehints auf &#8220;Datanbankverbindung&#8221; und Autovervollständigung für das Interface, welches ich dokumentiert (phpDoc, Zend Studio) habe.</p>
<p>Ich hoffe, ich habe es etwas anschaulicher erklärt, als es das Handbuch tut. Ich erinnere nocheinmal daran, dass dies keineswegs einfach ist und ich selbst lange gebraucht habe es zu verstehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/12/09/php5-oop-interfaces/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

