Mocking ist ja quasi eine Entkopplung. Das Beispiel ausführlich und da habe ich noch einmal das Wesentliche hervorgehoben, was Methoden einer Factory diesbezüglich auzeichnet: Sie definieren keine Package, sie sind classless.
Du kannst Perl mögen oder nicht, Perl OOP Implementierung erscheint mir in jedem Punkt logisch und in vielen praktischen Fällen logischer als OOP Implementierungen anderer PLs.
Jede PL kennt Objekte die jedoch nicht immer gleich sichtbar machen, ob sie Instanzen von Klassen sind oder nur Objekte. Diesem Umstand kommt bless() entgegen, das segnet ein Objekt mit dem Namen einer Klasse und macht damit das Objekt zu einer Klasseninstanz.
Was absolut brr.. pfui
wäre, ist eine Klasseninstanz umzublessen. Das ist in Perl möglich, weil Perl seine OOP Regeln nicht so streng und pragmatisch definiert wie andere PLs.
Das heißt aber noch lange nicht, dass man mit Perl deswegen ständig mit allen Chartas der OOP brechen muss was manche Schurken tatsächlich unverfroren machen und sich damit auch noch brüsten diese Ferkel.
So ist in meinem Beispiel die Klasse Mock ja selbst eine Attrappe und muss gar nicht Mock heißen sondern es kann eine beliebige Klasse sein, auch die main-Class die es in Perl grundsätzlich immer gibt.
Definiert PHP denn eine main-Class, bzw. ist es in einem Verbund von mehreren zusammenwirkenden PHP-Skriptn immer gleich sichbar wo sich die main gerade befindet? Klares Nein.
$mock = bless{}
ohne weiteres Argument nimmt die aktuelle __PACKAGE__
und ja natürlich wird man zur Qualitätssicherung eine dedizierte package Mock
einschließlich einer Konfiguration definieren damit alles seine Ordnung hat und übersichtlich bleibt.
Legacy DI schließlich, wo die Abhängigkeit außerhalb der Klasse hergestellt wird, löst die Kapselung auf. Das kann so gewünscht sein, bitteschön aber es ist ein Bruch mit der OOP Charta. Und führt vielfach zu Problemen, wer damit schafft, wird schon wissen was er tut. Die meisten die ich kennenlernen durfte, wusten es jedoch nicht. Die haben die Sache noch verschlimmert indem sie den Ablauf ihrer Programme dann auch noch über klassenweite und gar globale Variablen steuerten die von Instanzen verändert werden durften.
Static hat man daher in Perl bewusst hinausgezögert und das Schlüsselwort static erst ab 5.10 eingeführt. Und auch ab da muss dieses Feature explizit eingeschaltet werden damit man daran erinnert wird, dass es auch zweckmäßiger geht, denn: Im Effekt ist jede Property einer Instanz quasi statisch solange die Instanz lebt.
Fazit: Mit Mocking erkauft man sich eine Qualitätssicherung um den Preis die OOP Charta stets irgendwo aufzubrechen. Und sei es nur die Kapselung.
Schöne Grüße, scheiß Wetter 😉