Design Patterns 101

Nếu bạn đang là một lập trình viên hay đã từng học ngành phần mềm, thì hẳn nhiênlà bạn đã từng nghe qua thuật ngữ gọi là Software Design Patterns. Đây là một khái niệm không hề mới, tuy nhiên trong thực tế có rất ít developer có thể nắm được một cách chi tiết về nó.

Vậy Design Patterns là gì và nó mang lại lợi ích gì, khi nào thì tôi nên dùng?

Design pattern là các giải pháp chung cho những vấn đề thường xuyên gặp phải trong lĩnh vực thiết kế phần mềm. Một điều cần lưu ý đó là design patterns không phải là mẫu thiết kế hoàn chỉnh cho một bài toán cụ thể và có thể code được luôn mà nó chỉ là các mô tả chung nhất để giải quyết một bài toán theo một dạng nhất định mà có thể sử dụng được trong nhiều tình huống khác nhau.

Bởi vì Design patterns là những khuôn mẫu phát triển đã được kiểm định kỹ càng nên chúng giúp tăng tốc quá trình xây dựng phần mềm. Trong thực tế có những vấn đề không xuất hiện ngay trong giai đoạn ban đầu nhưng có thể gây ra những rắc rối sau này do những sai lầm trong thiết kế, do đó bằng cách sử dụng Design patterns chúng ta có thể ngăn ngừa những vấn đề tiềm tàng có thể xảy ra trước khi chúng chuyển thành các vấn đề nghiêm trọng. Design pattern còn giúp cải thiện code readability bởi những khuôn mẫu chung sẽ dễ dàng được nắm bắt bởi mọi lập trình viên có kiến thức về Design pattern. Quá trình trao đổi giữa các lập trình viên cũng thuận lợi hơn nhờ có những khái niệm chung đã định nghĩa bởi các mẫu thiết kế.

Bởi vậy các project, dù lớn hay nhỏ, đều có thể được hưởng lợi bằng cách áp dụng Design patterns. Nếu bạn là một developer chuyên nghiệp, bắt buộc bạn phải nắm được các giải pháp thông dụng đã được định nghĩa bởi Design patterns, nếu không bạn sẽ xây dựng nên các phần mềm dễ hư hỏng, khó bảo trì, và đặc biệt là ngốn nhiều thời gian và công sức của bạn và team mates một cách không cần thiết.

evolution.png
Lâp trình viên đã tiến hoá qua nhiều giai đoạn, bạn đã đủ tiến hoá chưa?

Các thể loại Design Patterns

Có rất nhiều Design Patterns (DP) khác nhau nhưng nói chung là được chia ra làm 3 loại dựa vào chức năng của chúng:

  1. Creational DP (kiến tạo)
  2. Structural DP (cấu trúc)
  3. Behavioral DP (biểu hiện)

Trong đó Creational DP liên quan đến việc tạo ra thể hiện (instantiation) một class hay một object. Creational DP bao gồm:

  1. Abstract Factory (Nhà máy trừu tượng)
    Trừu tượng hoá quá trình tạo objects theo nghiệp vụ, nền tảng,..
  2. Builder (Người kiến tạo)
    Tách khâu khởi tạo (construction) của object ra khỏi biễu diễn (representation) của nó.
  3. Factory Method (Phương pháp nhà máy)
    Tạo một instance từ một vài class được thừa kế.
  4. Object Pool (Hồ chứa object)
    Tránh việc nạp và giải phóng tài nguyên quá nhiều bằng cách loại bỏ các object không còn dùng nữa.
  5. Prototype (Khuôn mẫu)
    Tạo một instance đã được hoàn chỉnh để có thể được copy hay clone
  6. Singleton (Đơn nhất)
    Một class trong đó chỉ có một instance của nó được tồn tại.

Structural DP liên quan đến việc bố trí các class và object. Các interface được tạo ra qua việc thừa kế, và các tính năng mới được tạo ra nhờ việc tổ hợp các object với nhau.

  1. Adapter (Bộ chuyển đổi)
    Kết nối giao diện giữa các class khác nhau.
  2. Bridge (Cầu)
    Tách giao diện của một object ra khỏi việc thực thi của nó.
  3. Composite (Hỗn hợp)
    Sắp xếp các object theo cấu trúc cây để tạo thành một giao diện đồng nhất khi truy cập tới 1 object đơn lẻ hay tổ hợp của các object.
  4. Decorator (Trang trí)
    Thêm chức năng cho các object một cách động.
  5. Facade (Mặt tiền)
    Một class duy nhất biễu diễn toàn bộ một hệ thống con.
  6. Flyweight (Vật thể bay^^)
    Một instance tinh gọn dùng cho việc chia sẻ dễ dàng hơn.
  7. Private Class Data (Dữ liệu Class riêng tư)
    Hạn chế truy cập vào accessor/mutator
  8. Proxy (Uỷ quyền)
    Một object biễu diễn một object khác.

Hai DP kể trên đều đề cập đến quá trình giao tiếp giữa các object của một class. Behavioral DP thì lại chủ yếu nói về giao tiếp giữa các object.

  1. Chain of responsibility (Chuỗi trách nhiệm)
    Một cách đề truyền requesst giữa một chuỗi các object.
  2. Command (Lệnh)
    Đóng gói một lệnh request dưới dạng một object.
  3. Interpreter (Thông dịch viên)
    Cách để include các thành phần ngôn ngữ trong một chương trình.
  4. Iterator (Bộ lặp)
    Truy cập tuần tự các thành phần trong một tập hợp.
  5. Mediator (Người trung gian)
    Định nghĩa giao tiếp đơn giản hoá giữa các class.
  6. Memento (Vật lưu niệm)
    Lưu giữ và khôi phục một trang thái nội tại của object.
  7. Null Object (Object rỗng)
    Được thiết kế như một giá trị mặc định của một object.
  8. Observer (Người quan sát)
    Một cách để thông báo thay đổi cho một vài các class.
  9. State (Trạng thái)
    Thay đổi một biểu hiện của object khi trạng thái nó thay đổi.
  10. Strategy (Chiến thuật)
    Đóng gói một giải thuật vào trong một class.
  11. Template method (Phương pháp mẫu)
    Trì hoãn các bước thực thi của một giải thuật cho một subclass.
  12. Visitor (Người đến thăm)
    Định nghĩa một thao tác mới tới một class mà không làm thay đổi class đó.

design-patterns-classification.png

Như vậy tính cụ thể thì có tới 26 mẫu thiết kế khác nhau trong số 3 tập mẫu thiết kế (Creational, Structural, Behavioral). Bài sau tôi sẽ giải thích cụ thể hơn về một số Pattern thông dụng.

Leave a comment