Design Pattern từ đơn giản đến phức tạp(P1)

Nguyễn Thành Trung
Edumall Engineering
4 min readFeb 12, 2019

Món khai vị dành cho lập trình viên tham gia phỏng vấn ở khá nhiều công ty là “bạn hãy nói cho biết về Object Oriented Programing bla bla …“. Oh Easy money. Một tràng câu trả lời được ghim sẵn trong đầu sẽ được ứng viên tuôn ra như suối chảy. Nào là tính đa hình, tính đóng gói, tính kế thừa, tính trừu tượng. Yeah. Quá hay, vậy bạn có sử dụng Design Pattern để lập trình không?. Đến đây thường sẽ xuất hiện một khoảng lặng nhất định. Cá nhân mình từng phỏng vấn nhiều ứng viên, câu chuyện thường bắt đầu như sau:

  • ƯV: Có anh ạ. Em thường dùng một số mẫu như Singleton Pattern, Factory Pattern, Builder Pattern
  • NPV: Vậy bạn chia sẻ thêm về việc khi mẫu đó là gì và khi nào dùng nó
  • ƯV: ….

Humm, nếu đọc trên wiki, OOP Design Pattern có đến 23 mẫu cơ bản, kinh điển. 3,4 mẫu trên 23 là một tỷ lệ không lớn lắm mà các ứng viên có thể đem đến cho buổi phỏng vấn. Có một điều khá thú vị là phần lớn những người phỏng vấn cũng chỉ nắm nổi khoảng 10 mẫu Design Pattern quay lại. Cá nhân mình có quan niệm cố gắng dùng thật nhiều Design Pattern để lập trình. Nhưng thú thật cũng chỉ nhớ/dùng được khoảng 9–10 mẫu(Chưa được nổi 50%).

Vậy thì Design Pattern là gì và tại sao nó khó nắm bắt đến vậy?. Không hi vọng một bài viết có thể chia sẻ hết về nó, trong khuôn khổ bài này cũng chỉ hi vọng đem lại cho bạn đọc một góc nhìn về nó.

Nếu để ý sẽ thấy khái niệm Design Pattern luôn gắn chặt với Object Oriented Programing(OOP). Vậy trước tiên hãy dành đôi lời cho OOP.

OOP là một trong những mô hình/mẫu hình lập trình(Programming paradigm).Có lẽ trong các Programming Paradigm ở thời điểm hiện tại OOP là nổi tiếng hơn cả. Nó nổi tiếng đến mức trong giới lập trình viên, ít ai còn nhắc đến các mẫu khác nữa. OOP giúp người lập trình viên có thể xem một chương trình như là một tập hợp của các đối tượng có tính tương tác. Để có thể mang hơi thở của đối tượng vào ngôn ngữ lập trình, OOP để ra 4 khái niệm gốc(cơ bản) là tính trừu tượng(Abstraction), tính kế thừa(Inheritance), tính đa hình(Polymorphismm) và tính đóng gói(Encapsulation). OOP hiện hữu cho một Style là lập trình hướng class(class-orientation). Ở tầng lập trình viên mọi thứ sẽ được định nghĩa thành các lớp(Class) và đối tượng sẽ là hiện hữu(cài đặt) của các lớp đó.

Thêm chút nữa về câu chuyện lịch sử về OOP. Theo link, khái niệm OOP xuất hiện từ những năm 70 của thế kỷ trước(Thậm chí theo nguồn còn ghi là 1967). OOP trở nên nổi tiếng hơn từ những năm 1980 khi nó được gắn với ngôn ngữ C++. Và ngày nay nó tồn tại trong hầu hết các ngôn ngữ bậc cao.

Pattern là một khái niệm kiến trúc cơ bản của phát triển phần mềm được đưa ra từ những năm 1977/1978 bởi Christopher Alexander. Vào những năm 1994 sau khi quyển sách(Design Patterns: Elements of Reusable Object-Oriented Software) được xuất bản, Design Patterns trở nên nổi tiếng, có tính đại chúng trong giới công nghệ. Quyển sách chia thành 2 chapter trong đó Chapter 1 thảo luận về kỹ thuật thiết kế hướng đối tượng trong đó có một số luận điểm rất đáng chú ý:

  • Program to an ‘interface’, not an ‘implementation
  • Composition over inheritance (or composite reuse principle)

Chapter 2 là nhưng case study cũng như các vấn đề về liên quan đến thiết kế

Ok như vậy ở tầng lịch sử chúng ta đã có một cái nhìn tương đối overview, vậy giờ chúng ta sẽ bắt đầu zoom sâu hơn về Software Design Pattern ở tầng khái niệm, phân loại

Ở tầng khái niệm theo định nghĩa của wiki design pattern là một giải pháp common hoá với mục đích tiêu là tái sử dụng mã nguồn. Nó không chỉ dừng ở mặt thiết kế mà còn chuyển đổi sang tầng thực thi. Design pattern được xem là phương án(Best practise) tốt nhất mà người lập trình viên dùng để giải quyết các vấn đề chung khi thiết kế phần mềm, hệ thống

Design Pattern được nhóm thành 3 loại chính: creational pattern(Có thể gọi nôm na là nhóm khởi tạo), structural patterns(Nhóm liên quan đến cấu trúc), behavioral pattern(Nhóm Pattern liên quan đến hành vi). Tổng số pattern có mặt trong danh sách này bằng 23 mẫu kinh điển nổi tiếng được nhắc đến ở trên. Bên cạnh đó chúng ta cũng có một phân hệ cho Design Pattern liên quan đến kiến trúc phần mềm và điển hình là M-V-C(Model-View-Controller). Thời gian gần đây với sự phát triển mạnh về lập trình đa luồng một nhóm nữa được hình thành và phát triển rất mạnh là nhóm Pattern liên quan đến Concurrency. Nó đóng góp thêm 13 mẫu thiết kế nữa cho phần phát triển phần mềm. Và quả thực nó cũng là một trong những mẫu gây nhiều bối rối nhất cho lập trình viên có thể đọc và hiểu được nó

Đến đây tạm thời đã có được một cái nhìn tổng quan về Design Pattern. Chúng ta sẽ nói chuyện tiếp về Design Pattern ở sâu hơn với việc đi vào chi tiết về nhóm mẫu thiết kế dành cho việc khởi tạo(creational pattern) ở bài sau

Link tham khảo: https://en.wikipedia.org/wiki/Software_design_pattern

--

--