solid и декораторы

Обсуждаем, как правильно строить приложения
Ответить
yujin1st
Сообщения: 184
Зарегистрирован: 2012.03.26, 12:03

solid и декораторы

Сообщение yujin1st » 2019.10.08, 03:40

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

Исходя из solid'а каждый компонент должен заниматься только своим делом. Допустим у нас есть какой-то процесс обработки заказов, в процессе которого могут возникать разные ситуации требующие уведомления. Исходя из того, что видел, должно быть написано два класса – один для собственно самой обработки, второй декоратор для уведомлений.

Код: Выделить всё

class OrderProcess {
  public function handle(){
    // something here
    return $res;
  }
}


class OrderProcessLogDecorator extends OrderProcess {
  private function log($info){}
  
  public function handle(){
     $res = parent::handle();
     $this->log($res);
     return $res;
  }
}
Здесь возникают следующие вопросы:
1. Как быть когда требуется уведомления в середине процесса?

Код: Выделить всё

class OrderProcess {

  public function handle(){
    // do first thing
    // do second thing
    // and something here
    return $res;
  }
}
по идее, можно было бы сделать метод log у родительского класса, и уже переопределять в дочерних,
но, ведь, согласно букве S родительский класс в принципе не должен знать о том, что такое уведомления, но как тогда декоратор получит информацию?

2. Кто отвечает за то, что создается именно декоратор, а не только основной класс?

То есть тот, кто будет запускать процесс будет ведь знать только об родительском классе и будет написано что-то вроде

Код: Выделить всё

$service = new OrderProcess();
$service->handle()
А если там еще десяток декораторов сверху от разных модулей? Как это правильно реализуется?

anton_z
Сообщения: 440
Зарегистрирован: 2017.01.15, 15:01

Re: solid и декораторы

Сообщение anton_z » 2019.10.08, 05:15

Декораторы для уведомлений не очень подходят. Используйте события. В процессе обработки в нужных местах генерируйте события с необходимыми для обработки данными.

Код: Выделить всё


$this->trigger(self::CUSTOM_EVENT_NAME, new CustomEvent($order_id, $custom_data));

Добавьте обработчики событий для рассылки уведомлений о событиях.
yujin1st писал(а):
2019.10.08, 03:40

2. Кто отвечает за то, что создается именно декоратор, а не только основной класс?
Программист :D А если без юмора, то фабрика или контейнер внедрения зависимостей/локатор сервисов.

Ответить