Size: a a a

2020 May 28

A

Aleksandr Khristenko in PHP
Maxim Kainov
Сложно это представить. Как абстрактный класс?
Можно сказать и так. Только мы не можем отнаследоватся от нескольких абстрактных классов. А использовать несколько интерфейсов/трейтов можем.
источник

M

Maxim Kainov in PHP
Aleksandr Khristenko
Можно сказать и так. Только мы не можем отнаследоватся от нескольких абстрактных классов. А использовать несколько интерфейсов/трейтов можем.
По идее трейты и придуманы для множественного наследования
источник

MM

Maksim Masiukevich in PHP
Maxim Kainov
По идее трейты и придуманы для множественного наследования
Давно?)
источник

A

Aleksandr Khristenko in PHP
Maxim Kainov
По идее трейты и придуманы для множественного наследования
Мне вообще пофиг, зачем их придумывали в пхп. Я лишь сказал, где, по-моему, их оправдано использовать.
источник

M

Maxim Kainov in PHP
Maksim Masiukevich
Давно?)
Давно )
источник

MM

Maksim Masiukevich in PHP
Ясна
источник

ВУ

Валентин Удальцов... in PHP
Антон
Оригинальный не нашел, поэтому написал по памяти. Если ошибся в реализации оригинальной идеи, пусть автор простит
https://pastebin.com/wCaZbA6j
я не скрываю, у меня есть такой PR в messenger: https://github.com/symfony/symfony/pull/34310/files#diff-83948907a24dc6a7916f694811a00ce1R19

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

но разберём этот кейс. допустим, мы решиил юзать messenger и контракт MessageRecordingEntityInterface будет использоваться на агрегатах. агрегат — это всегда кастом, потому что это часть уникальной бизнес-логики твоего проекта. контракт агрегата — это порождаемые им события. в этом смысле это его единственная ответственность — превратить команды в события. поэтому трейт нафиг, на базе этого интерфейса делаем абстрактный класс Aggregate (на стороне проекта, не в Symfony) и от него экстендим все агрегаты.

а в идеале как у @desper1989  в service-bus — аннотация на методе, из котрого можно забрать события. тогда и интерфейс не нужен никакой.
источник

M

Maxim Kainov in PHP
Aleksandr Khristenko
Мне вообще пофиг, зачем их придумывали в пхп. Я лишь сказал, где, по-моему, их оправдано использовать.
Надо тогда искать случаи когда нужно множественное наследование
источник

A

Aleksandr Khristenko in PHP
Maxim Kainov
Надо тогда искать случаи когда нужно множественное наследование
Семантически это не является множественным наследованием.
Это реализация нескольких интерфейсов.
источник

ВУ

Валентин Удальцов... in PHP
наследование — это зло, а множественное наследование — это множественное зло))
источник

MM

Maksim Masiukevich in PHP
Aleksandr Khristenko
Семантически это не является множественным наследованием.
Это реализация нескольких интерфейсов.
Это даже не реализация нескольких интерфейсов. Это совпадение)
источник

A

Aleksandr Khristenko in PHP
Maksim Masiukevich
Это даже не реализация нескольких интерфейсов. Это совпадение)
?
источник

MM

Maksim Masiukevich in PHP
Ибо твой трейт про интерфейс ничего не знает
источник

AT

Andre Teros in PHP
Валентин Удальцов
наследование — это зло, а множественное наследование — это множественное зло))
ты же сам только что абстрактный класс предлагал)
источник

M

Maxim Kainov in PHP
Aleksandr Khristenko
Семантически это не является множественным наследованием.
Это реализация нескольких интерфейсов.
Трейт + интерфейс это наследование, получается
источник

A

Aleksandr Khristenko in PHP
Maksim Masiukevich
Ибо твой трейт про интерфейс ничего не знает
Я говорил про случай, почему нельзя заменит interface + trait на абстрактный класс.
источник

MM

Maksim Masiukevich in PHP
Валентин Удальцов
я не скрываю, у меня есть такой PR в messenger: https://github.com/symfony/symfony/pull/34310/files#diff-83948907a24dc6a7916f694811a00ce1R19

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

но разберём этот кейс. допустим, мы решиил юзать messenger и контракт MessageRecordingEntityInterface будет использоваться на агрегатах. агрегат — это всегда кастом, потому что это часть уникальной бизнес-логики твоего проекта. контракт агрегата — это порождаемые им события. в этом смысле это его единственная ответственность — превратить команды в события. поэтому трейт нафиг, на базе этого интерфейса делаем абстрактный класс Aggregate (на стороне проекта, не в Symfony) и от него экстендим все агрегаты.

а в идеале как у @desper1989  в service-bus — аннотация на методе, из котрого можно забрать события. тогда и интерфейс не нужен никакой.
У меня в аннотации обработчика можно прям залогать в каком хочешь виде
источник

A

Aleksandr Khristenko in PHP
Maxim Kainov
Трейт + интерфейс это наследование, получается
Имхо нет. У тебя нет класса родителя. И инстанса родителя ты же не можешь создать.
источник

DD

Dauren Dauren in PHP
Каждую секунду непонятные запросы на сайт. Что делать?
источник

M

Maxim Kainov in PHP
Aleksandr Khristenko
Имхо нет. У тебя нет класса родителя. И инстанса родителя ты же не можешь создать.
Интерфейс это и есть абстрактный класс
источник