@topuserman

Является ли это (делегирование) нарушением принципа единственной ответственности – SRP?

Предположим у меня есть класс Order, который должен уметь получить список товаров из разных источников, помимо работы с заказами.

Логично, чтобы работа с хранилищем товаров, будет заниматься отдельный класс - ProductList, но для выборки товаров, этот класс нужно конфигурировать, устанавливать разные параметры, драйверы и зависимости.

Теперь, если в классе Order, создавать отдельный метод getProductList, в котором будет инициализирован класс ProductList, нужным образом конфигурирован, этот метод будет возвращать список товаров по переданным критериям.

Два вопроса:

1. Является ли это правильным делегированием ?
2. Нарушает ли это принцип SRP, если класс Order теперь умеет помимо работы с заказами, получать список товаров из разных источников ?

PS: пример не совсем удачный, но суть одна.
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Если в объекте Order будет зависимость ProductList, то не нарушает SRP, тк этот объект (судя по названию) VO и состояние этого объекта необходимо для работы Order.

Но вызывает вопросы способ работы с ним:
создавать отдельный метод getProductList, в котором будет инициализирован класс

Почему не в конструкторе объекта Order? Или почему не из зависимости извне (DI) вообще получать товары?
class Order
{
     private ProductStorageInterface $products;

     public function __construct(ProductStorageInterface $products) 
     {
           $this->products = $products;
     }
     
     public function refundProduct(Product $product): void
     {
           // логика возврата товара 
           // и соответственно изменение  состава $this->products
     }
}


И товары могут подгрузиться из памяти, БД или АПИ внешней.
Тут заодно и принцип инверсии зависимости

UPD: Не называйте метод getProductList(), это ужасно! Называйте как есть: createProductList() или loadProductList(), ну в зависимости от логики.
get -- слишком общее слово и совсем не говорит о том, что происходит. Если все кругом будет сервисами (service) с методами get, то вам весело будет жить...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы