Architectural Styles vs. Architectural Patterns vs. Design Patterns

4137

Bài viết được sự cho phép của tác giả Edward Thien Hoang

Trong bài này, hãy cùng định nghĩa và phân biệt một chút giữa 3 khái niệm Architectural Styles vs. Architectural Patterns vs. Design Patterns. Design Patterns chúng ta chắc chắn đã nghe và làm việc nhiều với nó như Singleton, Observer, Factory patterns, vậy còn Architectural Styles vs. Architectural Patterns? Ta thường nên nói là mẫu thiết kế MVC hay là kiến trúc MVC, đọc tiếp sẽ rõ.

Có rất nhiều cách định nghĩa và sử dụng hai cụm từ Architectural Styles và Architectural Patterns trong thế giới phần mềm. Theo MSDN nói thì Architectural Styles và Architectural Patterns là một, nhưng tôi lại thích cách giải thích của George Fairbanks and Michael Keeling và Wikipedia chỉ ra rằng chúng hoàn toàn khác nhau, điểm khác nhau mấu chốt nằm ở phạm vi (scope) của chúng.

Cũng phải nói thêm là Architectural Styles và Architectural Patterns tuy khác nhau nhưng không loại trừ lẫn nhau mà bổ sung cho nhau, như thường lệ, chúng ta cần phải nắm rõ và sử dụng chúng khi cần thiết.

  Clean Architecture: Đứng trên vai những gã khổng lồ
  Con muốn trở thành một Software Architect

ARCHITECTURAL STYLES

Là đỉnh cao nhất khi nói về architecture, cực kỳ high level, có thể chỉ là những nét vẽ sơ khai tạo hình nên bản thiết kế quy định cụ thể các lớp, mô đun cấp cao của ứng dụng và cách các mô đun và lớp tương tác với nhau như thế nào, mối quan hệ giữa chúng.

Architectural styles tell us, in very broad strokes, how to organise our code. It’s the highest level of granularity and it specifies layers, high-level modules of the application and how those modules and layers interact with each other, the relations between them.

Định nghĩa thì luôn mơ hồ, nhất với dân không chuyên về học thuật, vì vậy hãy dùng một số ví dụ về Architectural Styles:

  • Component-based
  • Monolithic application
  • Layered
  • Pipes and filters
  • Event-driven
  • Publish-subscribe
  • Plug-ins
  • Client-server
  • Service-oriented

Lấy ví dụ về Service-oriented (hướng dịch vụ), khi nhìn thấy cụm từ Service-oriented, chúng ta có thể hình dung ra hình hài đầu tiên của system là phải chia nhỏ ra thành các service độc lập với nhau, mỗi service lại được xây dựng và thực thi theo một cách riêng biệt và cuối cùng ghép nối chúng lại (dùng rất nhiều architecture pattern và design pattern) để tạo nên một system hoàn chỉnh. Nó không hề đề cập đến việc có sử dụng MVC, Singleton,… hay không, cho nên ta nói Architectural Style chỉ là khái niệm định hình nên “phong cách” của system sẽ được xây dựng.

ARCHITECTURAL PATTERNS

Một pattern là một giải pháp ứng với một vấn đề lặp đi lặp lại. Trong trường hợp của Architectural Patterns, nó giải quyết các vấn đề liên quan đến Architectural Styles. Ví dụ: “Chúng ta sẽ cần những lớp nào và chúng sẽ tương tác như thế nào, để xây dựng một hệ thống với một tập các layer cụ thể” hoặc “những high-level module nào sẽ có trong Service-Oriented Architecture của chúng ta và cách chúng giao tiếp” , hoặc “sẽ có bao nhiêu tiers trong kiến trúc Client-Server của chúng ta”.

A pattern is a recurring solution to a recurring problem. In the case of Architectural Patterns, they solve the problems related to the Architectural Style. For example, “what classes will we have and how will they interact, in order to implement a system with a specific set of layers“, or “what high-level modules will have in our Service-Oriented Architecture and how will they communicate“, or “how many tiers will our Client-server Architecture have“.

Các Architectural Patterns có ảnh hưởng rộng lớn đến code base, thường ảnh hưởng đến toàn bộ ứng dụng theo chiều ngang (horizontal) (ví dụ: làm thế nào để cấu trúc mã bên trong một layer) hoặc theo chiều dọc (vertical) (ví dụ: một request được xử lý từ những layers bên ngoài vào những layers bên trong và ngược trở lại).

Đọc thêm về Vertical vs Horizontal Approaches

Một vài ví dụ về Architectural Patterns:

  • Three-tier
  • Microkernel
  • Model-View-Controller
  • Model-View-ViewModel

Như vậy khi nói đến mô hình 3-tiers, MVC, MVVM thì ta xếp chúng chung vào một mục: Architectural Patterns. Ví dụ khi ta nói system sẽ được xây dựng theo “phong cách” Client-server, thì tiếp theo ta sẽ quyết định là nên xây dựng theo mô hình 3-tiers, với tier 1 là Client, tier 2 là Server xử lý business logic, tier 3 được tối ưu cho lưu trữ DB. Ta lại áp dụng thê MVVM để phân tách giữa front-end (HTML, Java Swing) với back-end code (model) thông qua view-model (presentation).

DESIGN PATTERNS

Design Patterns khác Architectural Patterns ở phạm vi (scope) của chúng. Design Patterns giải quyết các vấn đề cục bộ, nhỏ lẻ hơn, nó không ảnh hưởng lớn đến code base mà chỉ là 1 phần nhỏ trong đó. Ví dụ: Làm thể nào để khởi tạo 1 object khi chỉ có thể biết được loại object ta muốn khởi tạo lúc run-time (dùng Factory class?) Làm sao để khởi tạo duy nhất 1 object có thể sử dụng trong toàn bộ ứng dụng, ví dụ như Logger, ConfigHoler (Singleton?) Strategy, State machine, ….

Khi nói Plug-ins architecture, chúng ta vẫn chưa có dòng code nào, chỉ có các mô hình làm thế nào để plug&play 1 plugin vô system. Khi nói Model-View-Controller, ta cũng chỉ mới hình dung ra là cần phải có các Model, Controller, View chứ cũng chưa code code. Còn khi nói đến Singleton, là ta biết cần phải tạo ra 1 class với: private constructor, static getInstance() method, …

KẾT LUẬN

Như đã nói từ đầu, tất cả khác nhau nằm ở scope. Architectural Style là bản (phong cách, ý tưởng) thiết kế sơ khởi cho toàn bộ system ở mức độ high-level nhất. Architectural Pattern là tập các bản mẫu, practice để hiện thực Architectural Style; Design Pattern liên quan chặt chẽ tới code, dùng để giải quyết các vấn đề cục bộ khi lập trình.Và tất cả chúng đều được sử dụng trong quá trình phát triển phần mềm, và tất cả phụ thuộc vào thời điểm, mục đích, và người sử dụng.

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết được tham khảo từ:

Architectural Styles vs. Architectural Patterns vs. Design Patterns

Tổng hợp bởi edwardthienhoang

Bài viết gốc được đăng tải tại edwardthienhoang.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev