Comments 13
Вместо этого уводит в сторону производственного конвейера, типа он «сложный», потому что у нас куча анализаторов кода, CI, всё покрыто тестами и код-ревью.
В моём понимании архитектура вообще не об инструментах и процессах. При абсолютно тех же производственных процессах и инструментах архитектура приложения может быть как простой, логичной и понятной, так и нет.
архитектура вторична, первичны результат и процесс разработки
Результат непосредственно зависит от архитектуры, а разработка по сути стандартна — там ничего «архитектурного» нету, это лишь набор процессов и инструментов.
P.S. Проект организации строительства монолитных зданий примерно одинаков как для безвкусной бетонной коробки, так и для памятника архитектуры.
Результат непосредственно зависит от архитектуры, а разработка по сути стандартна
В статье как раз говорится про разработчиков, которые в принципе не сталкивались с таким процессом разработки, в котором есть автоматизированный pipeline со статическими анализаторами, тестами, quality gates, и пр. На моей практике, я очень редко встречал android проекты, которые попали мне из других рук, и где был бы написан хотя бы один тест. И эти проекты, в принципе, не пригодны к автоматическим тестам. Если бы, в таких проектах было бы требование покрытия кода тестами, их архитектура однозначно бы изменилась в сторону усложнения.
Т.е. требования к процессу разработки — реально влияют на то, какой будет архитектура проекта.
Не понимаю, почему усложнения? Казалось бы наоборот, каждый класс, ну или функция отвечает за одну вещь. Это и тестируется проще и понимается тоже и архитектура не усложняется. Или в вашем понимании, простая архитектура, это когда чем меньше классов, тем проще? Но это ведь не так.
С моей точки зрения, простая, это когда понятнее.
Второй ваш пример, явно понятнее первого.
Представьте что SomeApi
— final
класс, такой метод уже замокать не получится. Ну и это считается дурным тоном — мокать конкретные реализации.
1. Представь ситуацию, когда <что-то с весьма незначительной вероятностью>
2. Так принято, это обычная практика, так пишут даже в Facebook/Яндекс/..., так не делать — дурной тон.
Дальше только «не спорь с тимлидом».
Представь ситуацию, когда <что-то с весьма незначительной вероятностью>
Я привел весьма распространенную ситуацию, и это действительно, считается антипатерном — мокать конкретные реализации. Конкретная реализация может быть не вашим кодом, а сторонней библиотекой, например, или это может быть код, за который ответственна другая команда в проекте. Что бы избежать этих проблем — лучше скрыть конкретную реализацию за интерфейсом и придерживаться контрактов в реализации этого интерфейса.
Разработчики языка Kotlin, сделали классы по умолчанию — final
. И это было сделано не просто так. На мой взгляд, лучше придерживаться агрегации, композиции при расширении функционала какого-то класса, нежели наследования. Поэтому, хорошей практикой является закрытие класса на расширение через final
, а если нужно расширить — то можно прибегнуть к паттерну "декоратор", но этот паттерн уже подразумевает выделение интерфейса для класса.
Еще раз про усложненность архитектуры и порог входа