Layers - Architektura Warstwowa

Problem

Chcielibyśmy dokonać strukturyzacji projektowanego modułu tak aby cechował się dobrą modyfikowalnością, łatwością odnajdywania konkretnych fragmentów kodu oraz łatwością śledzenia przepływu sterowania. Struktura powinna dodatkowo umożliwiać wykonanie partycjonowania modułu w przyszłości (gdyż np. spodziewamy się dużego przyrostu ruchu)

Rozwiązanie

Projektowany moduł powinien posiadać strukturę warstwową. Jego elementy/podmoduły o podobnym poziomie abstrakcji lub podobnych odpowiedzialnościach należy pogrupować w grupy, tzw warstwy. Warstwy o niskim poziomie abstrakcji powinny świadczyć usługi dla warstw o wyższym poziomie abstrakcji (np. warstwa dostępu do danych powinna dostarczać funkcjonalności dla warstwy logiki aplikacji). Wyłania się tu poziomy układ komunikujących się warstw w kierunku coraz to niższej abstrakcji. Należy dodać, że zabrania się komunikacji warstw w przeciwnym kierunku (oczywiście jest to dopuszczalne warunkowo, jeżeli nie mamy już innej możliwości).

Często w projektowanych aplikacjach zdarza się jednak sytuacja kiedy wszystkie warstwy korzystają z pewnego modułu, którego nie jesteśmy w stanie dostosować do powyższych wymogów i umieścić w “poziomej” strukturze warstwowej. Mowa tu o wszelkiego rodzaju modułach użytkowych i wspomagających, z których może skorzystać każda warstw. Warstwy tego typu można ułożyć “pionowo” względem pozostałych warstw jednak należy być świadomym, że zmniejsza to modyfikowalność i reużywalność modułu - warstwy ułożone poziomo, jeżeli zajdzie taka potrzeba, muszą być przenoszone razem z warstwami pionowymi (jeżeli je wykorzystują).

Poniżej przykład warstwowej architektury typowej aplikacji enterprise.

  • Presentation layer - odpowiada za generowanie kodu HTML, XML, JS itp dla interfejsu użytkownika

  • Deploy layer - publikuje funkcjonalności systemu za pomocą zbioru fasad z dobrze określonymi interfejsami

  • Services layer - warstwa ta jest zbiorem autonomicznych usług oferowanych wyższym warstwom

  • Logic layer - przechowuje stan aplikacji, zawiera implementację funkcjonalności systemu

  • Data Access layer - zawiera implementację klas komunikujących się z warstwą danych - bazami danych, systemami storage itp

  • Utils layer - warstwa zawiera implementację klas użytkowych i wspomagających, jest wykorzystywana przez wszystkie warstwy

  • Data transfer object layer - zawiera implementację klas transportowych umożliwiających transfer informacji i danych do wyższych warstw (np. warstwy prezentacji) lub systemów zewnętrznych, które nie powinny być ściśle związane z logiką aplikacji

Comments