Objektorientiertes programmieren mit ColdFusion MX

Marco Betschart, Webapplikations-Programmierer, bis 2010

Auch in ColdFusion lassen sich die Vorteile der Objektorientierten Programmierung nutzen. Das Schalgwort hier heisst «Komponente». Einige von euch werden Komponenten nur als Funktionsbibliotheken kennen, anderen sagt das wahrscheinlich gar nichts. Auf jeden Fall können CF Komponenten viel mehr, als nur Methoden bereitstellen. Es lassen sich mit ihnen Objekte repräsentieren. Diese Objekte besitzen Methoden UND Eigenschaften.

Folgender Pseudocode repräsentiert zum Beispiel einen Biber mithilfe einer ColdFusion Komponente:

1<cfcomponent displayname="Biber">
2    <cfproperty name="Size" type="numeric" required="yes" default="1.5" hint="Grösse in m">
3    <cfproperty name="Nahrung" type="string" required="no" default="Holz" hint="Nahrung">
4    <cfset attr.size = 1.5>
5    <cfset attr.nahrung = "holz">
6</cfcomponent>
Bekannt sein dürfte, dass der CFC-Explorer automatisch eine Dokumentation der Komponente erstellt, wenn im Browser direkt die Komponente aufgerufen wird. Die cfproperty-Tags erweitern in diesem Fall nur die Doku (das ist bei Webservices anders). Mithilfe des cfproperty-Tags lassen sich allerdings keine Variablen setzen! Dafür benötigt man die nächsten zwei Zeilen Code. Um die Eigenschaften privat zu machen, wurden sie im attr Scope definiert. Würde man als Scope Namen den this Ausdruck verwenden, wären die Eigenschaften public, also öffentlich einsehbar. Nun wollen wir aber auch von ausserhalb auf die Eigenschaften zugreifen und sie verändern können. Dazu definiert man die sogenannten "getter" und "setter":
1<cffunction name="getNahrung" access="public" output="false" returntype="string">
2    <cfreturn attr.nahrung>
3</cffunction><cffunction name="setNahrung" access="public" output="false" returntype="void">
4    <cfargument name="nahrung" required="yes" type="string" hint="Nahrung des Bibers">
5    <cfset attr.nahrung = Trim(arguments.nahrung)>
6</cffunction><cffunction name="getSize" access="public" output="false" returntype="numeric">
7    <cfreturn attr.size>
8</cffunction><cffunction name="setSize" access="public" output="false" returntype="void">
9    <cfargument name="size" required="yes" type="numeric" hint="Grösse des Bibers in m">
10    <cfif Not arguments.size LT 0.2>
11        <cfset attr.size = arguments.size>
12    </cfif>
Hier sieht man einen der grossen Vorteile, die die objektorientierte Programmierung mit sich zieht: Die Werte können durch das Objekt selbst auf ihre Gültigkeit geprüft werden und sind nicht verstreut irgendwo im Code. Die setSize() Methode definiert hier das es keinen Biber gibt, der kleiner als 20cm ist. ColdFusion unterstützt auch die Vererbung von Methoden und Eigenschaften. Deshalb wollen wir hier (vollständigkeitshalber) eine Komponente anlegen, welche die gleichen Eigenschaften und Methoden besitzt wie die Biber-Komponente:
1<cfcomponent extends="biber" displayname="Koala">
2    <cfset attr.nahrung = "eukalyptus">
3</cfcomponent>
Sie setzt lediglich die Standardnahrung des Koalas neu, die Methoden der Biber-Komponente stehen auch in ihr zur Verfügung.

Als letztes nun noch kurz zum Thema Argumente: Es lassen sich nicht nur die Standardargument-Typen "string","numeric" etc. übergeben. Mit der Angabe eines Komponentennamens (zum Beispiel.: cfc.tier) lassen sich auch Objekte eines spezifischen Typs übergeben, wodurch man innerhalb der Funktion auf die Eigenschaften und Methoden des Objekts Zugriff bekommt.