Вурдалак
Продвинутый новичок
Ссылка на тему пятилетней давности просто для фана: https://phpclub.ru/talk/threads/final-or-not-final-that-is-the-questuion.80334/
Он зависит от неких Storage и ThumbCreator и использует только их публичные методы. Разработчику, который работает в данный момент с этим кодом, всё равно классы это или интерфейсы. Контейнер внедрения зависимостей, убрав необходимость создавать объекты зависимостей, подарил нам супер-абстракцию: классам совсем неважно знать от чего именно он зависит - от интерфейса или класса. В любой момент, при изменении условий, класс может быть сконвертирован в интерфейс, а весь его функционал перенесен в новый класс, реализующий этот интерфейс (Storage => S3Storage). Это изменение, наряду с конфигурацией контейнера зависимостей будут единственными на проекте. Весь остальной код, использовавший класс, будет работать как прежде, только теперь он зависит от интерфейса. Используя суффиксы *Interface или другие отличительные признаки интерфейсов, мы лишаем себя этой абстракции, а также загрязняем наш код.
кто блин тестит сторонние либы? нормальный путь - это wrapper создавать. тестить... $this->equals(4, 2+2); ?вопрос тестирования сторонних либ
кто блин тестит сторонние либы? нормальный путь - это wrapper создавать. тестить... $this->equals(4, 2+2); ?
Тестировать пользователей, а не стороннюю либу. Пользователей абстракции, яволь?whirlwind написал(а):PS. Что бы тема опять не вернулась к примерам первого уровня типа ImageUploader. Речь идет не о дизайне CUT, а дизайне объектов, с которыми взаимодействует CUT. Протестировать ImageUploader легко. Протестируй того, кто юзает ImageUploader, что бы понять, насколько дизайн хорош.
Если у вас 100% всего кода - это ваш собственный код
- ты рыбу ловишь?Потому что это мой API
Гриша как обычно показывает свой талант ворваться в тему и при абсолютном непонимании происходящего начать показывать свой твердый лоб."это моя корова и я ее буду доить" (С)
Я специально перечислял extends abstract и implements в одном ряду, не различая. Ок, допустим, выкинем интерфейсы, сделаем множественное наследование, что изменится-то?В Java интерфейсы появились с 1.0 (это былодо(очепятка) после первых плюсов), но если на них посмотреть повнимательнее сегодня, они обратно превращаются в классы
Попрошу не выражаться! Множественное наследование это совсем не то же самое, что сохранение полиморфности. Не надо его сюда приплетать. Использование interfaces для решения проблемы единой точки доступа это нормально. Сам так делаю.Я специально перечислял extends abstract и implements в одном ряду, не различая. Ок, допустим, выкинем интерфейсы, сделаем множественное наследование, что изменится-то?
public class QFReactor implements EventListener, DataProvider, SPRunnable, L1UpdateConsumer {
не будет абстракции, будет зависимость от множества реализацийвыкинем интерфейсы, сделаем множественное наследование, что изменится-то?
Я про частный случай с pure abstract classes, конечно же (впрочем, можно и не совсем pure, будет типа default methods в java)Попрошу не выражаться! Множественное наследование это совсем не то же самое, что сохранение полиморфности.