Adieu Interface, Hallo Handler
Apr 20
Entwickler Tagebuch, PHP, WoW Data Access No Comments
Ich habe heute einen großen Block der bisher fest definierten Basisstruktur des Moduls ausgetauscht. Die Interfaces und Basisklassen der Datenkanäle, welche die einheitlichen Öffnen- und Schließen-Methoden definierten wurde entfernt und durch eine zentrale, vererbte, Methode in WowDataChannel mit dem verheißungsvollen Namen “handleWowData()” ersetzt.
Durch das Entfernen der abstrakten Vordefinition entfallen 2 Interfaces (TemplateWowDataChannelRead & TemplateWowDataChannelWrite) und 2 abstrakte Klassen (WowDataChannelRead & WowDataChannelReadWrite). Zudem ist es nun nicht mehr nötig sich für einen Kanaltyp beim Schreiben der Klasse zu entscheiden (Read oder ReadWrite).
An der Stelle dieser starren Hierarchie tritt die Methode “handleWowData()”. Diese durchläuft alle im Kanal registrierten Handler für eine bestimmte WowData Subklasse und Zugriffsmodus (“read” oder “write”) und ruft diese Handler mit den Parametern auf die von WowDataAccess übergeben wurden. Somit ist es nun möglich mehr als einen Handler auf eine WowData Subklasse und Zugriffsart zu registrieren. Dies ermöglicht zB dem Datenkanal WowDataChannelMySQL bestimmte Daten in eine Backup-Tabelle zu schreiben, oder zB. eine Log-Tabelle mit Daten über die durchgeführten Lese- und Schreibvorgänge zu führen ohne umständliche Programmierarbeit.
Im alten Konstrukt war es nötig für jeden möglichen, im Interface definierten, Datentyp eine (oder zwei im Falle von ReadWrite Kanälen) Methode anzulegen. Wenn der Datentyp vom Kanal nicht unterstützt wurde, musste man eben Dummymethoden mit “return(false);” schreiben damit sich PHP nicht wegen abstrakten Methoden bei der Instanziierung in die Ecke stellte.
Das neue Modell erlaubt es einem nur genau die Handler zu definieren die man auch wirklich braucht. Dies geschiet derzeit noch in der “init()” Methode des jeweiligen Datenkanals, aber ich denke ich werde das noch auslagern.
Hier ist der Ausschnitt aus der derzeitigen “init()” Methode des Battle.net Datenkanals:
/** * Registers the handlers for WowData subclasses */ $this->registerWowDataHandler( 'WowDataRealm', 'read', array( 'multiSupport' => false, 'handler' => 'openRealm' ) ); $this->registerWowDataHandler( 'WowDataIcon', 'read', array( 'multiSupport' => false, 'handler' => 'openIcon' ) );
Die beiden hier in “handler” referenzierten Methoden müssen natürlich im Datenkanal definiert worden sein. Hier ist die Parameter Signatur fest vorgegeben: Parameter 1 enthält den Klassennamen der WowData Subklasse und Parameter 2 die Eingabeparameter.
RSS