Heute hatte ich eine nette Diskussion mit dem Herrn der Landstrasse. Es ging um die weitverbreitete und vielfach genutzte init - Methode von Komponenten. Genauer gesagt, um ihren Rückgabewert “this”.
Schauen wir uns einmal eine flugzeug.cfc mit einer init - Methode an:
<cfcomponent displayname="Flugzeug"> <cffunction name="init" access="public" output="false" returntype="flugzeug" hint="Konstruktor des Flugzeugs"> ... <cfreturn this /> </cffunction> </cfcomponent>
Das Flugzeug wird nun als Objekt angelegt und die init - Methode initialisiert die Umgebung die das Flugzeug für seine Arbeit benötigt:
<cfset local.flugzeug = createObject("component","flugzeug").init() />
Soweit so klar - aber was macht nun genau dieses “this”?
Eigentlich ganz einfach und wenn man die Header - Informationen der Funktion ansieht auch offensichtlich: Es liefert mir das Flugzeug.
In der Praxis bedeutet dies, dass ich eben anstatt
<cfset local.flugzeug = createObject("component","flugzeug") />
<cfset local.flugzeug.init() />
die oben erwähnte Schreibweise anwenden kann.
Spinnt man diesen Gedanken weiter sind aus Java bekannte, gefühlte 4’000’000 Zeichen lange Einzeiler möglich. Wir schauen uns dazu erst die mit Methoden angehäufte Komponente an:
<cfcomponent displayname="Flugzeug"> <cffunction name="init" access="public" output="false" returntype="flugzeug" hint="Konstruktor des Flugzeugs"> ... <cfreturn this /> </cffunction> <cffunction name="closeDoors" access="public" output="false" returntype="flugzeug" hint="Schliesst alle Tueren"> ... <cfreturn this /> </cffunction> <cffunction name="startEngine" access="public" output="false" returntype="flugzeug" hint="Startet den Motor"> ... <cfreturn this /> </cffunction> <cffunction name="doTakeOff" access="public" output="false" returntype="flugzeug" hint="Startet das Flugzeug"> ... <cfreturn this /> </cffunction> </cfcomponent>
Es gibt nun zwei Möglichkeiten um das Flugzeug zu starten.
Die meisten ColdFusion Programmierer würden sich für das gute alte Handwerk entscheiden:
<cfset local.flugzeug = createObject("component","flugzeug") />
<cfset local.flugzeug.init() />
<cfset local.flugzeug.closeDoors() />
<cfset local.flugzeug.startEngine() />
<cfset local.flugzeug.doTakeOff() />
Da die einzelnen Methoden allerdings jeweils das Objekt selbst zurückliefern, kann man sich hier jede Menge Schreibarbeit ersparen:
<cfset local.flugzeug = createObject("component","flugzeug").init().closeDoors().startEngine().doTakeOff() />
Natürlich macht dieses Vorgehen nicht immer Sinn - es soll lediglich die Funktionsweise des Objektrückgabewertes “this” verdeutlichen.
Alles in Allem bleibt nur noch zu sagen:
Nehmt euch in acht liebe Java Programmierer, auch wir können die Zeilenlänge ins unermessliche treiben!


-146 21. January 2012 um 14:16
Kick the tires and light the fires, probelm officially solved!