Khi bạn lập trình dự án thông thường của mình tại công ty, mỗi lần có tính năng mới bạn sẽ cập nhật hoặc bổ sung mã nguồn vào dự án sau đó build và triển khai. Tuy nhiên với EzyPlatform bạn lại thấy một phong cách mới, nếu bạn cần các tính năng bạn có thể cài các plugin, nếu không thể có tính năng mà bạn yêu cầu thì bạn mới tạo ra hoặc cập nhật plugin, đây có thể coi là một màn ảo thuật bí ẩn. Để làm được việc này thì EzyPlatform cần một nền tảng vững chắc đó là các mẫu thiết kế - design patterns.

EzyPlatform sử dụng những design pattern nào?

design-patterns.png

Sẽ khó thống kê hết được có bao nhiêu design pattern được sử dụng trong EzyPlatform vì có những mẫu mà do chính đội ngũ phát triển sáng tạo ra và được đặt tên cụ thể, tuy nhiên tất các mẫu thiết kế nâng cao được sử dụng trong EzyPlatform đều được xây dựng trên 24 mẫu thiết kế kinh điển:

  1. Singleton: Gần như tất cả các thành phần được tạo từ các lớp trong EzyPlatform đều được khởi tạo ở dạng singleton, ví dụ như controller, service, repository, ... đây là những đối tượng được sử dụng thường xuyên, việc khởi tạo một lần duy nhất sẽ tiết kiệm bộ nhớ và đảm bảo hiểu năng.
  2. Factory: Để tạo ra các đối tượng có chung lớp cơ sở, ví dụ lớp DefaultThreadFactory
  3. Factory Method: Đóng gói việc tạo đối tượng và cho phép lớp thừa kế quy định đối tượng sẽ được tạo ra, ví dụ lớp PaginationResultRepository có các hàm abstract để tạo ra câu lệnh truy vấn và tham số.
  4. Abstract Factory: Đóng gói việc tạo đối tượng và cho phép tạo ra nhiều loại đối tượng khác nhau, ví dụ như lớp Reactive này là một biến thể của Abstract Factory.
  5. Builder: Thường dùng để tạo các đối tượng chỉ đọc hay không thể thay đổi được, ví dụ lớp DefaultUserFilter.Builder này để tạo ra một đối tượng lọc user chỉ đọc.
  6. Prototype: Thường dùng để sao chép đối tượng từ một đối tượng có sẵn, ví dụ từ một đối tượng ResultValueMap bạn có thể sao chép dữ liệu ra một đối tượng khác thông qua hàm castGet.
  7. Object Pool: Dùng để tạo ra các đối tượng có thể dùng lại nhiều lần để tránh khởi tạo không cần thiết, ví dụ trong lớp Scheduler này EzyPlatform sẽ tái sử dụng các thread và các task thay vì tạo mới.
  8. Chain of Responsibility: Là một chuỗi xử lý dữ liệu, ví dụ lớp WebRequestInterceptor là một thành phần trong chuỗi đánh chặn các yêu cầu của người dùng gửi đến.
  9. Command: Xử lý hành động theo câu lệnh tương ứng. Mỗi một hàm trong lớp controller mà bạn tạo ra có thể đóng vai trò như một đối tượng handler để xử lý command là yêu cầu người dùng gửi đến với uri và dữ liệu.
  10. Interpreter: Chuyển từ đối tượng này sang đối tượng khác. Các lớp converter chính là ví dụ rõ nét nhất.
  11. Iterator: Dùng để duyệt qua một tập hợp như bạn vẫn hay dùng vòng lặp. Mẫu này thì không chỉ EzyPlatform mà dự nào chúng ta cũng sử dụng.
  12. Mediator: Định nghĩ ra một lớp nhằm phá bỏ sự phụ thuộc chồng chéo giữa các lớp với nhau để tránh trường hợp phụ thuộc vòng tròn, các lớp controller service chính là các mediator.
  13. Memento: Dùng để quản lý trạng thái và trở lại trạng thái trước khi cần thiết, giống như tính năng undo và redo. Chức năng cho phép khôi phục phiên bản cũ của EzyPlatform sử dụng mẫu này.
  14. Observer: Lắng nghe một sự kiện sẽ xảy đến và xử lý sự kiện đó. Ví dụ như các lớp thuộc gói event.
  15. Strategy: Đưa ra các xử lý tương ứng với trạng thái đang xảy ra. Ví dụ tương ứng với điều kiện tìm kiếm mà EzyPlatform sẽ sử dụng các điều kiện phân trang khác nhau.
  16. Template Method: Quy định trình tự gọi hàm để đảm bảo lập trình viên không bị mắc sai lầm, nếu bạn dùng Android bạn sẽ thấy các hàm onCreate, onStart, ... đây là một trong những design pattern quan trọng nhất của Android. AbstractMessageProvider là một ví dụ sử dụng mẫu này.
  17. Visitor: "Thăm quan" các đối tượng trong một mảng hay một tập hợp, cũng tương tự như Iterator mẫu này thì không chỉ EzyPlatform mà dự nào chúng ta cũng sử dụng.
  18. Null Object: Có thể hiểu đơn giản là làm gì đó khi gặp giá trị null. EzyPlatform cũng sử dụng đối tượng Optional của Java và có một số logic yêu cầu bắt buộc phải xử lý với giá trị null.
  19. Adapter: Chuyển một interface của một class sang một interface của một class khác. Gói service chính là cài đặt của mẫu này.
  20. Bridge: Tạo cầu nối giữa các lớp khác nhau nhằm mục tiêu tách rời việc cài đặt giúp cho các lớp có thể thay đổi độc lập với nhau. Các lớp trong repo chính là sử dụng mẫu này.
  21. Composite: Kết hợp các lớp lại với nhau để tránh phải thừa kế hay cài đặt quá nhiều lớp và interface. Các lớp controller ngày đóng vai trò là các command handler thì cũng là các composite khi nó sử dụng các lớp thành phần để xử lý và phản hồi kết quả cho người dùng.
  22. Decorator: Là lớp để "trang hoàng" thêm cho đối tượng của chúng ta trước khi đưa đối tượng này vào sử dụng hoặc lưu trữ, phản hồi. Lớp WebViewDecorator sử dụng mẫu này.
  23. Flyweight: Dùng để chia sẻ một lượng lớn các đối tượng được khởi tạo một lần. Các lớp singleton trong EzyPlatform được đưa vào trong các map để quản lý, và nó chính là ứng dụng của Flyweight pattern.
  24. Proxy: Dùng để bọc lại đối tượng thực tế, thông thường chúng ta sử dụng bọc lại các đối tượng của thư viện bằng đối tượng của chúng ta, để dễ dàng thay đổi thư viện sau này. Lớp FolderProxy sử dụng mẫu này.

Những mẫu thiết kế nào được sử dụng nhiều nhất trong EzyPlatform?

Đứng đầu danh sách sẽ là composite design pattern. Mặc dù bạn không nhìn thấy nhưng EzyPlatform core sẽ chịu trách nhiệm thu thập thông tin về plugin và khởi tạo các thành phần có trong plugin nếu plugin đó được kích hoạt, có lẽ các kiến trúc phức tạp như EzyPlatform mới thực sự mô tả hết sự "phức hợp" theo nghĩa đen của từ composite.

Tiếp theo là adapter design pattern vì EzyPlatform sẽ cần rất nhiều lớp service để xử lý nghiệp vụ.

Tiếp theo là bridge design pattern vì EzyPlatform sẽ cần tương tác thường xuyên với cơ sở dữ liệu thông qua các lớp repository.

Tiếp theo là các lớp builder, khi bạn sử dụng EzyPlatform bạn sẽ thấy hầu hết các lớp dữ liệu sử dụng builder để tạo ra đối tượng không thay đổi được.

Tiếp theo là các lớp mediator, bởi vì quá phức tạp nên các lớp dễ bị phụ thuộc chồng chéo cần các controller service để hoá giải các phụ thuộc chồng chéo này.

Tiếp theo là các lớp decorator để tổng hợp dữ liệu và bổ trợ cho các controller service.

Tiếp theo là các lớp factory để đóng gói việc khởi tạo các đối tượng phức tạp.

Tổng kết

EzyPlatform sử dụng kiến trúc phần mềm plugin đây là một thách thức không nhỏ để cài đặt, chính vì vậy các mẫu thiết kế chính là nền tảng. Từ các mẫu thiết kế kinh điển và các mẫu thiết kế mới được sáng tạo EzyPlatform có khả năng mở rộng không có giới hạn.