Хранение всего свободного и расширяемого: слишком много слоев, слишком маленький ROI? - PullRequest
10 голосов
/ 09 августа 2009

Я (сейчас больше, чем когда-либо) вижу, как разработчики пишут огромное количество слоев, таких как:

</p> <pre><code>implementation PresentationLayer -> interface IMyDTO -> implementation MyDTO -> interface IMyService -> implementation MyService -> interface IMyDomainRepository -> implementation MyDomainRepository -> interface IMyDomainObject -> implementation MyDomainObject -> interface IMyIndependentStorageLayer -> implementation MyMSSQLStorageLayer

Просматривая блоги C #, это кажется лучшей вещью после нарезанного хлеба. В основном все слабо связаны. Не используйте доменный объект напрямую. Запустите все через слой службы. Доступ к данным через репозиторий. Все слои совершенно независимы.

Не поймите меня неправильно, мне нравится идея, но разве не компромисс во времени огромен, особенно в более крупном проекте? Достаточно ли велика рентабельность инвестиций в техническое обслуживание, чтобы это оправдать?

Объяснения, которые я читаю, довольно неловкие, например, «таким образом я могу присоединить другую базу данных, если мне нужно». В самом деле? Я не думаю, что это общая проблема, когда кто-то внезапно требует перейти с MSSQL на Oracle, и теперь вы сидите и хотите, чтобы у вас был миллион слоев, которые все не знают друг друга.

Есть ли тенденция переходить за борт со слабой связью или я просто читаю не те блоги? Как вы относитесь к этому, и были ли у вас случаи, когда вы действительно были рады позже, что выполнили дополнительную работу в начале?

Ответы [ 7 ]

1 голос
/ 09 августа 2009

Очень сложно разработать правильную концепцию, ориентированную на бизнес, для программного обеспечения. Я имею в виду с приемлемым ROI.

Однако для меня количество уровней или уровень слабой связи концепции программного обеспечения зависит от контекста, в котором будет использоваться программное обеспечение!

Если вы уверены в том, что должно делать программное обеспечение, и, возможно, в будущем будут небольшие изменения или добавления, приложение сверхнизкоуровневой связи с большим количеством слоев не является решением. Потому что это делает архитектуру слишком сложной без какой-либо причины, и время, потраченное на архитектуру, не приносит прибыли ...
С другой стороны, если вы знаете, что приложение должно быть настроено для каждого клиента и, безусловно, будет изменено по глубине, то время, затрачиваемое на низкоуровневую архитектуру связи, является хорошей идеей ...
Низкоуровневое связывание может быть разумным, если вы хотите повторно использовать часть кода для другого приложения. Конечно, в этом случае время, потраченное на дизайн, совершенно выгодно.
Затем, в заключение, я скажу, что все зависит от развития программного обеспечения в будущем и возможности повторного использования кода для других приложений.
Но для меня лучше не делать систематически очень сложную архитектуру.

1 голос
/ 09 августа 2009

Ничто в дизайне приложений не обходится без цены. Здесь цена повышенной сложности. Вы ВСЕГДА должны просматривать свои варианты, прежде чем выбрать тот, который наилучшим образом соответствует вашим потребностям.

С учетом сказанного, я думаю, что ваш вопрос звучит немного предвзято. В реальном мире вы можете не часто видеть клиента, требующего новый тип БД, но вы можете часто видеть нового клиента, который хочет такой же тип доступа к данным, что и предыдущий, но в другой БД. Речь идет не только о простоте изменения, но и о повторном использовании кода.

1 голос
/ 09 августа 2009

Очевидно, что это может быть преувеличено, и нужно знать, "где остановиться", добавляя слои.

Мое эмпирическое правило заключается в том, что если один слой не должен включать какие-либо существенные функции / код, он мне не нужен. При этом тестируемость важна, поэтому, если слой купит мне лучшую тестируемость, я добавлю его.

0 голосов
/ 09 декабря 2011

В настоящее время я работаю над большим SOA-проектом, в котором каждый слой был отделен, и почти каждый класс создается с помощью некоторой абстрактной фабрики. Теперь мы пытаемся переложить некоторые из существующих функциональных возможностей в отдельно размещенные сервисы, и это настоящий кошмар, проходящий через слои, пытающийся экстраполировать важные биты, потому что есть бесконечный щелчок правой кнопкой мыши> Перейти к определению ..., чтобы преследовать вниз, что было только 1 строкой кода на внешнем слое!

Нет ничего плохого в разделении как таковом, и, конечно, даже в моем проекте есть много областей, где я нахожу это полезным с архитектурной точки зрения. Только не увлекайтесь ... Будьте прагматичны и взвешивайте плюсы и минусы при изучении областей, которые вы собираетесь отделить.

Приветствия

0 голосов
/ 10 февраля 2010

Это недавняя тенденция, и менее опытные лидеры / архитекторы становятся жертвами прыжков на подножке.

В моем проекте доступ к данным пошел:

Интерфейс службы -> Реализация службы -> Интерфейс делегата -> Реализация делегата -> Интерфейс DAO -> Реализация DAO -> Ibatis XML.

Это было (и есть!) Плохо в нашем случае, потому что большая часть кода в любом методе реализации делегата была одной строкой; это просто называется DAO. Для каждого DAO у нас было два дополнительных класса и одна дополнительная конфигурация bean-компонента, и мы ничего от этого не получили.

Принять изменение, рефакторинг и двигаться дальше. Используйте столько слоев, сколько нужно, чтобы разделить различные концепции ... и затем остановитесь. Если в написании какого-либо кода нет ощутимой выгоды, за исключением того, что он будет следовать шаблону, либо замедлите работу и попытайтесь полностью понять, почему шаблон сделал это, либо признайте, что шаблон не подходит для вашего приложения, и проигнорируйте этот бит.

0 голосов
/ 09 августа 2009

Возьмите пример гипотетического проекта. В тестах для скорости используются различные внутрипроцессные базы данных SQLite, база данных разработки на компьютере разработчика - PostgreSQL, промежуточная база данных - одна установка Oracle, а рабочая база данных - масштабируемая, очень дорогая и очень сложная в настройке Oracle. кластер.

Как бы вы справились с этим, не отделяя уровень SQL от бизнес-уровня?

0 голосов
/ 09 августа 2009

Оценивая эти вещи, я обычно считаю, что полезно взглянуть на это через призму принципа СУХОЙ и посмотреть на дублирование в вашем проекте.

Если вы используете архитектуру, которая является более сложной, чем ваш проект, вы будете склонны видеть множество слоев, которые мало что делают, кроме того, что оборачивают другие слои и передают вызовы. Это повторяется.

Если, с другой стороны, вы используете тонкую архитектуру для сложной системы, вы можете обнаружить, что создание функциональных возможностей в одной части системы не позволяет вам повторно использовать эти функциональные возможности в другой части, что вынуждает вас писать очень похожий код повсюду. Это повторяется.

По моему опыту, если вы будете бдительны в выявлении дублирования и в постоянном рефакторинге для его устранения, структура представится вам. Скажем, например, что вы начинаете с довольно простой архитектуры, но разбиваете вещи на методы, как только их нужно использовать повторно, и разбиваете методы на классы, как только они должны использоваться другими классами. Затем вы можете в конечном итоге осознать, что ваши 13 классов Helper / Manager / Handler, которые вы написали для устранения дублирования, на самом деле выглядят так, будто они берут на себя ответственность, которую можно было бы более четко определить, если бы она перешла на уровень Service.

Может быть сложно узнать, когда это того стоит, но я думаю, что ключом к успеху в построении системы с большим количеством слоев является четкое понимание того, какие обязанности должны иметь различные уровни. Любой добавляемый вами слой должен помочь вам снизить сложность операций в слое над ним и упростить изящное объединение функций.

...