Evgeniy
здесь есть те кто хорошо шарит в phpunit ?
Evgeniy
для написания теста (не совсем юнит) https://toster.ru/q/305584
Evgeniy
вот такой примено вопрос
🐴
Зачем вообще тестировать интерфейс?
🐴
'O2 реализует I2 и O3 реализует I1 и I2 (знаю что плохо и что у объекта должна быть единая ответственность).'
🐴
Это как раз нормально
🐴
Имплиментация нескольких интерфейсов не обязательно значит нарушение srp
Ale
для написания теста (не совсем юнит) https://toster.ru/q/305584
то, что в тестах у тебя возникло дублирование произошло не просто так
Ale
а потому что в коде у тебя тоже дублирование
🐴
Более того, несколько маленьких интерфейсов как правило лучше чем один большой
Anonymous
а потому что в коде у тебя тоже дублирование
и тут хуяк и наследование в дамках
Ale
и тебе надо понять, это реально дублирование, которое надо вынести
Evgeniy
я понимаю что несколько интерфейсов лучше
Evgeniy
и там пример высосан из пальца
Ale
и тебе надо понять, это реально дублирование, которое надо вынести
или это разные проверки и поэтому тебе надо два раза их тестировать
🐴
Ты тестируешь логику, а не интерфейсы
Evgeniy
я так понимаю что аргументированно поговорить надо более реальный пример?)
Ale
и тут хуяк и наследование в дамках
ага, существует ровно один метод избавления от дублирования
Evgeniy
ок как нибудь потом набросаю)
Evgeniy
вообще я посмотрел есть PHPUnit_Framework_Test (не TestCase)
Evgeniy
который можно создавать и передавать туда тестируемый объект и все в ранне потом
Evgeniy
но это слишком изврат)
Anonymous
+1
-1
Artur
Зачем вообще тестировать интерфейс?
сборка класса до обхекта уже тест
invariance
откуда пользователи идут
Anonymous
С севера же
Sergey
Ты тестируешь логику, а не интерфейсы
ты должен тестировать "контракты". То есть логика, которая формирует интерфейс
Sergey
Sergey
я сейчас сижу и в свободное время пытаюсь прикинуть "каково оно взять проект написанный как придется и написать его с тестами, без наследования и минимизировав геттеры"
Sergey
и без наследования намного проще и чище
Ilya
Без наследования? А почему бы тогда сразу не без классов?
Sergey
Без наследования? А почему бы тогда сразу не без классов?
ну потому что в PHP это единственный способ описания объектов. А так да, для чистого ООП классы не нужны
Sergey
достаточно прототипного наследования как в JS
Ilya
Массивы фигачь
Ale
но в пхп методы особо не подменишь
Sergey
Массивы фигачь
just give it a 5 minutes. Попробуй мыслить категорией "наследование не нужно". Представь себе ситуацию где ты бы применил наследование и подумай "а можно ли без него"
Sergey
ну так
Sergey
шутки ради
Ale
* с помощью композиции например
Sergey
не только композиции
Sergey
просто представь что у тебя нет extends, есть только implements для организации иерархии типов
Ilya
Наследую модели постов и комментариев от эктиврекорда
Sergey
а.... ну ты проиграл)
Ale
и прекрасно себя чувствую
Ale
а ты от DDD такой нервный
Sergey
наверное...
Sergey
5 лет с доктриной дают о себе знать
Sergey
привык я что инструменты не заставляют от себя наследоваться
Ale
красивенький кстати в opuelence orm
Sergey
да, мило
Sergey
да и в целом для "поделки" ооочень качественно
Sergey
единственное что бесит - венгерская нотация для интерфейсов
Sergey
Я б повесился
а теперь представь что у тебя нет базы данных, active record, фреймворков и т.д.
Sergey
мы же сейчас про "правильное ООП" а не про "реалии"
Ale
привык я что инструменты не заставляют от себя наследоваться
пф, с aggregate root при event sourcing надо думать как ивенты прятать)
Ilya
Ничего нет
Ilya
И код не надо писать
Ale
ну тебе ж надо вначале задачу бизнеса решить
Ilya
Идеально
Sergey
Я б повесился
ну и опять же, если мы говорим о ActiveRecord - то это, как ты говоришь - классы, тупые структуры, это не ООП"
Ale
а не фреймворк выбрать)
Sergey
так что давай представим себе просто такой код
Ale
или всем, кто идет, ты кричишь с порога: "делаю только на laravel/RoR, все остальное нахер, потому что вот так вот"
Sergey
final class User { /** * @var UserDataModel - Eloqent model */ private $attributes; public function __construct(string $email, sting $password) { $this->attributes->email = $email; $this->attributes->password = $password; } }
Sergey
вот я тебе сделал "модель" юзера без наследования от элоквента. В ней будет только бизнес логика, а элоквент отвечает только за модель данных
Sergey
все счастливы
Sergey
SOLID соблюдается почти
Ale
ага, ты только забыл сказать, как она туда сетится))
Ale
$this->attributes = new UserRowDataGateway();
Sergey
при фетче - через рефлексию разумеется
Ale
че нить такое
Sergey
ну тип того да