Moin!
Hello,
$printer = new NormalPrinter();
$calculator = new Calculator();
Spätestens hier würde ich als Teamleiter laut aufschreien. Weißt Du, warum?
$calculator->printerDelegate = $printer; // Wir setzen den normalen Drucker als delegate ein
Dependency Injection bzw. Inversion of Control!
Wenn der Calculator zum Funktionieren einen Printer benötigt, dann sollte man ihn nicht instanziieren dürfen, ohne ihm ein Printer-Objekt mitzugeben, welches das notwendige Interface implementiert.
Also:
$calculator = new Calculator(new NormalPrinter());
An dieser Stelle kann man natürlich diskutieren, ob sowas rein für die Anwendung selbst sinnvoll ist. Aber spätestens wenn es an's Testen geht, wird man eben gerade KEIN echtes Papier verdrucken wollen, nur um das korrekte Funktionieren des Rechners zu prüfen. Man will auch keine Ausgabe auf STDOUT wieder einfangen und ggf. parsen. Man will ein Mock-Objekt an den Calculator geben, welches ebenfalls das gewünschte Interface implementiert, aber intern nichts druckt, sondern nur die Aufrufe seiner Methoden inkl. Parameter registriert und eventuell auch Rückgabewerte liefert - und im Test jeweils entsprechend konfiguriert ist.
- Sven Rautenberg