MeinPHP: Typsicheres Set – Auflösung Teil 2
So Tag 2 der Auflösung (Teil 1). Ich hoffe mal, dass ihr euch alle vor Spannung fast nicht mehr halten könnte. Heute will ich kurz die Lösung, die Timo und ich uns ausgedacht habe skizzieren. Vielleicht noch das ein oder andere UML Klassendiagramm und das wars dann auch schon. Wie fangen wir also an. Ein kurzes Resumé. Wir brauchen eine Klasse, die bestimmte Typen halten kann, aber jedes Element nur genau ein mal zulässt. Nicht mehr, nicht weniger.
Zu Beginn betrachten wir uns die Hilfsmittel, die PHP uns von Hause aus mitgibt. Wie es ja schon einige von euch gemacht haben, haben wir uns die, unserer Meinung nach, die best passendste Schnittstelle aus der SPL als Grundlage genommen. Dem Iterator Interface. Wichtig war uns, dass wir das Set später ganz einfach durchiterieren können, um so auf alle Elemente zugreifen zu können, die vorhanden sind. Und genau dies macht ein Iterator.
Getreu nach dem Paradigma „Separation of Concerns“ brauchen wir jetzt noch eine Klasse, die dafür sorgt, das Daten vorgehalten werden können. Wir haben diese Klasse Collection, in Anlehnung an die Java Klasse, genannt. Ein schönes Interface drumrum und alles bestens.Wir können jetzt also durchiterieren und Daten sammeln. Wichtig war uns, dass wir die Collection unabhängig vom Set verwenden können.
Im nächsten Schritt wollen wir das Set, eine spezielle Collection kreieren. Dafür leiten wir die Collection ab und verbieten, dass ein Element mehrmals vorkommen kann. Der letzte Schritt, ist die Typsicherheit. Hier haben wir uns für das Decorator Pattern entschieden. Uns war wichtig, dass dieses spezielle Set auch mit anderen Einschränkungen kombiniert werden kann.
Als Klassendiagramm sieht es also wie folgt aus:
Dass viele der Methoden einer Collection einen boolschen Wert zurückliefern, liegt an dem Java Interface, an das wir uns gehalten haben. Diese Methoden geben true zurück. sobald sich die Collection durch Aufruf die Collection verändert hat. retainAll
erzeugt den Schnitt zweier Mengen. Neben den hier Aufgeführten Klassen gibt es noch drei Exceptions, die wir eingeführt haben.
Wie wir das ganze dann tatsächlich implementiert haben, zeige ich euch morgen.