私のクラスはあまりにも多くの他のクラスに依存しており、それを改善する方法が見つかりませんでした。問題は次のようになります。
ProductRepo、ProductFactory、および ImageFactory クラスがあります。ProductRepo は、products テーブルで db を実行し、行を配列としてフェッチします。この配列は ProductFactory に渡され、Product Modal が作成されます。製品モーダルには、それにリンクされた画像もあります。
クライアントコード:
$products = $this->productRepo->findAll('...');
foreach($products as $product){
...
//get images
$images = $product->getImages();
...
}
Class ProductRepo implements ProductRepositoryInterface{
protected $productFactory;
protected $imageFactory;
public function __construct(ProductFactoryInterface $productFactory, ImageFactoryInterface $imageFactory)
{
$this->productFactory = $productFactory;
$this->imageFactory = $imageFactory;
}
public function findAll(...)
{
$result = $this->execute('....');
$products = $this->productFactory->make($result);
return $products;
}
public function getImages($productId)
{
$result = $this->execute('....');
$images = $this->imageFactory->make($result);
return $images;
}
}
Class ProductFactory implements ProductFactoryInterface{
protected $productRepo;
public function __construct(ProductRepositoryInterface $productRepo)
{
$this->productRepo = $productRepo;
}
public function make($items)
{
...
$products = [];
foreach($items as $item){
$product = new Product($item);
$item->setImages($this->productRepo->getImages($product->getId()));
$products[] = $product;
}
...
return $products;
}
}
Class ImageFactory implements ImageFactoryInterface{
public function make($items)
{
...
$images = [];
foreach($items as $item){
$image = new Image($item);
$images[] = $image;
}
...
return $images;
}
}
だから、私は次の問題があります:
循環依存 ProductRepo --> ProductFactory --> ProductRepo
これをスキップするには、setter インジェクションを使用するか、プロキシ パターンを使用します。しかし、それは良い解決策ではないと思います。皆さんは、このような問題をどのように処理していますか?
- ProductRepo は ProductFactory と ImageFactory の両方に依存します。これは、複数の工場に依存することをお勧めしますか?
問題は明確だと思います。:) ありがとうございました