Design Patterns là các mẫu thiết kế đuợc các lập trình viên sử dụng rộng rãi. Mỗi mẫu "Design Patterns" là 1 giải pháp giải quyết tốt cho các lập trình viên khi ở truờng hợp nhất định.
Design patterns là tập các giải pháp cho cho vấn đề phổ biến trong thiết kế các hệ thống máy tính. Đây là tập các giải pháp đã được công nhận là tài liệu có giá trị, những người phát triển có thể áp dụng giải pháp này để giải quyết các vấn đề tương tự.
Giống như với các yêu cầu của thiết kế và phân tích hướng đối tượng (nhằm đạt được khả năng sử dụng các thành phần và thư viện lớp), việc sử dụng các mẫu cũng cần phải đạt được khả năng tái sử dụng các giải pháp chuẩn đối với vấn đề thường xuyên xảy ra.
Christopher Alexander nói rằng :” Mỗi một mẫu mô tả một vấn đề xảy ra lặp đi lặp lại trong môi trường và mô tả cái cốt lõi của giải pháp để cho vấn đề đó.Bằng cách nào đó bạn đã dùng nó cả triệu lần mà không làm giống nhau 2 lần”.
I. Hệ thống các mẫu
Hệ thống các mẫu design pattern hiện có 23 mẫu được định nghĩa trong cuốn “Design patterns Elements of Reusable Object Oriented Software”. Hệ thống các mẫu này có thể nói là đủ và tối ưu cho việc giải quyết hết các vấn đề của bài toán phân tích thiết kế và xây dựng phần mềm trong thời điểm hiện tại.Hệ thống các mẫu design pattern được chia thành 3 nhóm: Creational, nhóm Structural,nhóm behavioral.
I.1. Nhóm Creational
Gồm có 5 pattern: AbstractFactory, Abstract Method, Builder, Prototype, và Singleton. Nhóm này liên quan tới việc tạo ra các thể nghiệm (instance) của đối tượng, tách biệt với cách được thực hiện từ ứng dụng. Muốn xem xét thông tin của các mẫu trong nhóm này thì phải dựa vào biểu đồ nào phụ thuộc vào chính mẫu đó, mẫu thiên về hành vi hay cấu trúc.
I.2. Nhóm Structural
Gồm có 7 mẫu : Adapter, Bridge,Composite,Decorator,Facade,Proxy,và Flyweight.Nhóm này liên quan tới các quan hệ cấu trúc giữa các thể nghiệm, dùng kế thừa,kết tập, tương tác. Để xem thông tin về mẫu này phải dựa vào biểu đồ lớp của mẫu.
I.3. Nhóm Behavioral
Gồm có 11 mẫu : Interpreter,Template Method,Chain of esponsibility,Command,terator,Mediator,Memento,Observer,State,Strategy và Visitor.Nhóm này liên quan đến các quan hệ gán trách nhiệm để cung cấp các chức năng giữa các đối tượng trong hệ thống. Đối với các mẫu thuộc nhóm này ta có thể dựa vào biểu đồ cộng tác và biểu đồ diễn tiến. Biểu đồ cộng tác và biểu đồ diễn tiến sẽ giải thích cho ta cách chuyển giao của các chức năng.
Mẫu AbstractFactory là một mẫu thiết kế mà cung cấp cho trình khách một giao diện cho một họ hoặc một tập các đối tượng thuộc các lớp khác nhau nhưng có cùng chung giao diện với nhau mà không phải trực tiếp làm việc với từng lớp con cụ thể.
2. Builder Patterns
Builder là mẫu thiết kế hướng đối tượng được tạo ra để chia một công việc khởi tạo phức tạp của một đối tượng ra riêng rẽ từ đó có thể tiến hành khởi tạo đối tượng ở các hoàn cảnh khác nhau.
3.Factory Method Patterns
Factory Method là một giao diện cho việc tạo ra một đối tượng, nhưng để cho lớp dẫn xuất quyết định lớp nào sẽ được tạo.Factory method để cho một lớp trì hoãn sự thể nghiệm một lớp con.
4. Prototype Patterns
Prototype là mẫu thiết kế chỉ định ra một đối tượng đặc biệt để khởi tạo, nó sử dụng một thể nghiệm sơ khai rồi sau đó sao chép ra các đối tượng khác từ mẫu đối tượng này.
5. Singleton Patterns
Singleton là mẫu thiết kế nhằm đảm bảo chỉ có duy nhất một thể nghiệm và cung cấp điểm truy cập của nó một cách thống nhất toàn cục.
Adapter là mẫu thiết kế dùng để biến đổi giao diện của một lớp thành một giao diện khác mà clients yêu cầu. Adapter ngăn cản các lớp làm việc cùng nhau đó không thể làm bằng cách nào khác bởi giao diện không tương thích.
2. Bridge Patterns
Bridge là mẫu thiết kế dùng để tách riêng một lớp trừu tượng khỏi thành phần cài đặt của nó để có được hai cái có thể biến đổi độc lập.
3. Composite Patterns
Composite là mẫu thiết kế dùng để tạo ra các đối tượng trong các cấu trúc cây để biểu diễn hệ thống phân lớp: bộ phận – toàn bộ. Composite cho phép các client tác động đến từng đối tượng và các thành phần của đối tượng một cách thống nhất.
4. Decorator Patterns
Gắn một vài chức năng bổ sung cho các đối tượng (gán động). Decorator cung cấp một số thay đổi mềm dẻo cho các phân lớp để mở rộng thêm các chức năng.
5. Facade Patterns
Mẫu Facade cung cấp một giao diện thống nhất cho một tập các giao diện trong một hệ thống con. Facade định nghĩa một giao diện ở mức cao hơn, giao diện này làm cho hệ thống con được sử dụng dễ dàng hơn.
6. Flyweight Patterns
Mẫu thiết kế Flyweight là mẫu thiết kế được sử dụng việc chia xẻ để trợ giúp một lượng lớn các đối tượng một cách hiệu quả.
Việc sử dụng mẫu này cần chú ý rằng :các hiệu ứng của Flyweight pattern đòi hỏi rất nhiều vào việc nó được sử dụng ở đâu và sử dụng nó như thế nào. Sử dụng Flyweight pattern khi tất cả cá điều sau đây là đúng:
- Một ứng dụng sử dụng một lượng lớn các đối tượng.
- Giá thành lưu trữ rất cao bởi số lượng các đối tượng là rất lớn.
- Hầu hết trạng thái của các đối tượng có thể chịu tác động từ bên ngoài.
- Ứng dụng không yêu cầu đối tượng đồng nhất. Khi các đối tượng flyweight có
thể bị phân tách, việc kiểm tra tính đồng nhất sẽ trả về đúng cho các đối tượng
được định nghĩa dựa trên các khái niệm khác nhau.
7. Proxy Patterns
Cung cấp một đại diện cho một đối tượng khác để điều khiển việc truy nhập nó.
Mẫu Chain of Responsiblity dùng để tránh sự liên kết trực tiếp giữa đối tượng gửi yêu cầu và đối tượng nhận yêu cầu khi yêu cầu có thể đựơc xử lý bởi hơn một đối tượng. Móc nối các đối tượng nhận yêu cầu thành một chuỗi và gửi yêu cầu theo chuỗi đó cho đến khi có một đối tượng xử lý nó.
2. Command Patterns
Mẫu Command đóng gói yêu cầu như là một đối tượng, làm cho nó có thể được truyền như một tham số, được lưu trữ trong một history list hoặc thao tác theo những cách thức khác nhau.
3. Interperter Patterns
Interpreter đưa ra một ngôn ngữ, xây dựng cách diễn đạt ngôn ngữ đó cùng với một trình phiên dịch sử dụng cách diễn tả trên để phiên dịch các câu.
4. Iterator Patterns
Mẫu Iterator cung cấp khả năng truy cập và duyệt các thành phần của một tập hợp không cần quan tâm đến cách thức biểu diễn bên trong.
5. Mediator Patterns
Mediator dùng để đóng gói cách thức tương tác của một tập hợp các đối tượng. Giảm bớt liên kết và cho phép thay đổi cách thức tương tác giữa các đối tượng.
6. Memento Patterns
Memento là mẫu thiết kế có thể lưu lại trạng thái của một đối tượng để khôi phục lại sau này mà không vi phạm nguyên tắc đóng gói.
7. Observer Patterns
Observer định nghĩa một phụ thuộc 1- nhiều giữa các đối tượng để khi một đối tượng thay đổi trạng thái thì tất cả các phục thuộc của nó được nhận biết và cập nhật tự động.
8. Sate Patterns
Sate là mẫu thiết kế cho phép một đối tượng thay đổi các hành vi của nó khi các trạng thái bên trong của nó thay đổi. Đối tượng sẽ xuất hiện để thay đổi các lớp của nó.
9. Strategy Patterns
Strategy là mẫu thiết kế dùng để định nghĩa một họ các thuật toán, đóng gói mỗi thuật toán đó và làm cho chúng có khả năng thay đổi dễ dàng.Strategy cho phép giả thuật tùy biến một cách độc lập tại các Client sử dụng nó.
10. Template Method Patterns
Template Method là mẫu xác định sườn của một giải thuật trong một thao tác, theo một số bước của các phân lớp. Template Method cho phép các lớp con xác định lại chắc chắn một số bước của một giải thuật bên ngoài cấu trúc của giải thuật đó.
11. Visitor Patterns
Visitor là mẫu thiết kế xác định sườn của một giải thuật trong một thao tác, theo một số bước của các phân lớp. Template Method cho phép các lớp con xác định lại chắc chắn một số bước của một giải thuật bên ngoài cấu trúc của giải thuật đó.
II. Ứng dụng Design Pattern trong thực tế phân tích thiết kế phần mềm hướng đối tượng
Ứng dụng của design pattern trong thực tế phân tích thiết kế phần mềm hướng đối tượng là rất lớn. Hầu như cứ ở đâu có phần mềm hướng đối tượng thì ở đó có design pattern. Design pattern được vận dụng linh hoạt và dưới nhiều hình thức khác nhau.Trong nội dung đồ án môn học này chúng tôi xin trình bày một vài ứng dụng điển hình của Design pattern.
I.Framework
Cả Framework có liên quan đến mẫu, nhưng giữa chúng có sự khác nhau rõ ràng. Framework thì tổng quát hơn và có thể áp dụng cho một lĩnh vực cụ thể.Ví dụ Framework tài chính sẽ chứa các lớp về tài chính trong các mối quan hệ được xác định bởi các mẫu thiết kế, từ framework này có thể phát triển để tạo ra các ứng dụng về tài chính.Framework là một tập các lớp được đóng gói để có thể dùng lại cho các ứng dụng cụ thể. Ứng dụng thực hiện Customize các lớp này như kế thừa, dẫn xuất để tạo ra các lớp mới phục vụ cho mục đích của ứng dụng.Framework phải có được những đặc điểm là : nhỏ gọn,và đầy đủ dễ customize, tính khái quát cao,... Tập các lớp trong framework được cài đặt và thiết lập các mối quan hệ theo các mẫu design pattern.
II.Kiến trúc Add – Ins
Đây là một mô hình ứng dụng cho phép tạo ra một giao diện ghép nối các môđun ứng dụng một cách dễ dàng. Ứng dụng gồm có nhân ứng dụng (core) và các môđun ghép nối là các gói DLL. Cấu hình của ứng dụng được lưu vào các file định dạng XML.
Global property thường là các mẫu thực thể (datasim) có thể cấu hình các thành phần được.
Resource : thường là các lớp singleton quản lý tài nguyên tập trung bao gồm
- Icon Resource
- Error Message Resource
- Language Resource
Chúng được gộp vào một đối tượng quản lý là SingletonResourceManager cung cấp mọi điểm truy cập đồng nhất trong đối tượng.
Basic GUI layer : cung cấp các giao diện đồ hoạ cơ bản.Thường sử dụng các mẫu Abstract Factory, Abstract Method Proxy, Facade và Memento (kết hợp với XML).
Extensible Module Tree : Đây là phần quan trọng của nhân ứng dụng. Nó cung cấp các giao diện ghép nối với các mô đun bên ngoài. Các lớp trong phần này thường được cài đặt dưới dạng các Entity patterns (mẫu thực thể), hay còn gọi là các Codon. Mỗi codon gồm có :ID (name - chỉ duy nhất một tên cho một codon), Label( nhãn có thể trùng nhau) và Class (đây là mã thực thi của codon đó). Class này thường là
các Command patterns.
Design patterns là tập các giải pháp cho cho vấn đề phổ biến trong thiết kế các hệ thống máy tính. Đây là tập các giải pháp đã được công nhận là tài liệu có giá trị, những người phát triển có thể áp dụng giải pháp này để giải quyết các vấn đề tương tự.
Giống như với các yêu cầu của thiết kế và phân tích hướng đối tượng (nhằm đạt được khả năng sử dụng các thành phần và thư viện lớp), việc sử dụng các mẫu cũng cần phải đạt được khả năng tái sử dụng các giải pháp chuẩn đối với vấn đề thường xuyên xảy ra.
Christopher Alexander nói rằng :” Mỗi một mẫu mô tả một vấn đề xảy ra lặp đi lặp lại trong môi trường và mô tả cái cốt lõi của giải pháp để cho vấn đề đó.Bằng cách nào đó bạn đã dùng nó cả triệu lần mà không làm giống nhau 2 lần”.
I. Hệ thống các mẫu
Hệ thống các mẫu design pattern hiện có 23 mẫu được định nghĩa trong cuốn “Design patterns Elements of Reusable Object Oriented Software”. Hệ thống các mẫu này có thể nói là đủ và tối ưu cho việc giải quyết hết các vấn đề của bài toán phân tích thiết kế và xây dựng phần mềm trong thời điểm hiện tại.Hệ thống các mẫu design pattern được chia thành 3 nhóm: Creational, nhóm Structural,nhóm behavioral.
I.1. Nhóm Creational
Gồm có 5 pattern: AbstractFactory, Abstract Method, Builder, Prototype, và Singleton. Nhóm này liên quan tới việc tạo ra các thể nghiệm (instance) của đối tượng, tách biệt với cách được thực hiện từ ứng dụng. Muốn xem xét thông tin của các mẫu trong nhóm này thì phải dựa vào biểu đồ nào phụ thuộc vào chính mẫu đó, mẫu thiên về hành vi hay cấu trúc.
I.2. Nhóm Structural
Gồm có 7 mẫu : Adapter, Bridge,Composite,Decorator,Facade,Proxy,và Flyweight.Nhóm này liên quan tới các quan hệ cấu trúc giữa các thể nghiệm, dùng kế thừa,kết tập, tương tác. Để xem thông tin về mẫu này phải dựa vào biểu đồ lớp của mẫu.
I.3. Nhóm Behavioral
Gồm có 11 mẫu : Interpreter,Template Method,Chain of esponsibility,Command,terator,Mediator,Memento,Observer,State,Strategy và Visitor.Nhóm này liên quan đến các quan hệ gán trách nhiệm để cung cấp các chức năng giữa các đối tượng trong hệ thống. Đối với các mẫu thuộc nhóm này ta có thể dựa vào biểu đồ cộng tác và biểu đồ diễn tiến. Biểu đồ cộng tác và biểu đồ diễn tiến sẽ giải thích cho ta cách chuyển giao của các chức năng.
Creational Design Patterns
1.Abstract factory PatternsMẫu AbstractFactory là một mẫu thiết kế mà cung cấp cho trình khách một giao diện cho một họ hoặc một tập các đối tượng thuộc các lớp khác nhau nhưng có cùng chung giao diện với nhau mà không phải trực tiếp làm việc với từng lớp con cụ thể.
2. Builder Patterns
Builder là mẫu thiết kế hướng đối tượng được tạo ra để chia một công việc khởi tạo phức tạp của một đối tượng ra riêng rẽ từ đó có thể tiến hành khởi tạo đối tượng ở các hoàn cảnh khác nhau.
3.Factory Method Patterns
Factory Method là một giao diện cho việc tạo ra một đối tượng, nhưng để cho lớp dẫn xuất quyết định lớp nào sẽ được tạo.Factory method để cho một lớp trì hoãn sự thể nghiệm một lớp con.
4. Prototype Patterns
Prototype là mẫu thiết kế chỉ định ra một đối tượng đặc biệt để khởi tạo, nó sử dụng một thể nghiệm sơ khai rồi sau đó sao chép ra các đối tượng khác từ mẫu đối tượng này.
5. Singleton Patterns
Singleton là mẫu thiết kế nhằm đảm bảo chỉ có duy nhất một thể nghiệm và cung cấp điểm truy cập của nó một cách thống nhất toàn cục.
Stuctural Design Patterns
1.Adapter PatternsAdapter là mẫu thiết kế dùng để biến đổi giao diện của một lớp thành một giao diện khác mà clients yêu cầu. Adapter ngăn cản các lớp làm việc cùng nhau đó không thể làm bằng cách nào khác bởi giao diện không tương thích.
2. Bridge Patterns
Bridge là mẫu thiết kế dùng để tách riêng một lớp trừu tượng khỏi thành phần cài đặt của nó để có được hai cái có thể biến đổi độc lập.
3. Composite Patterns
Composite là mẫu thiết kế dùng để tạo ra các đối tượng trong các cấu trúc cây để biểu diễn hệ thống phân lớp: bộ phận – toàn bộ. Composite cho phép các client tác động đến từng đối tượng và các thành phần của đối tượng một cách thống nhất.
4. Decorator Patterns
Gắn một vài chức năng bổ sung cho các đối tượng (gán động). Decorator cung cấp một số thay đổi mềm dẻo cho các phân lớp để mở rộng thêm các chức năng.
5. Facade Patterns
Mẫu Facade cung cấp một giao diện thống nhất cho một tập các giao diện trong một hệ thống con. Facade định nghĩa một giao diện ở mức cao hơn, giao diện này làm cho hệ thống con được sử dụng dễ dàng hơn.
6. Flyweight Patterns
Mẫu thiết kế Flyweight là mẫu thiết kế được sử dụng việc chia xẻ để trợ giúp một lượng lớn các đối tượng một cách hiệu quả.
Việc sử dụng mẫu này cần chú ý rằng :các hiệu ứng của Flyweight pattern đòi hỏi rất nhiều vào việc nó được sử dụng ở đâu và sử dụng nó như thế nào. Sử dụng Flyweight pattern khi tất cả cá điều sau đây là đúng:
- Một ứng dụng sử dụng một lượng lớn các đối tượng.
- Giá thành lưu trữ rất cao bởi số lượng các đối tượng là rất lớn.
- Hầu hết trạng thái của các đối tượng có thể chịu tác động từ bên ngoài.
- Ứng dụng không yêu cầu đối tượng đồng nhất. Khi các đối tượng flyweight có
thể bị phân tách, việc kiểm tra tính đồng nhất sẽ trả về đúng cho các đối tượng
được định nghĩa dựa trên các khái niệm khác nhau.
7. Proxy Patterns
Cung cấp một đại diện cho một đối tượng khác để điều khiển việc truy nhập nó.
Behavioral Design Patterns
1.Chain of Responsibility PatternsMẫu Chain of Responsiblity dùng để tránh sự liên kết trực tiếp giữa đối tượng gửi yêu cầu và đối tượng nhận yêu cầu khi yêu cầu có thể đựơc xử lý bởi hơn một đối tượng. Móc nối các đối tượng nhận yêu cầu thành một chuỗi và gửi yêu cầu theo chuỗi đó cho đến khi có một đối tượng xử lý nó.
2. Command Patterns
Mẫu Command đóng gói yêu cầu như là một đối tượng, làm cho nó có thể được truyền như một tham số, được lưu trữ trong một history list hoặc thao tác theo những cách thức khác nhau.
3. Interperter Patterns
Interpreter đưa ra một ngôn ngữ, xây dựng cách diễn đạt ngôn ngữ đó cùng với một trình phiên dịch sử dụng cách diễn tả trên để phiên dịch các câu.
4. Iterator Patterns
Mẫu Iterator cung cấp khả năng truy cập và duyệt các thành phần của một tập hợp không cần quan tâm đến cách thức biểu diễn bên trong.
5. Mediator Patterns
Mediator dùng để đóng gói cách thức tương tác của một tập hợp các đối tượng. Giảm bớt liên kết và cho phép thay đổi cách thức tương tác giữa các đối tượng.
6. Memento Patterns
Memento là mẫu thiết kế có thể lưu lại trạng thái của một đối tượng để khôi phục lại sau này mà không vi phạm nguyên tắc đóng gói.
7. Observer Patterns
Observer định nghĩa một phụ thuộc 1- nhiều giữa các đối tượng để khi một đối tượng thay đổi trạng thái thì tất cả các phục thuộc của nó được nhận biết và cập nhật tự động.
8. Sate Patterns
Sate là mẫu thiết kế cho phép một đối tượng thay đổi các hành vi của nó khi các trạng thái bên trong của nó thay đổi. Đối tượng sẽ xuất hiện để thay đổi các lớp của nó.
9. Strategy Patterns
Strategy là mẫu thiết kế dùng để định nghĩa một họ các thuật toán, đóng gói mỗi thuật toán đó và làm cho chúng có khả năng thay đổi dễ dàng.Strategy cho phép giả thuật tùy biến một cách độc lập tại các Client sử dụng nó.
10. Template Method Patterns
Template Method là mẫu xác định sườn của một giải thuật trong một thao tác, theo một số bước của các phân lớp. Template Method cho phép các lớp con xác định lại chắc chắn một số bước của một giải thuật bên ngoài cấu trúc của giải thuật đó.
11. Visitor Patterns
Visitor là mẫu thiết kế xác định sườn của một giải thuật trong một thao tác, theo một số bước của các phân lớp. Template Method cho phép các lớp con xác định lại chắc chắn một số bước của một giải thuật bên ngoài cấu trúc của giải thuật đó.
II. Ứng dụng Design Pattern trong thực tế phân tích thiết kế phần mềm hướng đối tượng
Ứng dụng của design pattern trong thực tế phân tích thiết kế phần mềm hướng đối tượng là rất lớn. Hầu như cứ ở đâu có phần mềm hướng đối tượng thì ở đó có design pattern. Design pattern được vận dụng linh hoạt và dưới nhiều hình thức khác nhau.Trong nội dung đồ án môn học này chúng tôi xin trình bày một vài ứng dụng điển hình của Design pattern.
I.Framework
Cả Framework có liên quan đến mẫu, nhưng giữa chúng có sự khác nhau rõ ràng. Framework thì tổng quát hơn và có thể áp dụng cho một lĩnh vực cụ thể.Ví dụ Framework tài chính sẽ chứa các lớp về tài chính trong các mối quan hệ được xác định bởi các mẫu thiết kế, từ framework này có thể phát triển để tạo ra các ứng dụng về tài chính.Framework là một tập các lớp được đóng gói để có thể dùng lại cho các ứng dụng cụ thể. Ứng dụng thực hiện Customize các lớp này như kế thừa, dẫn xuất để tạo ra các lớp mới phục vụ cho mục đích của ứng dụng.Framework phải có được những đặc điểm là : nhỏ gọn,và đầy đủ dễ customize, tính khái quát cao,... Tập các lớp trong framework được cài đặt và thiết lập các mối quan hệ theo các mẫu design pattern.
II.Kiến trúc Add – Ins
Đây là một mô hình ứng dụng cho phép tạo ra một giao diện ghép nối các môđun ứng dụng một cách dễ dàng. Ứng dụng gồm có nhân ứng dụng (core) và các môđun ghép nối là các gói DLL. Cấu hình của ứng dụng được lưu vào các file định dạng XML.
Global property thường là các mẫu thực thể (datasim) có thể cấu hình các thành phần được.
Resource : thường là các lớp singleton quản lý tài nguyên tập trung bao gồm
- Icon Resource
- Error Message Resource
- Language Resource
Chúng được gộp vào một đối tượng quản lý là SingletonResourceManager cung cấp mọi điểm truy cập đồng nhất trong đối tượng.
Basic GUI layer : cung cấp các giao diện đồ hoạ cơ bản.Thường sử dụng các mẫu Abstract Factory, Abstract Method Proxy, Facade và Memento (kết hợp với XML).
Extensible Module Tree : Đây là phần quan trọng của nhân ứng dụng. Nó cung cấp các giao diện ghép nối với các mô đun bên ngoài. Các lớp trong phần này thường được cài đặt dưới dạng các Entity patterns (mẫu thực thể), hay còn gọi là các Codon. Mỗi codon gồm có :ID (name - chỉ duy nhất một tên cho một codon), Label( nhãn có thể trùng nhau) và Class (đây là mã thực thi của codon đó). Class này thường là
các Command patterns.
Bài viết có tham khảo 1 số sách
1.Design patterns Elements of Reusable Object Oriented Software
2. The design patterns SmallTalk Companion
3. Analysis Patterns: Reusable Object Models
4. Concurrent Programming in JavaTM: Design Principles and Patterns
5. Pattern Languages of Program Design
6. Pattern Languages of Program Design 2
7. Pattern Languages of Program Design 3
8. ThinkInPatterns
Comments
Post a Comment