Мои классы зависят от слишком большого количества других классов, и я не мог найти способы его улучшить. Проблема выглядит примерно так:Как разбить и улучшить циклическую зависимость без использования прокси-шаблона?
У меня есть классы ProductRepo, ProductFactory и ImageFactory. ProductRepo делает db вещь в таблице продуктов и выбирает строки как массив. Этот массив передается в ProductFactory для создания модальности продукта. В товарных модалях также есть изображения, связанные с ним.
код клиента:
$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
Чтобы пропустить это, я могу используйте инъекцию сеттера или используйте прокси-шаблон. Но я думаю, что это не было бы хорошим решением. Как вы, ребята, справляетесь с такими проблемами?
- ProductRepo зависит как от ProductFactory, так и от ImageFactory. Это хорошая практика, зависящая от более чем одной фабрики?
Я думаю, что проблемы ясны. :) Спасибо
BTW, я использую PHP и удалил реализацию ProductHydrator и ImageHydrator экземпляров внутри классов Factory, чтобы сделать эту проблему просто. – Laxman