Я полагаю, что основным принципом наслоения является Разделение проблем . На самом деле он не привязан к объектно-ориентированному проектированию, но распространяется на всю программную инженерию (в статье в википедии приведен протокол стека).
Таким образом, обычно мы находим функциональные области (F1, F2, F3) и заставляем себя проектировать компоненты, которые выполняют только одну из них. Мы спрашиваем "Что значит Х"? и если ответите, если «F1, F2, F3», мы разделим X на X1, X2, X3, которые выполняют по одной функции каждый, но делают это хорошо.
Просто краткое и преувеличенное пример
class SomeBusinessObject //Business logic, as we think
{
bool HasAccess(User loggedInUser)
{
/* two lines below are clearly from DataAccess layer */
string q = "select 1 from user_roles where id={0} and isadmin=1";
bool hasAccess = DataAccess.Execure(q).Rows > 0;
if(!hasAccess)
{
/* message pre-formatting is Presentation layer concern */
var msg = string.Format("<b>You don't have access</b>";
throw new SecurityException(msg);
}
return true;
}
}
В приведенном выше примере наш BL-класс должен знать о модели данных и деталях доступа к данным; также он пытается предварительно отформатировать сообщения для html-интерфейса. Так что, вероятно, мы переместим форматирование в представление; и извлеките создание SQL-запроса в DAL.
В общем случае могут быть следующие слои:
- Презентационный слой
- Слой рендеринга пользовательского интерфейса (обычно представления)
- Логика представления (презентаторы / контроллеры)
- Уровень обслуживания (может быть опущен в относительно небольших системах)
- Бизнес логика. Если мы хотим сделать это, мы могли бы подумать о:
- Уровень бизнес-правил.
- Валидационный слой.
- Сама бизнес-логика.
- Преобразование данных
- Запрос услуг
- Доступ к данным. Можно разделить на два слоя:
- Абстрактный доступ к данным, обслуживающий бизнес-уровни
- Точные реализации ниже, слой "DB".
В общем, есть два правила отношений между слоями:
- Слой должен «общаться» только с нижележащими слоями. (Например, не должно быть никаких зависимостей, скажем, от BL до Presentation, от DAL до BL).
- Слой не должен «перепрыгивать» через слой. (Презентация не должна разговаривать с DAL).
Однако существуют также сквозные функции, которые на самом деле не связаны ни с одним из слоев. Это в основном относится к ведению журналов, кешированию и т. Д. Некоторые также могут сказать о безопасности, но я почти уверен, что это можно сделать в зависимости от уровня.
Надеюсь, это поможет.