Işte, biz daha sonra Java içine yeniden programlanmış olacak bir PHP uygulama geliştiriyoruz. Java bazı temel bilgi ile, herhangi bir baş ağrısı olmadan, her şeyi kolayca yeniden yazılması için tasarım için çalışıyoruz. Biz yapraklar yöntemlerin büyük sayıda composite pattern uygulamaya çalıştığımızda ilginç bir sorun çıktı.
Ne biz (arayüzleri kullanarak değil, sadece hızlı bir örnek) elde etmek için çalışıyoruz:
class Composite {
...
}
class LeafOne {
public function Foo( );
public function Moo( );
}
class LeafTwo {
public function Bar( );
public function Baz( );
}
$c = new Composite( Array( new LeafOne( ), new LeafTwo( ) ) );
// will call method Foo in all classes in composite that contain this method
$c->Foo( );
// same with Bar
$c->Bar( );
It seems like pretty much classic Composite pattern, but problem is that we will have quite many leaf classes and each of them might have ~5 methods (of which few might be different than others). One of our solutions, which seems to be the best one so far and might actually work, is using __call magic method to call methods in leafs. Unfortunately, we don't know if there is an equivalent of it in Java.
Yani asıl soru şudur: Bu iyi bir çözüm sonunda kolayca Java içine yeniden kodlanmış olacaktır kodu kullanarak, var mı? Yoksa başka bir çözüm önerirsiniz? Belki burada kullanabilirsiniz bazı farklı, daha iyi bir desen var.
Durumda belirsiz bir şey var, sadece isteyin ve ben bu yazıyı düzenlemek edeceğiz.
Edit:
Gerçek sorun, her yaprak sınıf içerir değil, örneğin, yöntem Baz. Her sınıfta Baz aramak için basit bir foreach kullandıysanız, bu yöntemi içermeyen bazı sınıflar vardır gibi, kullanım hataları demet verirdim. Klasik çözüm her yaprak sınıftan itibaren her yöntem farklı uygulama ile her biri, Kompozit sınıfa uygulanan sahip olacaktır. Ama bu bizim birleşik sınıf büyük ve kullandığımız yöntemleri miktarda dağınık olur.
Yani olağan çözüm Bu gibi (Kompozit sınıf) görünecektir:
class Composite implements Fooable, Bazable {
...
public function Foo( ) {
foreach( $this->classes as $class ) {
$class->Foo( );
}
}
public function Baz( ) {
...
}
}
Gerçek karmaşa haline bizim kod önlemek için, biz böyle bir şey düşünüyorduk:
class Composite {
...
public function __call( ) {
// implementation
}
}
Ama biz iyi bir çözüm eğer gerçekten emin değilseniz ve (düzenlemeden önce zaten sorulmuş gibi) Java da benzer bir şey varsa.