am 12. Februar 2009
Ich hatte ja gestern angekündigt, dass es um Asserts geht. Im google Testing Blog wurde ein Artikel darüber verfasst, ob man bei Methoden, die Objekte erwarten prüfen sollte, ob das, was tatsächlich rein gegeben wird, nicht null ist. Jetzt ist das Handling bei C++ ein wenig anders als bei PHP, aber einen Transfer kann man ohne Probleme schaffen.
Miško Hevery, sagt in seinem Beitrag, dass er im Konstruktor nicht auf null prüfen würde, da dies das Testen erschwert. So ist es einfacher nur einen Teil der Parameter zu übergeben, was einem klar macht, welcher Part denn nun in diesem Test untersucht wird. Klingt übersichtlicher.
Versuchen wir das mal auf PHP zu übertragen. Ich habe einen Konstruktor, der verlangt Objekte in seiner Signatur. Laut Hevery sollte man nun die Objkte als optional deklarieren ($object = null). Da ich eh zu jeder Äquivalenzklasse genau einen Test schreibe, ist die Chance groß, dass ich die Parameter separat abhandeln werde und somit einen der Objekte sinnvoll instanzieren werde und die anderen eben nicht.
Jetzt kommt das Problem. Was beim Testen noch recht angenehm ist, wird bei der Handhabung zu einem Defizit. Ein Objekt sollte jeder Zeit einen gültigen Zustand haben, aus diesem Grund sollte muss man auch alle “lebenswichtigen” Parameter mit in den Konstruktor packen. Wenn diese nur optional sind, dann ist das Objekt nicht vollständig. Hevery geht auf diesen Punkt auch ein, meiner Meinung nach aber nicht konkret genug. Was ist schon ein Haus ohne Dach?
Die Lösung der google Jungs ist ganz einfach. Wir machen eine Factory, über die ich meine Klassen instanziere und schon habe ich immer gültige Objekte, ausser halt in den Test, wo ich sie auch gar nicht brauche. Wenn man so drüber nachdenkt, dann hat er recht und alle sind glücklich. Das Problem bei PHP ist aber die Sichtbarkeit des Konstruktors. Definiere ich ihn als public, so kann die factory Objekte instanzieren, jeder andere aber auch. Ich habe also wieder die Chance, unvollständige Objekte zu erstellen. Packt man die factory in die Klasse selbst mit rein, sieht es schon ganz anders aus, jetzt kann nur noch die Fabrikmethode Instanzen erstellen und diese sind auch immer gültig. Aber wie komme ich jetzt mit meinem Test an ein “Teilobjekt”? Geht nicht. Ist also doch nicht so einfach. Was fehlt, wäre eine Package/Komponenten weite Sichtbarkeit. Einige Programmiersprache, wie zum Beispiel Java bieten so etwas an. Soviel ich wei0 gehört c++ aber nicht dazu. Vielleicht könnte man hier mit “friend” arbeiten, aber hier bin ich wieder nur am raten und das sollte ich lieber sein lassen.
Fazit: So lange es keine zusätzliche Sichtbarkeit gibt, solltet ihr versuchen eure Objekte zu jedem Zeitpunkt gültig zu halten. Die Handhabung wird so einfach sauberer und besser verständlich. Optionale Parameter sollten wirklich nur existieren, wenn sie wirklich optional sind, also wenn sie nicht unbedingt benötigt werden.