у нас тут возник срач, трейты это хорошо или плохо? как считаете?
Трейт – это всего лишь возможность вставки фрагментов кода с элементами класса через use в любой класс наравне с физической вставкой фрагментов произвольного кода одного файла через include в другой файл. То есть вещь по сути нейтральная.
Если рассматривать наследование и абстрактные методы, то наследование изначально даёт возможность создания любого нового подтипа на основе базового типа. То есть это фишка типизации в порождении подтипов.
А трейты, в отличие от классов и интерфейсов, никак в типизации не участвуют. Подтипов не порождают. Свои приватные поля скрывать от класса не могут. То есть используются только для простейшей вставки кода.
Если взять большой класс и его поля и методы сгруппировать и потом разнести в несколько трейтов, то визуально это может быть удобно.
Если класс реализует интерфейс и нам лень прописывать вручную минимальную реализацию методов этого интерфейса, то удобно рядом с интерфейсом положить трейт с дефолтной реализацией этого интерфейса. Типизацию определяет интерфейс, а трейт к нему будет лишь необязательным придатком.
Но если один трейт подключают к нескольким заведомо никак не связанным друг с другом классам, то получается, что код из трейта практически вставляется один в один в каждый класс. Если там есть бизнес-логика, то почему-то оказывается так, что одна и та же логика оказалась нужна нескольким разным классам. Это тревожный сигнал в плане копирования логики и ответственности. Ломается декомпозиция. В этом случае желательно было бы вынести такой повторяющийся код в отдельный объект или чистую функцию.
То есть сам по себе трейт – это вещь нейтральная. А вот копипаста логики уже воспринимается как зло. Поэтому если трейты используют для копипасты логики в нарушение декомпозиции, то получаем, что в этом коде трейтами творят зло. За такую медвежью услугу их и не любят.