Какие шаблоны кодирования или проектирования я могу использовать для обеспечения требуемой последовательности вызовов методов?

Я написал следующие строки кода:

$this->validate($group);

$this->em->persist($group);
$this->em->flush();

Метод validate сгенерирует исключение, если $ group недопустим. Проблема в том, что она кажется "хрупкой". Если бы другой разработчик изменил этот код, возможно, он случайно переместил бы метод validate, а менеджер сущностей сохранил бы объект в базе данных без его проверки.

Как вы думаете, следующие строки кода лучше или я просто переосмыслил это?

$validGroup = $this->validate($group);

$this->em->persist($validGroup);
$this->em->flush();

Есть ли шаблоны для проверки?

3 ответа

Решение

Я бы проверил внутри persist, так что невозможно сохранить неподтвержденный объект. Если em это сторонний код и вы не хотите его менять em в вашем собственном объекте, который проверяет перед записью в базу данных и использовать его везде.

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

  • возложить на сохраняемый объект ответственность за валидацию, например, требовать, чтобы все персистентные объекты имели метод is_valid. em или ваша оболочка попросила бы объект подтвердить себя и выдать исключение, если объект недействителен. Это, вероятно, лучшее решение, если вы можете добавить поведение к персистентным объектам, поскольку оно ставит идею валидности в то же место, что и данные.

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

Шаблон Pattern подходит именно для этой проблемы.

В шаблоне Шаблон абстрактный класс предоставляет определенный способ (ы)/ шаблон (ы) для выполнения своих методов. Его подклассы могут переопределять реализацию метода по мере необходимости, но вызов должен быть таким же, как определено абстрактным классом. Этот шаблон относится к категории шаблонов поведения.

abstract class MyTemplate{
   void myPersist(){
      validate();
      persist();
      flush();
}

Этот вопрос затрагивает очень важную и значительную проблему в дизайне интерфейса. Проблема заключается в "незадекларированном порядке", т. Е. Порядок вызовов методов неявный и необъявленный. Это источник множества проблем и путаницы.

Есть два способа рефакторинга (по крайней мере). Оба уже приведены выше, я просто суммирую их.

  1. Используйте результат одного вызова метода в качестве входного для другого вызова (как уже сделал OP). Это гарантирует порядок. Это применимо и полезно, когда результат первого вызова метода используется несколько раз.
  2. Вызовите первый метод внутри второго метода (или наоборот). Это также решит проблему, так как пользователь интерфейса должен вызвать один метод.
Другие вопросы по тегам