Я думаю, что «правильный» путь был объяснен в других ответах. Но сейчас я напишу из собственного опыта.
Есть несколько вещей, которые вы должны учитывать при выборе архитектуры.
а. Клиент
Достаточно ли у вас времени, чтобы все сделать "правильно" (отличная архитектура, тесты и т. Д.)? Иногда клиент хочет увидеть результаты быстро. Мы можем жаловаться, что времени мало, и продукт не будет соответствовать самым высоким стандартам, но в итоге это наша проблема. В этой ситуации мы объясняем клиенту, что он получит, и пишем код спагетти, который мы все знаем.
Каковы требования клиентов (с точки зрения надежности, масштабируемости, расширяемости, скорости)? Я думаю, что это само за себя. Иногда клиент диктует «правильный» путь. Мы можем предложить клиенту «правильный» путь, но в итоге клиент решит (в зависимости от времени и денег, конечно).
Кто будет поддерживать систему после ее разработки? Я хотел бы поддержать красивый и отделенный код. Поэтому, когда я пишу код, я прилагаю все усилия, чтобы сделать его «правильным». Иногда я мог бы соединить представление и контроллер или пару какой-либо службы и быть счастливым с этим. Зная мой собственный код, его легко поддерживать.
б. Project
Каков размер проекта? Некоторые проекты настолько малы, что любая сложная архитектура не гарантируется.
Есть ли шанс, что программное обеспечение будет быстро расти в будущем (больше возможностей)? Это одна из самых больших проблем. Но если программное обеспечение растет, это означает, что это успех. Вероятно, у вас будет больше ресурсов для работы. Относительно легко реорганизовать ваш код и сделать его «правильным».
Будут ли у проекта проблемы с масштабируемостью? Есть проекты, которые никогда не будут расти, с точки зрения пользователей и данных. Я видел проекты, которые пытаются выглядеть серьезно, используя настройку базы данных Oracle RAC, когда простая встроенная база данных будет работать просто отлично!
Вы запустили проект или переняли его у других разработчиков? Это комбинация вопросов о том, кто будет поддерживать программное обеспечение и будет ли оно расти. Вы можете получить код спагетти от других разработчиков. У вас будет время и ресурсы, чтобы сделать это "правильно"?
с. Команда разработчиков
Достаточно ли опытна команда, чтобы сделать правильное разделение? Когда я был менее опытным, я пытался написать «правильный» код. И я потерпел неудачу. Суть в том, чтобы действительно знать свою команду разработчиков, их навыки и знания. Не стоит недооценивать эту проблему. Работая с менее опытными разработчиками, я обычно делаю некоторые жертвы архитектуре. Жертва, которая будет принесена, - лучшее образованное предположение, которое я имею. Есть некоторые моменты в архитектуре, которыми вы можете пожертвовать, а некоторые - нет. Обычно одна или несколько жертв, которые вы принесли ранее, возвращаются и кусают вас.
Опытные разработчики написали автоматические тесты? Недостаточно иметь автоматические тесты. Они должны быть полными (насколько это возможно) и сделаны правильно. Если ваши тесты слабые, то лучше их вообще не иметь. Вы не хотели бы опираться на дырявую стену.
Заключение :
Я знаю, что мы все хотим быть профессионалами. И, как профессионалы, мы должны все учитывать. Мы не можем тратить свое время и силы на то, чтобы делать вещи «правильным» образом. Иногда мы должны смотреть на другие факторы (реальность) и делать свой выбор. И самое главное - жить с этим.