whirlwind
TDD infected, paranoid
Не. Ты написал: ой, мокать save часто придется. Я ответил что часто не придетсяТы на какой-то другой вопрос ответил
Не. Ты написал: ой, мокать save часто придется. Я ответил что часто не придетсяТы на какой-то другой вопрос ответил
Ага.Но мне кажется, что здесь нет ответа на твой вопрос. Если ты про репо, это надо смотреть тесты где активно именно репы юзаются.
Прости, не понял насчет наследования. Наследования у меня почти нету, потому что это очень неудобно для тестов. Если ты про методы, которые делегируют другим сущностям, так в этом и весь смысл. Классы взаимодействуют с ближними соседями, а не со всей системой. Я меняю ближних соседей, вместо того, что бы менять систему. Получаются хорошо изолированные несвязанные компоненты.Ага.
(С наследованием чота жесть. Но понятно, тяжко без рефлексии.)
Нарушение ISP — это у нас теперь «экспрессивные интерфейсы».Наличие метода не говорит о том, что этот метод там реализован. Просто экспрессивные интерфейсы.
А если молнию расстегнуть, так ещё и в шорты превратится.Этот пул является и entity (сводный корень) и репозиторием одновременно.
С такой агрессивной реакцией на любую несогласованность с твоим внутренним мирком это, наверное, действительно невозможно.Ну и как это можно по папочкам линейно разложить? Никак.
Буквально только что об этом думал. Причем это нужно не только для сущностей, но и для коллекций, т.к. вместо $grade->addPupil($pupil) можно сделать $grade->getPupils()->add($pupil). Коллекция извне должна быть read-only, Collection::add должен быть виден только из сервисов или сущности.Как дать доступ к методам только сервису?
Например хеш для логина пишется в UserEntity через сервис.
Не хочется, чтобы UserEntity имел публичный setHash
Можно сделать правильно - 2 интерфейса, UserPublicInterface (репо его будет возвращать), UserHashInterface (тайпхинтинг в сервисе)
По факту метод остается публиным, но мы его не видим через интефрейс... такая вот эмуляция срезки
Можно сделать по-другому, но за такое руки отрывают - через bindTo и лямбду поменять приватное свойство в сервисе.
ЗЫ. ну и третий вариант уже тут обсуждался, прокинуть Hasher в setHash
Тебе это не нужно.Как дать доступ к методам только сервису?
Я правильно понимаю, что ты будешь пихать объект с интерфейсом UserPublicInterface в метод, требующий UserHashInterface? Плохая идея. Вообще тут возникает сразу куча проблем: а к какому слою тогда относится класс User? Если это domain и ты считаешь, что hash — это не часть domain, то у тебя будет микс из слоёв в одном классе; если это инфраструктура, то там будет бизнес-логика, что отвратительно.Можно сделать правильно - 2 интерфейса, UserPublicInterface (репо его будет возвращать), UserHashInterface (тайпхинтинг в сервисе)
По факту метод остается публиным, но мы его не видим через интефрейс... такая вот эмуляция срезки
Не нужно вообще ничего называть setFoo(), мы никогда не говорим «Вася решил установить себе новое имя Петя». Вася решил сменить имя. Нейминг с сеттерами — это путь в сторону anemic.Не хочется, чтобы UserEntity имел публичный setHash
Зачем? Зачем тогда этот хеш вообще сдался User'у?При этом хотелось бы исключить присваивание хеша напрямую Юзеру
Суть в том, что всё равно требуются какие-то свойства и методы доступные внутри пакета (в слое домена) и недоступные пользователю извне (в слое приложения). Как пример с коллекцией указанный мной выше. Пользователь не должен иметь возможности сделать $grade->getPupils()->add($pupil), у него есть $grade->addPupil($pupil) (а внутри Grade::addPupil() уже вызывается в том числе и Collection::add()). Вопрос, сдался коллекции метод add() или нет? Если нет, то как добавлять элементы в коллекцию?Зачем? Зачем тогда этот хеш вообще сдался User'у?
Еще раз. Зачем ты открываешь всему свету внутренности сущности? Ты своей рукой как пользуешься, пальцами управляешь через репозиторий: дайте мне мизинец, согнуть мизинец, разогнуть? Нафига снаружи эти детали? Ты берешь предмет в руку. Это все что тебе нужно. $grade->addPupil(). Завтра ты что нибудь добавишь или захочешь поменять реализацию, ты будешь всех пользователей твоей коллекции переписывать. Вопрос - нафига? Вот подобное $this->something->anything->another должно вызывать подозрения сразу. Тоже говорил про это пару страниц назад.Суть в том, что всё равно требуются какие-то свойства и методы доступные внутри пакета (в слое домена) и недоступные пользователю извне (в слое приложения). Как пример с коллекцией указанный мной выше. Пользователь не должен иметь возможности сделать $grade->getPupils()->add($pupil), у него есть $grade->addPupil($pupil) (а внутри Grade::addPupil() уже вызывается в том числе и Collection::add()). Вопрос, сдался коллекции метод add() или нет? Если нет, то как добавлять элементы в коллекцию?
Так же и у сущностей могут быть какие-то свойства и методы, скажем так, "служебные", через которые мы могли бы манипулировать сущностью внутри пакета, но не могли бы извне.
Ну, вот такое ещё в голову приходит - подсущности сущности... Для сохранения в базу у $pupil нужно свойство grade_id, в то время как с точки зрения домена никаких gradeId у Pupil конечно нет. Впрочем, не слишком удачный пример вероятно, первое что в голову приходит. Но суть, думаю ясна.
вот основной вопрос, да!Суть в том, что всё равно требуются какие-то свойства и методы доступные внутри пакета (в слое домена) и недоступные пользователю извне (в слое приложения).