Целесообразно ли для класса Factory также включать функции извлечения данных из базы данных - PullRequest
0 голосов
/ 21 ноября 2018

Одним из основных аспектов разработки программного обеспечения, с которым я борюсь, является делегирование правильной ответственности на классы в моей программе.Работая над своей первой младшей ролью, я также сталкиваюсь с множеством различных шаблонов и идей проектирования, и иногда информация может быть ошеломляющей.

Очевидно, что при создании программного обеспечения мы склонны утверждать, что класс долженбыть ответственным за одно и только одно.Он должен делать это хорошо и не более того.Таким образом, в случае шаблона Factory класс Factory должен отвечать за создание продукта и предоставление интерфейса, позволяющего директору извлекать продукт из фабрики.

Однако классу фабрики, очевидно, необходимо получать данные.чтобы построить продукт откуда-то, без входных данных у нас нет продукта на выходе.Поэтому я хотел бы знать, подходит ли включение функциональности для фабрики для запроса базы данных?Мое обоснование для этого заключается в том, что если на заводе возложена задача создания определенного продукта, то он также должен отвечать за получение данных, необходимых для создания этого продукта.Но я не уверен на 100%, если это правильно.

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

Если мы также учтем учения дяди Боба о том, что функции и методы должны иметь абсолютно не более трех параметров, то мы нарушим это правило, передав большой объем данных фабрике.Если мы сначала соберем данные в охватывающий класс перед передачей на фабрику, то мы, по сути, выполняем работу фабрики в классе хранилища.

Некоторые рекомендации будут действительно оценены, так как в моей голове строкиочень размыто, и я не уверен, как мне поступить.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Используйте 2 разных класса.

Объект доступа к данным (DAO) предоставляет абстрактный интерфейс к базе данных и скрывает ее детали.

Фабрика абстрагирует и скрывает детали созданияваших объектов.Например, для модульного тестирования вы можете настроить фабрику так, чтобы она вообще не использовала базу данных.

Чтобы уменьшить количество параметров между DAO и фабрикой, оберните множество данныхв нескольких логически связанных классах.

0 голосов
/ 21 ноября 2018

Уместно ли для класса Factory также включать функцию извлечения данных из базы данных

Мое обоснование для этого заключается в том, что если фабрике поручено создавать определенный продукт, то он также долженнести ответственность за получение данных, необходимых для создания этого продукта.Но я не уверен на 100%, если это правильно.


A product для извлечения из базы данных - это не тривиальный объект, это домен модель .Доменная модель (она же бизнес-модель, то есть сущность (которая может указывать на конкретный экземпляр)) принадлежит вашему уровню домена (он же бизнес-уровень).В связи с этим есть некоторые шаблоны, с которыми вы должны быть как минимум знакомы ...

( Активная запись ) VS ( Data Mapper + Репозиторий ) VS ( Шлюз табличных данных + Factory)

Образец активной записи нарушает принцип единой ответственности , заставляя вас реализовать логику доступа к базе данных в вашем доменесмоделировать и тесно связать их.

В идеале, чтобы избежать вышеизложенных недостатков из-за немного повышенной сложности (только в краткосрочной перспективе), мы разделяем логику доступа к базе данных на дополнительный уровень, данные уровень доступа .Одним из основных компонентов этого уровня является средство отображения данных, которое в нашем контексте (операция READ) отвечает за извлечение данных из базы данных и сопоставление их с новым экземпляром модели домена, вашим конкретным продуктом (сущностью),В более общем смысле он инкапсулирует операции CRUD в базу данных, абстрагируя эту базу данных.Его входы и выходы API являются объектами сущностей и, возможно, Объектами запросов .

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

  • Unit OfРабота
  • Ленивая загрузка
  • Карта удостоверений
  • Транзакция
  • Стратегии блокировки
  • Отображение метаданных

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

Репозиторий не часть вашего уровня доступа к данным, но вашего уровня домена.Так что это клиент вашего уровня доступа к данным.Он не инкапсулирует какую-либо логику доступа к базе данных, но использует средство отображения данных.

Репозиторий инкапсулирует логику запросов для конкретной модели домена плюс набор сущностей в памяти, которые вы ранее извлекли.Очень простой пример:

class ProductRepository
{
    private $productCollection;

    public function findById($id)
    {
        if (!$this->productCollection->has($id)) {
            $product = $this->dataMapper->get(new Query(Product::class, $id));
            $this->productCollection->add($product);
            return $product;
        }

        return $this->productCollection->get($id);
    }
}

Наконец, мы можем инкапсулировать логику доступа к базе данных в шлюз данных таблиц и использовать ее на фабрике.Это приведет к решению, аналогичному Gonen I's .Это просто реализовать, но могут быть недостатки по сравнению с решением для отображения данных.Я никогда не реализовывал, не использовал и даже не изучал этот подход, поэтому я не могу много рассказать ...


Вы бы наверняка многому научились, пытаясь реализовать все это самостоятельно, и я быпризываю вас, но имейте в виду, что если вам нужно серьезное решение, ORM могут быть вам интересны.

Если вы хотите узнать обо всем этом больше, я рекомендую MartinКнига Фаулера «Образцы корпоративной архитектуры приложений» , кратко изложенная здесь: https://www.martinfowler.com/eaaCatalog/index.html

0 голосов
/ 21 ноября 2018

Не следует использовать фабричный шаблон для построения объекта, извлеченного из базы данных.Для этой цели есть шаблон репозитория и шаблон Data Mapper .Эти шаблоны должны инкапсулировать всю логику работы с хранилищем данных.Эти шаблоны должны иметь следующую ответственность:

  • Репозиторий должен предоставлять интерфейс для бизнес-логики для работы с хранилищем данных
  • Data Mapper должен преобразовывать данные из базы данных в конкретный объект

Алгоритм взаимодействия между объектами может выглядеть следующим образом:

  • бизнес-логика использует хранилище для чтения / сохранения объектов.
  • хранилище использует Data Mapper дляпреобразовывать объекты в запросы INSERT или UPDATE и преобразовывать данные из хранилища данных в объект

Также вы можете прочитать более подробную информацию о шаблоне хранилища в C # на сайте Microsoft ивы можете увидеть C # пример шаблона репозитория

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...