Zunächst wäre da der Begriff des Designpattern, zu Deutsch: Entwurfsmuster. Ein Muster
ist nichts anderes als eine Lösungsstrategie für ein Problem. Verschiedene Leute haben
Ihre Programmierprobleme mal näher betrachtet und analysiert, in welche typischen
Probleme man sie einteilen könnte. Dabei ist eine relativ kleine Liste mit wiederkehrenden
Problemen zusammengekommen. Einige Probleme sind recht trivial zu lösen , andere
erfordern viel mehr Aufwand. Zu diesen Problemen gibt es immer eine theoretische
Lösung und einen Ansatz mit dem man das Problem sauber lösen kann.
Zwei von den einfacheren Problemen sind "das Anmatchen von Schnittstellen" und "Resourcenverwaltung".
Ersteres Muster heißt "Wrapper" und ist jedem Programmierer bekannt, egal ob er/sie OO oder prozederal programmieren.
Nehmen wir ein typische Programmierproblem , ein altes Programm A wurde für ein neues Betriebssystem compiliert/emuliert/portiert und möchte dort nun die Serielle Schnittstelle verwenden. Auf dem alten Betriebssystem sah die Schnittstelle für das serial.device noch so aus:
class serial public setSpeed(long baud) public sendBytes(long buffer,long length) public recvBytes(long buffer,long length)
auf dem neuen System sieht die Schnittstelle nun so aus:
class serial public openSerialPort() public closeSerialPort(long port) public setSpeed(long baud) public setHandshake(long mode) public send(long port,long buffer,long length) public recv(long port,long buffer,long length)
Ohne den Quellcode des alten Programmes zu ändern ist hier nicht mehr an eine
funktion zu denken. Aus irgendeinem Grund kann oder will man dieses Programm nicht
verändern. Also muß ein Wrapper her.
Das ist eine Klasse die die alte Schnittstelle zur Verfügung stellt und
selbst die neue benutzt. Eine solche Wrapperklasse finden Sie in den com.amiga.system
Klassen. Für unser Problem könnte eine Klasse so aussehen.
class serialwrapper { Object class serial serial long port public Constructor() { port=serial.openPort() } public DeConstructor() { serial.closePort(port) } public setSpeed(long baud) { serial.setSpeed(Baud) } public sendBytes(long buffer,long length) { long res res=serial.send(long port,long buffer,long length) return res } public recvBytes(long buffer,long length) { long res res=serial.recv(long port,long buffer,long length) return res } }
Damit ist das Problem gelöst. Würde man das alte Programm ändern, wäre das natürlich der bessere Weg.
Im Abschnitt über syncronisierte Methoden haben wir das Singleton kennen gelernt.
Ein Singleton ist Konstrukt das es nur einmal in Speicher gibt. In der OOP
handelt es sich dabei um das Erzeugen des immer gleichen Objektes pro Instanz.
In Java wird dies durch einen statischen Konstruktor gelöst, in OOP4A ist dies
so nicht möglich und auch eigentlich nicht nötig.
Ein Beispiel wird dies verdeutlichen:
Class Test { static long counter static String Name "OOP4A" static String Vorname "System" static String Strasse "MC68040" static String Ort "Amiga" public getName() { return Name } public getVorname() { return Vorname } public getCounter() { return counter } public syncronized setCounter(long value) { counter==value } }
Selbst wenn von dieser Klasse beliebig viele Objektinstanzen erzeugt werden, geben alle Methoden die gleichen Variablen zurück. Wenn es sich bei diesen Variablen nicht um Strings sondern um Informationen über z.b. eine Hardware handelt, so kann mit syncronisierten Zugriffsmethoden auf diese Informatinen zugegriffen werden. Es kann auch sichergestellt werden, daß immer nur ein Task auf die Hardware zugreift. Damit handelt es sich um ein Singelton, eine Anzahl Instanzen die als eine Instanz funktioniert.