ХабрПостыНовостиМегапосты?

Что не так с трейтами?



Кажется, стоит просто сказать «трейты» — и начнется холивар. Мы уже случайно начали один пару недель назад. А затем решили разобраться. Что это в большей степени? Способ снизить дублирования кода. Быстрый способ внедрить функциональность. Дефолтная реализация интерфейса. Или древнее зло?

Рассмотрим с примерами — в эту среду вечером на ютубе. А ниже можно ознакомиться с позициями участников трансляции.

Как все будет. Мы устроим что-то близкое к дебатам: серия раундов, оппоненты, модератор. И голосование за приглянувшуюся вам позицию.

Валентин Удальцов (автор канала «Пых») выступит ярым противником трейтов. Роман Пронский (PHP-Дайджест) — ведущим. Ну а остальные ребята будут защищать доброе имя трейтов.


Кирилл Несмеянов, developer advocate в SpiralScout, член программного комитета PHP Russia


— Что не так с трейтами?

— Да всё с ними «так»: это инструмент — применяй правильно. Забивать гвозди микроскопом — много ума не надо. Проблема в тех, кто пытается запихнуть их туда, куда не следует, а потом такие: «Да ну это всё, пойду лучше во фронтенд».

— Почему тебе интересно поговорить об этом?

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

— Сможет ли 2-часовой онлайн заставить тебя поменять свою позицию?

— Нет.


Сергей Жук, тимлид в Skyeng, ведущий подкаста «Между Скобок»


— Что не так с трейтами?

— Как и любой инструмент, трейт должен быть в арсенале разработчика. Но стоит использовать его правильно: например, для шаринга каких-то методов-хелперов между несвязанными классами в библиотеках, где мы хотим дать пользователям возможность расширять функционал без наследования или DI.

Конечно трейты могут стать «leaky». И чтобы не выстрелить себе в ногу, я для себя выделил три правила:


— Почему тебе интересно поговорить об этом?

— Многие разработчики категорически против этой возможности PHP. Было бы интересно поспорить с ними. Пока для меня это выглядит как: «Я попробовал git rebase -> испортил себе репозиторий -> git rebase зло».

— Сможет ли 2-часовой онлайн заставить тебя поменять свою позицию?

— Да.


Иван Лещев, разработчик в BotHelp.io


— Что не так с трейтами?

— Все ок, просто кто-то не умеет их правильно готовить.

— Почему тебе интересно поговорить об этом?

— Интересно посмотреть на примеры хорошего и плохого дизайна.

— Сможет ли 2-часовой онлайн заставить тебя поменять свою позицию?

— Скорее нет, чем да.


Александр Дубовской, технический директор в Radon, активный участник Drupal-сообщества


— Что не так с трейтами?

— Всё так. Просто это молоток, которым вполне можно и по пальцу ударить.

Холивар тянется как минимум со статьи Энтони Феррара 2011 года Are traits the new eval. Но тогда было мало красивых примеров, за которыми сейчас можно легко сходить в Symfony-компоненты. Тот же LockableTrait жутко удобен и понятен зачем и почему)

— Почему тебе интересно поговорить об этом?

— Любые архитектурные споры — это интересно. Как минимум, услышишь свежие точки зрения и узнаешь, что еще почитать.

— Сможет ли 2-часовой онлайн заставить тебя поменять свою позицию?

— Нет.

p.s.
Никита Попов: Трейты не люблю особо. Я участвую в разработке с PHP 5.5, а их добавили в 5.4. Если бы я тогда был, их бы точно не добавили.

p.p.s. Если есть отличная история, как трейты всех спасли или испортили, пожалуйста, расскажите ее на стриме 23 декабря. И в любом случае — подключайтесь.
@spasibo_kep
21.12.2020 14:34 UTC
Первоисточник

Комментарии

@psycho-coder
21.12.2020 11:43 UTC
+2
Никита Попов: Трейты не люблю особо. Я участвую в разработке с PHP 5.5, а их добавили в 5.4. Если бы я тогда был, их бы точно не добавили.

Аргументы есть какие-нибудь, или это чисто субъективное мнение?
21.12.2020 17:22 UTC
0
Это вырвано из интервью, у Никиты не было времени дать полный ответ, да его и не просили. Но я осмелюсь предположить, что имелось введу, что он бы активно участвовал в RFC и предложил бы более лучшее решение, но на тот момент, такой возможности у него не было.
21.12.2020 17:27 UTC
0
Понял, спасибо.
22.12.2020 09:31 UTC
0
Привет! Да, как верно заметили, времени в итервью этому было уделено немного, вот тут можно посмотреть ответы Никиты и Стогова в оригинале.
22.12.2020 11:39 UTC
0
Благодарю!
@tzlom
21.12.2020 12:00 UTC
+3
Вы пригласили 4х человек с одинаковым взглядом на проблему и решили подискутировать? А собственно говоря о чём? О том как их «правильно» готовить?
Зовите тогда Попова чтобы хоть кто-то защищал позицию «трейты зло»
21.12.2020 14:13 UTC
0

Возможно, неявно написали, но позицию "трейты зло" поддерживает Валентин Удальцов.

21.12.2020 21:00 UTC
+1
Валентин Удальцов (автор канала «Пых») выступит ярым противником трейтов.
21.12.2020 22:08 UTC
+1
Я буду против них четверых в позиции «трейты зло». Вроде бы в самом начале статьи об этом написано :)
@Fortop
21.12.2020 13:36 UTC
+3

Трейты это как деление на ноль.
В общем случае зло/нельзя.


Но если ты сильно умный и умеешь в вышку, то можно.

@
21.12.2020 15:20 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
21.12.2020 16:18 UTC
+2

Никто не знает что это значит, но звучит модно.

@Graid
21.12.2020 21:13 UTC
+4
Дайте угадаю. Валентин скажет, что трейты ухудшают качество кода. Оппоненты скажут, что трейты помогают писать код. Все будут правы, и где-то на фоне заиграет идийская музыка.
22.12.2020 08:31 UTC
0
и все начнут танцевать?)
22.12.2020 20:29 UTC
+1
Нет, все разойдутся по домам и немного возрастет энтропия.
22.12.2020 09:32 UTC
0
и где-то на фоне заиграет идийская музыка

Спасибо за идею!
@L-N
22.12.2020 09:32 UTC
+2
Как по мне, зло — это использование статических вызовов вместо того, чтобы использовать возможности ООП, идеология Yii тому яркий пример.
@
22.12.2020 09:57 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
26.12.2020 07:43 UTC
0

Что такого плохого в трейтах? Я в начале карьеры наследованием такой лапши написал, что трейтам даже не снилось

26.12.2020 16:56 UTC
0
Рассматривайте трейт как неявную зависимость.

И после этого оцените, насколько это плохо.
03.01.2021 08:02 UTC
0

Можно пример? Не понял что вы имеете ввиду

24.01.2021 15:21 UTC
0
Смотрите.
Если вы используете трейты, то лучше чтобы они реализовывали какие-то конкретные интерфейсы (если без интерфейсов, то вообще все печально).

Так вот наличие реализации интерфейса в трейте для класса выглядит как внешняя зависимость.
Но обычно зависимость мы подключаем как?

class Service 
{
    private SomeInterface $service;

    public function __construct(SomeInterface $service)
    {
        $this->service = $service;
    }

    public function fooMethod()
    {
        $this->service->fooMethodFromInterface();
    }
}


Что происходит в случае трейта?

class Service implements SomeInterface
{
    use SomeTrait;
}


У нас интерфейс реализуется в самом классе, но… барабанная дробь… не самим классом.
Т.е. это вроде не зависимость (в самом же классе реализован метод), и в то же время это нечто внешнее по отношению к классу, т.е. таки зависимость.
25.01.2021 15:00 UTC
0
Да, но трейты же хороши не для внедрения сервисов, а для случаев когда есть некий функционал повторяющийся функционал но для разных сущностей.

25.01.2021 15:11 UTC
0
И да и нет.

Формально там, где у вас есть копипаста — то можете заменить трейтом.
Но. При этом вам нужно плотно следить за тем чтобы этот участок кода был как можно дальше от изменений.
Лучше всего под это дело подходит код, который работает с чем-то инфраструктурным.

В целом от 1-2 трейтов особой беды не будет. Проблема приходит тогда когда они приходят массово и в них помещается бизнеслогика.