Size: a a a

2020 December 22

ES

Eugene She in Yii Framework 3
Извини, не очень понял
источник

DS

Dmitriy S in Yii Framework 3
Так там методов нет, что там смотреть?
источник

ES

Eugene She in Yii Framework 3
Dmitriy S
Так там методов нет, что там смотреть?
Так суть вопроса в этом и есть - на конструкторы распространяется LSP или нет
источник

DS

Dmitriy S in Yii Framework 3
Вообще не нарушает, конструктор там ни при чем. LSP - это возможность заменить один класс другим без потери функционала.
источник

DS

Dmitriy S in Yii Framework 3
Типа у тебя стоит MessageNotifier, все работает, потом ты меняешь его на DealIndexationResult и все должно продолжать работать
источник

ES

Eugene She in Yii Framework 3
Dmitriy S
Вообще не нарушает, конструктор там ни при чем. LSP - это возможность заменить один класс другим без потери функционала.
То есть получается создание объекта может быть любым каким угодно, главное чтобы интерфейс был соблюден
источник

DS

Dmitriy S in Yii Framework 3
Eugene She
То есть получается создание объекта может быть любым каким угодно, главное чтобы интерфейс был соблюден
Ну да
источник

ES

Eugene She in Yii Framework 3
@yiiliveext  Спасибо
источник

PC

Pavel Chaplygin in Yii Framework 3
Имхо для таких случаев лучше использовать фабричный метод
class DealIndexationResult extends MessageNotifier
{
   private Deal $deal;
   
   public static function fromDeal(Deal $deal): static
   {
       $instance = new static($this->getMessage($deal));
       $instance->deal = $deal;
       return $instance;
   }
}

Хотя да, на конструкторы можно не распространять LSP, тут уже зависит от контекста
источник

DS

Dmitriy S in Yii Framework 3
Dmitriy S
Ну да
Собственно, это наследование, так что там публичный интерфейс в любом случае будет соблюден
источник

ES

Eugene She in Yii Framework 3
Pavel Chaplygin
Имхо для таких случаев лучше использовать фабричный метод
class DealIndexationResult extends MessageNotifier
{
   private Deal $deal;
   
   public static function fromDeal(Deal $deal): static
   {
       $instance = new static($this->getMessage($deal));
       $instance->deal = $deal;
       return $instance;
   }
}

Хотя да, на конструкторы можно не распространять LSP, тут уже зависит от контекста
Спасибо за ответ
источник

Д

Дмитрий in Yii Framework 3
Pavel Chaplygin
Имхо для таких случаев лучше использовать фабричный метод
class DealIndexationResult extends MessageNotifier
{
   private Deal $deal;
   
   public static function fromDeal(Deal $deal): static
   {
       $instance = new static($this->getMessage($deal));
       $instance->deal = $deal;
       return $instance;
   }
}

Хотя да, на конструкторы можно не распространять LSP, тут уже зависит от контекста
Всё равно лучше определить свои параметры конструктора. Из-за того, что родительский интерфейс конструктора может сломаться, дочерний класс становится зависимым и хрупким.
источник

ES

Eugene She in Yii Framework 3
Дмитрий
Всё равно лучше определить свои параметры конструктора. Из-за того, что родительский интерфейс конструктора может сломаться, дочерний класс становится зависимым и хрупким.
Имеется ввиду копипастить родительский конструктор внутрь дочернего класса?
источник

Д

Дмитрий in Yii Framework 3
Скорее переопределять, если есть различия.
Если всё может создаваться только по Deal, то и фабричный метод не нужен будет. В конструктор передаем объект Deal, а он уже распаковывает себя.
В том примере можно сделать new DealIndexationResult($msg) и класс будет невалидным, т.к. свойство private Deal $deal будет отсутствовать.
источник

DS

Dmitriy S in Yii Framework 3
Дмитрий
Скорее переопределять, если есть различия.
Если всё может создаваться только по Deal, то и фабричный метод не нужен будет. В конструктор передаем объект Deal, а он уже распаковывает себя.
В том примере можно сделать new DealIndexationResult($msg) и класс будет невалидным, т.к. свойство private Deal $deal будет отсутствовать.
Там Deal в конструкторе, как ты туда $msg передашь?
источник

Д

Дмитрий in Yii Framework 3
Pavel Chaplygin
Имхо для таких случаев лучше использовать фабричный метод
class DealIndexationResult extends MessageNotifier
{
   private Deal $deal;
   
   public static function fromDeal(Deal $deal): static
   {
       $instance = new static($this->getMessage($deal));
       $instance->deal = $deal;
       return $instance;
   }
}

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

DS

Dmitriy S in Yii Framework 3
А, ты о коде с фабричным методом. Там приватный конструктор надо
источник

Д

Дмитрий in Yii Framework 3
Для создания объектов сделали конструкторы, а вы их выкидываете)
источник

DS

Dmitriy S in Yii Framework 3
Дмитрий
Для создания объектов сделали конструкторы, а вы их выкидываете)
Та мне вариант с конструктором норм)
источник

Д

Дмитрий in Yii Framework 3
а как мне заставить cycle обновить сущность из базы принудительно?
источник