Уровневая Организация ПриложенияContentsПослойная Организация Приложения 1
По-слойная логическая организация приложения 1
Presentation, Business, and Data Layers 1
Services and Layers 2
Services Layer 3
Design Steps for a Layered Structure 3
Step 1 – Choose Your Layering Strategy 4
Step 2 – Determine the Layers You Require 4
Step 3 – Decide How to Distribute Layers and Components 5
Step 4 – Determine If You Need to Collapse Layers 5
Step 5 – Determine Rules for Interaction Between Layers 5
Step 6 – Identify Cross Cutting Concerns 5
Step 7 – Define the Interfaces between Layers 6
Step 8 – Choose Your Deployment Strategy 7
Step 9 – Choose Communication Protocols 7
Sources 7Различие между понятиями уровня и слоя в архитектуре ПО. Слой используется для логической группировки функциональности и компонентов приложения, в то время как уровень показывает физическое распределение функциональности и компонентов приложения на различных серверах, сетях, и т.д. Одинь уровень(tier) расположенный на одном сервере может включать функциональность, содержащуюся в нескольких слоях(layers) приложения.
Термин «уровень» используется в контексте шаблонов (паттернов) физического распределения приложения, таких как 2-х уровневая, 3-х уровневая, n-уровневая архитектура.
По-слойная логическая организация приложения, выделение уровней Представления(Presentation), Бизнес(Business), и Данных(Data)
Независимо от типа разрабатываемого приложения, и наличия наличия или отсутствия пользовательского интерфейса, в процессе дизайна выделяются отдельные логически связанные группы компонентов. Эти логические группы называют слоями(layers). Слои определяются видами задач, которые решаются определенным набором компонентов. Применение слоев упрощает возможность повторного использования компонентов. Каждый логический слой, может, в свою очередь, быть разбит на под-уровни(sub layers), компоненты которых выполняют специфические виды задач.

Функциональность представленная этими слоями может располагаться как на одном, так и на различных физических уровнях. Если функциональность располагается на уровнях разделенных физически, дизайн должен отражать это. Общепринято следующее разбиение функциональности на слои:
Уровень представления(Presentation layer) Этот уровень содержит функции, которые отвечают за взаимодействие пользователя и системы, и, компонентов, которые предоставляют доступ к базовой функциональности приложения, заключенной в уровне бизнес-логики системы.
Уровень бизнес-логики(Business layer). На этом уровне реализована базовая функциональность системы. Компоненты этого уровня могут предоставлять интерфейс для использования сервисов этого уровня.
Уровень данных (Data layer). Этот уровень предоставляет доступ к данным, которые хранятся системой, и к данным доступ к которым предоставляется другими системами удаленно(возможно в виде сервисов). Уровень данных предоставляет интерфейс доступа компонентам уровня бизнес-логики.
Использование уровня Сервисов(Services Layer)
Решение, основанное на сервисах может быть рассматриваться как совокупность сервисов(услуг), каждый из которых взаимодействует с другими при помощи сообщений. Концептуально сервисы могут рассматриваться как компоненты общего решения. Однако, внутрення структура сервиса состоит из набора компонентов, которые могут быть сгруппированы в уровни представления, бизнес-логики и данных. Другие приложения могут потреблять услуги, предоставляемые сервисами, ничего не зная об их внутренней структуре.
Если приложение должно предоставлять услуги другим приложениям, общим решением является использование уровня сервисов, который позволяет получить доступ к функциям уровня бизнес-логики приложения и предоставляет клиентам альтернативный способ доступа к функциям приложения.

В приведенном примере пользователь может получить доступ к приложению используя уровень представления, в то время как внешние клиенты могут получить доступ к приложению через уровень сервисов. Это позволяет приложению поддерживать различные типы клиентов.
Дизайн уровневой структуры
Стандартный набор шагов при разработке уровневой архитектуры приложения следующий:
Выбор стратегии разбиения на уровни
Определение требуемых уровней
Принятие решения о распрделении уровней(Layers) и компонентов
Решение о необходимости «ужать» уровни
Определение правил взаимодействия между уровнями
Определение сквозной функциональности
Определение интерфейсов между уровнями
Выбор стратегии реализации и внедрения
Выбор протоколов взаимодействия
Выбор стратегии разбиения на уровни
Разбиение на уровни позволяет разделить компоненты приложения на логические группы, которые представляют различные роли и функциональность. Однако неудачный выбор стратегии и разбиение на уровни может усложнить приложение и уменьшить общую производительность.
Необходимо учитывать так же преследуются ли цели только логического разделения функциональности , или, возможного физического разделения компонентов(возможность размещения их на разных компьютерах напр.). Границы слоев являются местами влияющими на производительность системы, т.к. Требуют добавления функциональности по предоставлению интерфейса взаимодействия между слоями. В то же время они увеличивают общую гибкость и расширяемость приложения. С целью использования преимуществ разбиения на слои, рекомендуется поддерживать максимальную инкапсуляцию и слабую связность между слоями.
В случае если предполагается что различные слои могут иметь различное физическое местоположение, механизмы коммуникации между слоями должны учитывать вероятность задержек в доставке сообщений и обеспечивать слабую связность между слоями.
Определение требуемых уровней
Наиболее общим подходом является разделение функциональности представления, бизнес-логики и доступа к данным в различных слоях приложения. Некоторые приложения включают также слои управляления, отчетности и инфраструктуры.
Принятие решения о распределении уровней и компонентов
Необходимо разделять уровни и компонеты физически только в случае необходимости. Вопросы которые рассматриваются при этом включают политику безопасности, физические ограничения, общую бизнес логику и расширяемость приложения.
In Web applications, if your presentation components access your business components synchronously, consider deploying the business layer and presentation layer components on the same physical tier to maximize performance and ease operational management, unless security restrictions require a trust boundary between them.
In rich client applications, where the UI processing occurs on the desktop, you may prefer to deploy the business components in a physically separate business tier for security reasons, and to ease operational management.
Deploy business entities on the same physical tier as the code that uses them. This may mean deploying them in more than one place; for example, placing copies on a physically separated presentation tier or data tier where that logic makes use of or references the business entities. Deploy service agent components on the same tier as the code that calls the components, unless security restrictions require a trust boundary between them.
Consider deploying asynchronous business components, workflow components, and services that have similar load and I/O characteristics on a separate physical tier so that you can fine tune that infrastructure to maximize performance and scalability.
Принятие решения об «ужатии» ненужных уровней
В некоторых случаях имеет смысл ужать число используемых уровней. Например в случае если приложение использует ограниченное число бизнес правил, или эти бизнес-правила используются в основном для валидации данных, то уровни представления и бизнес-логики могут быть реализованы совместно
Определение правил взаимодействия между уровнями
При определении стратегиии межуровневой коммуникации требуется определить правила взаимодействия между урвовнями. Главные проблемы которые должны учитываться это уменьшение зависимости между слоями и избежание кольцевых ссылок(circular references). Например это случай, когда из двух уровней каждый зависит от компонентов другого уровня. Возможно использование следующих стратегий:
Взаимодействие сверху-вниз. Higher level layers can interact with layers below, but a lower level layer should never interact with layers above.
Слабосвязанное взаимодействие. Higher level layers can bypass layers to interact with lower level layers directly. This can improve performance, but will also increase dependencies. In other words, modification to a lower level layer can affect multiple layers above. Consider using this approach if you are designing an application that you know will not be distributed across physical tiers (for example, a stand-alone rich client application), or you are designing a small application where changes that affect multiple layers can be managed with minimal effort.
Определение сквозной функциональности
После того как определены уровни приложения, необходимо определить фиды функциональности, которая пересекает границы уровней (crosscutting concerns). Обычно такие виды функциональности включают журналирование(logging), кеширование(caching), определение корректности значений(validation), аутентификация, и управление исключениями. Важно использовать отдельные компоненты, отвечающие за подобные виды функциональности.
Желательно избегать смешивания кода, который относится к сквозной функциональности и кода компонентов реализующих функции определенного слоя, так чтобы компоненты реализующие функции уровня могли обращаться с вызовом к компонентам реализующим сквозную функциональность. Реализация компонентов сквозной функциональности должна обеспечивать доступ к ним из разных слоев приложения.
Определение интерфейса между уровнями
При определении интерфейса слоя главной целью явлется обеспечение слабой связности между слоями. Это означает что слой не должен обнаруживать деталей внутренней структуры, на которые будет полагаться другой слой. Интерфейс должен разрабатываться так чтобы уменьшить зависимость между отдельными слоями, предоставляя внешний интерфейс, скрывающий детали компонентов внутри слоя. Это т.н. Абстракция, которая может быть реализована различным образом, например использование абстрактных интерфейсов или обмена сообщениями между слоями
Выбор стратегии реализации и внедрения
Существует несколько общих подходов, которые демонстрируют структуру внедрения приложения. Для определения наилучшего решения, сначачала должен быть выбран подходящий шаблон и затем рассматриваться сценарии, требования и ограничения безопасности, базирующиеся на этом шаблоне
Выбор протоколов взаимодействия
Протоколы, используемы для взаимодействия между уровнями и слоями играют основную роль в производительности, безопасности и надежности приложения. Выбор протокола тем более важен, если рассматривается вариант распеределенного физически приложения.