Sergey
ради бога
Sergey
не наследуйся от доктриновского репоса
Sergey
он не для этого сделан
Ale
он может быть вполне себе абстрактным
Ale
и тогда ну просто вынужден
Ale
хоть сальто делай, а передать его не могу, только наследника)
Ale
ну просто профита от того, что я явно привяжусь к классу в конструкторе или в иерархии особо нет
Ale
ибо к интерфейсу привязаться все равно не могу
Ale
и мокать все равно придется со всем говном, что оно там несет в себе
Sergey
final class Catalog
{
private $repository;
public function __construct(EntityRepository $repository)
{
$this->repository = $repository;
}
public function add(Product $product)
{
}
}
Sergey
и пусть в EntityRepository будут дефолтные методы аля find или add или remove
Sergey
а конкретика в Catalog
Sergey
и опять же никакого наследования
Sergey
и кода столько же
Sergey
и руки развязаны
Sergey
и цепочка связанности прервана
Sergey
наша бизнес логика ничего не будет знать о EntityRepository
Ale
ну опять же, если EntityRepository абстрактный, то у тебя все равно всплывет его наследник)
Sergey
он не абстрактный
Ale
так она итак не будет знать же?
Sergey
он просто базовый
Sergey
для всех доктриновских сущностей
Ale
это не тебе решать
Sergey
мне)
Ale
а разработчику доктрины)
Sergey
ну так он и решил)
Ale
замени доктрину, на другую ебанутую библиотеку
Ale
в которой решили иначе)
Sergey
dependency inversion
Sergey
и все будет хорошо
Ale
твоя БЛ все равно о нем не узнает
Ale
в том плане, что этот адаптер все равно где-то будет жить
Sergey
какая разница?
Ale
если он используется где-то еще, то его есть смысл выделить от реализации интерфейса
Ale
потому что используется в двух реализациях
Sergey
унаследовавшись от EntityRepository ты легко можешь нарушить LSP
Ale
если у тебя нет, то нет)
Ale
мм
Ale
типа если мои методы, будут ломать методы из ER?
Ale
ну вообще да
Sergey
типа твои методы могут налагать больше ограничений, чем методы ER
Ale
ну или вообще другой интерфейс
Ale
да, логично
Sergey
тип в ER у тебя "сохраню любую херню"
Sergey
а ты такой "э не, только продукты"
Ale
у меня может быть ограничение, что не просто продукты, а еще какой-нибудь внешний параметр
Ale
ну да, согласен
🐴
Ale
я просто оставлял адаптерам единственное место, где наследование можно оправдать)
Ale
ну тут да, стоит их вывести в еще меньшее
🐴
@fes0r @mkusher спасибо, чуваки, хорошую дискуссию организовали)
Sergey
адаптер подразумевает что у тебя есть один интерфейс и ты делаешь другой
Sergey
то есть наследованию в нем нет места
Sergey
Ale
Rodion
Следил как за сериалом
Ale
Rodion
Не, отнаследовав по инерции студента и учителя от человека я просто решил наблюдать
Ale
@fes0r надо еще придумать хорошую задачку на полиморфизм
Ale
чтобы что-то очевидное давалось как if instanceof
Пантелеев
Квадрат и прямоугольник)
Ale
да просто два независимых класса, хватит уже их мучать)
Rodion
Нормальный разбор принципа "композиция предпочтительнее наследования"
🐴
и без наследования намного проще и чище
я вот пытаюсь понять, а когда же нужно применять наследование, и не нахожу ни одного чистого примера, где оно было бы необходимо или хотя бы предпочтительно
Ale
Ale
инфраструктура диктует свои правила)
Sergey
ну вот с элоквентом хороший пример
Sergey
там выбора реально нет
Sergey
и без него реально сложно
Sergey
ну точнее... реализация элоквента была бы раза так в полтора сложнее
🐴
ну понятно
Sergey
тупо что бы дать возможность "не наследоваться"
🐴
когда все в неестественных позах, а в жопе кол
Sergey
а если ты своих штуки делаешь - там наследование не нужно
Sergey
опять же, я тоже не могу вспомнить ни одного случая когда "ну вот надо"
Sergey
я же скидывал статью "Why extends is evil?"
Ale
🐴
я пропустил
Rodion
Скинь ещё раз пжст