Software Pattern
Monday, November 5, 2007 3:21:41 PM
I. Pattern là gì?
Patterns đã tồn tại một thời gian khá dài trong phát triển phần mềm, tuy nhiên lại không có một định nghĩa trọn vẹn cho nó. Có lẽ định nghĩa được chấp nhận rộng rãi nhất là của Christopher Alexander, một kiến trúc sư với phát biểu về pattern trong ngành xây dựng: “Pattern mô tả một vấn đề lặp đi lặp lại, và giải pháp nền tảng cho vấn đề đó. Nó có thể xem như là một “khuôn mẫu” được áp dụng trong mọi trường hợp để giải quyết cùng một loại vấn đề”.
Nhìn chung ta có thể xem pattern như là một giải pháp trọn vẹn, thấu đáo cho một vấn đề nào đó. Đó là một giải pháp tổng quát được đúc kết và kiểm chứng từ rất nhiều người, và được xem xét ở mọi góc độ.
II. Các mục tiêu của pattern
Tầm ứng dụng của pattern là rất lớn. Nó tác động trực tiếp hoặc gián tiếp đến quá trình phát triển phần mềm. Nó giúp giảm chi phí (cost), thời gian phát triển hệ thống (development interval), tăng độ thõa mãn khách hàng (customer satisfaction) và hiệu quả công việc (productivity):
1. Tăng hiệu quả công việc:
Pattern giúp các nhà thiết kế nhanh chóng tìm ra một giải pháp tốt nhất cho một vấn đề đã được “pattern hóa”. Nó giúp tránh được việc phải sửa lại chương trình vì chọn lựa các giải pháp sai hoặc không trọn vẹn. Ngoài ra nó còn giúp cho quá trình bảo trì hay cải tiến hệ thống được dễ dàng hơn. Pattern còn cung cấp một số khái niệm và thuật ngữ chung trong thiết kế, giúp các nhà thiết kế dễ dàng hình dung ra giải pháp khi đề cập đến một pattern nào đó.
2. Giảm thời gian phát triển hệ thống:
Trong quá trình phát triển một hệ thống bất kì, ta luôn có thể bắt gặp các yếu tố lặp lại. Việc áp dụng pattern hiệu quả giúp giảm thời gian phát triển sản phẩm, vì rất nhiều thiết kế có thể được tái sử dụng thông qua pattern. Thời gian tiêu tốn cho việc tìm hiểu một sản phẩm có sẵn giảm đi nhiều khi pattern là một chỉ dẫn cơ bản cho hệ thống.
3. Giảm chi phí:
Chi phí giảm là hệ quả của việc tăng hiệu quả công việc và giảm thời gian phát triển sản phẩm.
4. Tăng độ thõa mãn khách hàng:
Khi hệ thống được phát triển nhanh, khả năng bảo trì và cải tiến cao thì đương nhiên độ thõa mãn khách hàng cũng tăng theo.
III. Phân biệt Pattern
Ta cần phải phân biệt được sự khác nhau giữa pattern với các khái niệm khác trong công nghệ phần mềm: idiom, principle, architecture và framework.
Idiom là cách sử dụng hay kết hợp các đơn vị cơ bản của một ngôn ngữ lập trình cụ thể. Trong khi đó pattern được hiểu như là việc tái sử dụng ý tưởng, không phụ thuộc vào một ngôn ngữ nào. Principle được xem như là các tiêu chí, quy tắc về thiết kế chứ không phải là một giải pháp cho một vấn đề cụ thể. Architecture là cấu trúc tổng thể của cả ứng dụng, có thể được mô tả bởi một tập các pattern khác nhau. Pattern có thể được xem là một micro-architecture. Framework là pattern ở mức hệ thống, nó có thể hiện thực là một sản phẩm có mã nguồn hoàn chỉnh, làm nền tảng cho một loại ứng dụng.
Pattern có nhiều cách phân nhóm khác nhau tùy theo các tiêu chí được áp dụng, một trong đó là sự phân loại theo tầm vực ảnh hưởng của nó. Theo đó, pattern được phân thành ba lớp: idiom ở mức thấp nhất, design pattern ở giữa, và trên cùng là framework. Dưới đây sẽ đi vào chi tiết ba khái niệm trên.
1. Idiom
Idiom là mô hình mẫu ở mức trừu tượng thấp nhất, nó phụ thuộc trực tiếp vào ngôn ngữ lập trình và thường được hiện thực ở trong chính ngôn ngữ.
Một ví dụ rõ thấy nhất của Idiom là: Hàm dựng (constructor) và hàm hủy (destructor) trong C++
Đây là một tính chất quan trọng và thiết yếu của một ngôn ngữ lập trình hướng đối tượng, được xây dựng sẵn trong ngôn ngữ. Có thể xem nó là một pattern cho việc khởi tạo và hủy đối tượng một cách an toàn.
2. Design Pattern
Thiết kế mẫu (design pattern) ở mức trừu tượng cao. Nó mô tả một giải pháp thiết kế tổng quát và trọn vẹn cho một loại vấn đề nào đó. Design pattern cần phải được hiểu theo nghĩa tái sử dụng ý tưởng hơn là mã lệnh, chính vì vậy Design pattern không phụ thuộc vào ngôn ngữ lập trình hay công nghệ. Design pattern là một microarchitecture, có tầm vực lớn hơn đối tượng nhưng không đủ lớn ở mức hệ thống.
Design pattern được xem là một bước tiến quan trọng trong thiết kế hướng đến đối tượng. Bắt đầu là cuốn sách “Design Patterns: Elements of Reusable Object-Oriented Software” của Gamma, B., R. Helm, R. Johnson, và J. Vlissides với 23 giải pháp thiết kế cho 23 loại vấn đề khác nhau. Design pattern hiện nay được xem là một trong những kiến thức không thể thiếu của một nhà thiết kế. Nó được thể hiện trong cả một số ngôn ngữ hướng đến đối tượng sau này như là Java, C#. Một ví dụ về Design pattern trong ngôn ngữ Java là Iterator. Iterator che đi hiện thực cụ thể của vật chứa, nó cho phép ta viết các đoạn mã tổng quát để duyệt hay chọn phần tử trong vật chứa mà không cần phải bận tâm đến hiện thực cụ thể của vật chứa đó. Nhờ đó đoạn mã của ta có thể dùng cho bất cứ vật chứa nào có hỗ trợ Iterator.
3. Framework
Framework là pattern ở mức hệ thống, nó chuyên biệt hóa hơn design pattern và có một phạm vi ảnh hưởng riêng biệt. Framework có thể hiện thực là một sản phẩm có mã nguồn hoàn chỉnh, làm nền tảng cho một loại ứng dụng cụ thể. Trong khi design pattern chỉ là tái sử dụng lại thiết kế, đối với framework đó là việc sử dụng lại cả mô hình thiết kế và mã nguồn. Có thể nói, trong hệ thống hướng đối tượng, framework chính là việc tái sử dụng phần mềm (software reuse) ở mức cao nhất.
Việc chia pattern thành 3 mức độ: idiom, design pattern, và framework chỉ mang tính chất tương đối, nó còn tùy vào cách tiếp cận và cả ngôn ngữ hiện thực. Một ví dụ tiêu biểu là pattern Model-View-Controler, nó bắt đầu được biết đến như là một idiom của Smalltalk được dùng để xây dựng GUI, nhưng sau đó nhanh chóng phổ biến và là design pattern của hầu hết các ngôn ngữ hướng đối tượng khác.
IV. Các thành phần của một Pattern
Có nhiều cách mô tả một pattern, nhưng nhìn chung nó gồm bốn phần chính:
- Tên của pattern (pattern name): mỗi một pattern có tên nêu bật được vấn đề nó hướng đến. Việc đánh tên cho pattern làm tăng vốn “từ vựng” trong thiết kế, giúp các nhà phát triển trao đổi với nhau dễ dàng, khi đề cập đến tên một pattern nào đó, bất cứ ai biết về pattern đó đều có thể nhanh chóng nhận ra giải pháp mà người nói hướng đến.
- Vấn đề xử lý (problem): mô tả cái mà pattern đang muốn đề cập đến. Đó là vấn đề cần xử lý và ngữ cảnh của nó. Đôi khi chỉ mô tả vấn đề không đủ để quyết định có nên áp dụng một pattern nào đó, việc mô tả ngữ cảnh cũng như các điều kiện cần thõa trước khi áp dụng pattern giúp cho việc quyết định chính xác hơn.
- Giải pháp (solution): mô tả giải pháp cho vấn đề, đó có thể là các mối quan hệ, nhiệm vụ và cách tương tác giữa các đối tượng, các lớp. Đây không phải là là một hiện thực cụ thể mà là một mô tả trừu tượng về vấn đề và cách thức giải quyết thông qua các lớp hay đối tượng, nó được hiện thực tùy theo ngôn ngữ lập trình áp dụng.
- Kết quả (consequences): kết quả việc áp dụng pattern. Đó là những thuận lợi cũng như chi phí khi áp dụng chúng. Việc mô tả đầy đủ giúp ta hiểu và đánh giá chính xác giá trị của một pattern trong dự án.
V. Kết luận
Software Pattern thật sự là bước tiến trong phát triển phần mềm, chúng cung cấp giải pháp tốt nhất cho các vấn đề thường gặp. Nói một cách khác, pattern giúp ta học từ thành công của người khác, thay vì từ thất bại của bản thân. Nhờ có pattern, phần mềm được phát triển nhanh, an toàn và có khả năng mở rộng hơn. Hiện nay pattern được xem là một trong những kiến thức không thể thiếu của một kiến trúc sư phần mềm.
Nguồn: http://lecanhkhanh.com/blogs/?p=187












