Sie könnten dies verbessern, indem Sie ein dependency injection Muster verwenden. Auf diese Weise muss die A
Instanz nicht über $c
oder sogar wissen, wie eine B
Instanz erstellt wird.
Stattdessen würden Sie die A
Instanz mit der Funktion Injektor liefern, das heißt ein Rückruf dass A
Bedürfnisse zu fordern, um eine Instanz von B
zu bekommen.
Auf diese Weise verlieren Sie auch nicht den Vorteil, den Sie im ursprünglichen Code hatten: Die Instanz B
wird nur bei Bedarf erstellt. Aber dieser Vorteil auch für die Schaffung der C
Instanz erweitert: es wird nur erstellt, wenn nötig:
class A {
public function doIt(Callable $factory) {
$b = 'nothing';
if (rand(0,1) == 1) {
// Call the callback to get the B instance:
$b = $factory();
}
// other code...
//
return $b;
}
}
class B { }
class C { }
$a = new A();
$b = $a->doIt(function() {
$c = new C();
return new B($c);
});
var_dump($b);
Hinweis: Wenn Sie A
brauchen nur diese Art von Dingen zu tun, dann können Sie die doIt
Methode zu schaffen betrachten als eine static
Methode. Dann würden Sie nicht brauchen, um tatsächlich eine Instanz von A
zu erstellen:
class A {
public static function doIt(Callable $factory) {
// ...etc
}
// ...
$b = A::doIt(function() {
return new B(new C());
});
Wäre es nicht besser, wenn Sie Instanz von 'C' innerhalb von 'if' in' A' erstellen? Es würde etwa 50% weniger "C" geben. –
Was wirst du später mit '$ b' machen? – chelmertz
Was hat der Zufallsteil mit der Frage zu tun? Ich glaube nicht, dass das Vorhandensein oder Fehlen dieser 'if' Aussage für den Kern der Frage einen Unterschied macht: ist es schlechtes Design? – trincot