CHƯƠNG 1 TỔNG QUAN VỀ MÔ HÌNH SỬ DỤNG LẠI 1. Giới thiệu chung Thiết kế phần mềm là một công ñoạn quan trọng trong quy trình xây dựng và phát triển phần mềm. Cũng như việc thiết kế phần mềm truyền thống, việc thiết kế phần mềm hướng ñối tượng cần phải ñáp ứng ñược yêu cầu của bài toán, song cũng cần có tính tổng quát và linh hoạt ñủ ñể có thể giải quyết một phần hoặc toàn bộ các bài toán có thể gặp trong tương lai. Trong quá trình xây dựng và phát triển phần mềm, các thay ñổi do yêu cầu từ phía khách hàng, các ñiều kiện phát sinh hay việc thiết kế một cách cứng nhắc trong quá trình thiết kế thường làm cho hệ thống trở nên rối rắm, các mô ñun càng ngày càng bị phụ thuộc vào nhau.
Sự phụ thuộc này làm cho phần mềm ngày càng trở nên phình to và khó bảo trì, thậm chí dẫn ñến thất bại. Phương pháp lập trình hướng ñối tượng ra ñời góp phần giúp cho việc thiết kế phần mềm trở nên dễ dàng và linh ñộng hơn. Thiết kế hướng ñối tượng cho phép theo dõi và quản lý ñược sự phụ thuộc giữa các mô ñun trong kiến trúc của hệ thống. Việc tìm cách áp dụng những mô hình ñã thành công trong thực tế ñối với một số bài toán tương tự ñã từng gặp và áp dụng những mô hình ñó vào thiết kế của mình mà không cần phải xem xét lại từ ñầu, ñảm bảo tiết kiệm chí phí, thời gian xây dựng và phát triển phần mềm, nâng cao ñộ tinh cậy và chất lượng phần mềm.
Năm 1995, Erich Gamma, Richard Helm, Join Vlissides, và Ralph Johnson (Gang of Four - GOF) ñã công bố cuốn sách của họ “Elements of reusable Object- Oriented Software” ñánh dấu sự ra ñời của “Mẫu thiết kế”. ðây là một bước tiến vô cùng quan trọng ñối với việc thiết kế phần mềm hướng ñối tượng. Tổng quan về các mẫu thiết kế 1. Mẫu thiết kế là gì ? 1.
Các ñịnh nghĩa về mẫu thiết kế [4,9] Mẫu thiết kế (Design Pattern) là một cặp giải pháp/vấn ñề ñược ñặt tên có thể áp dụng trong những ngữ cảnh mới và những hướng dẫn ñể áp dụng nó trong những tình huống mới như thế nào. [3] Mẫu thiết kế không ñơn thuần là một bước nào ñó trong các giai ñoạn phát triển phần mềm mà nó ñóng vai trò là sáng kiến ñể giải quyết một bài toán thông LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com - 14 - dụng nào ñó. Các giai ñoạn phần mềm vẫn hoàn chỉnh mà không có mẫu thiết kế, nhưng sự góp mặt của mẫu thiết kế sẽ giúp cho việc xác ñịnh bài toán cần giải quyết nhanh gọn hơn, từ ñó ñưa ra cách giải quyết hợp lý. [9] Mẫu thiết kế không chỉ ñược sử dụng ñể xác ñịnh bài toán và cách giải quyết mà còn ñược sử dụng nhằm cô lập các thay ñổi trong mã nguồn, từ ñó làm cho hệ thống có khả năng tái sử dụng cao do mẫu thiết kế tuân thủ rất nghiêm ngặt các nguyên lý thiết kế hướng ñối tượng.
[9] Việc xác ñịnh thế nào là một mẫu thiết kế phụ thuộc vào các nhìn nhận vấn ñề của mỗi người. Theo GOF, cách nhìn nhận phổ biến nhất về các mẫu thiết kế là coi chúng giống như các mô tả về các ñối tượng phục vụ mục ñích trao ñổi thông tin trong quá trình thiết kế ñã ñược hiệu chỉnh ñể giải quyết những yêu cầu thiết kế trong những trường hợp nhất ñịnh. Các thành phần của mẫu thiết kế [8,9] Mỗi mẫu thiết kế trước tiên mô tả một bài toán mà ta gặp nhiều lần rồi mô tả những yếu tố căn bản nhất ñể giải quyết bài toán theo cách mà ta có thể áp dụng lại nhiều lần. Dựa trên mô tả như trên về các mẫu thiết kế, ta thấy chúng bao gồm những thành phần cơ bản sau: Tên: Là tên gọi qua ñó ta có thể mô tả bài toán cần giải quyết, giải pháp thực hiện hay kết quả.
Việc ñặt tên mẫu thiết kế cho phép mô tả các bài toán và giải pháp một cách ngắn gọn. Tạo thành một ngôn ngữ trong cộng ñồng những người thiết kế. Ví dụ, khi nói ñến mẫu thiết kế “Façade”, ta hình dung ngay ñến mô hình thiết kế một ñối tượng với vai trò giao dịch của một tập các thành phần nhỏ hơn. Bài toán: Cho phép xác ñịnh trong trường hợp nào thì áp dụng mẫu thiết kế thông qua mô tả bài toán và ngữ cảnh của bài toán ñó.
Giải pháp giải quyết bài toán: Mô tả những thành phần tạo nên mẫu thiết kế (các lớp, các ñối tượng) cùng mối quan hệ, vai trò và cách thức phối hợp giữa chúng (cấu trúc, thừa kế). Giải pháp không ñề cập ñến cách thức thiết kế hay thực hiện cụ thể nào vì nó ñược áp dụng trong rất nhiều tình huống khác nhau. Thay vào ñó, giải pháp của mẫu thiết kế ñược mô tả với tính khái quát cao với cách thức tổ chức chung nhất của các thành phần trong việc giải quyết bài toán. LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com - 15 - Ví dụ như mẫu thiết kế ñược gọi như một thành ngữ (mẫu GRASP), mẫu thiết kế có thể mô tả bằng lời hoặc mô hình thiết kế hay bằng mã nguồn.
Hệ quả: Là những gì thu nhận ñược cùng với những yếu tố cần cân nhắc khi áp dụng mẫu thiết kế ñể giải quyết bài toán. Hệ quả thường không ñược ñề cập khi nói ñến một mẫu thiết kế nhưng ñây là yếu tố quyết ñịnh khi cần chọn lựa hoặc phân tích chi phí và lợi ích khi áp dụng các mẫu thiết kế. Danh mục các mẫu thiết kế và phân loại [9] Erich Gamma và các ñồng sự của ông ñề xuất 23 mẫu thiết kế, và ñã ñưa ra hai tiêu chí ñể phân loại các mẫu thiết kế này. ðó là phân loại theo mục ñích sử dụng (purpose) và phạm vi áp dụng của mẫu (scope).
Theo mục ñích sử dụng: Các mẫu thiết kế ñược phân thành 3 nhóm: mẫu kiến tạo, mẫu cấu trúc, mẫu hành vi. Mẫu kiến tạo (Creational Patterns): mẫu kiến tạo trừu tượng hoá quá trình khởi tạo ñối tượng. Các mẫu này giúp hệ thống không phải phụ thuộc vào cách một ñối tượng ñược tạo ra, xây dựng và thể hiện. Mẫu thiết kế kiến tạo bao gồm các mẫu sau: Abstract Factory, Builder, Factory Method, Prototype, Singleton.
Mẫu cấu trúc (Structural Patterns): mẫu thiết kế cấu trúc ñề cập ñến cách mà các ñối tượng và lớp ñối tượng kết hợp ñể tạo nên một cấu trúc lớn hơn và hữu dụng hơn. Việc thiết kế các lớp ñối tượng là nhằm ñáp ứng các ràng buộc cụ thể của hệ thống. Mẫu cấu trúc mô tả mối quan hệ giữa các lớp này và sắp xếp sao cho nếu có bất kì sự thay ñổi nào với hệ thống ñều không làm thay ñổi những quan hệ ñó. Mẫu thiết kế cấu trúc bao gồm các mẫu sau: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.
Mẫu hành vi (Behavioral Patterns): mẫu hành vi mô tả sự tương tác giữa các ñối tượng và cách chúng phân phối, cộng tác, ñể giải quyết một hay một nhóm trách nhiệm nào ñó. Mẫu hành vi bao gồm các mẫu sau: Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor. LUAN VAN CHAT LUONG download : add luanvanchat@agmail. Theo phạm vi sử dụng: các mẫu thiết kế ñược phân thành 2 nhóm: Phạm vi ñược nói ñến khi ta quyết ñịnh nên áp dụng mẫu thiết kế vào các lớp hay các ñối tượng.
Mẫu thiết kế áp dụng cho Lớp (Class): các mẫu này mô tả và giải quyết mối quan hệ giữa các lớp ñối tượng và lớp con của chúng. Các mối quan hệ này ñược thiết lập qua cơ chế kế thừa và chỉ xảy ra ở thời ñiểm biên dịch chương trình (compiler-time). Các mẫu thuộc loại này bao gồm: Factory Method, Adapter (class), Interpreter, Template Method. Mẫu thiết kế áp dụng cho ðối tượng (Object): các mẫu này mô tả và giải quyết mối quan hệ giữa các ñối tượng.
Các mối quan hệ này có thể thay ñổi tại thời ñiểm chạy chương trình (run-time). Các mẫu thuộc loại này bao gồm: Abstract Factory, Builder, Prototype, Singleton, Adapter (object), Bridge, Composite, Decorator, Facade, Flyweight, Proxy, Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor. LUAN VAN CHAT LUONG download : add luanvanchat@agmail. Sơ ñồ mối quan hệ giữa các mẫu thiết kế [9] Hình 1.1: Sơ ñồ mối quan hệ giữa các mẫu thiết kế 1.
Một số mẫu thiết kế ñiển hình trong các ứng dụng quản lý. Với phạm vi thực hiện của luận văn, phần này chỉ tổng hợp và giới thiệu một số mẫu thiết kế ñiển hình về hành vi và trình diễn hay ñược dùng trong các ứng dụng quản lý doanh nghiệp như là các mẫu thiết kế dành cho lý luận nghiệp vụ (domain logic) hoặc các mẫu về hành vi quan hệ của các ñối tượng hoặc cấu trúc quan hệ của các ñối tượng. LUAN VAN CHAT LUONG download : add luanvanchat@agmail. Ý nghĩa Mẫu quan sát (Observer) ñịnh nghĩa mối quan hệ phụ thuộc một - nhiều giữa các ñối tượng sao cho khi một ñối tượng thay ñổi trạng thái thì tất cả các ñối tượng liên quan cũng sẽ ñược thông báo và tự ñộng cập nhật theo.
Mô tả Việc phân chia hệ thống thành nhiều lớp con có quan hệ với nhau là nhu cầu tất yếu ñể có thể duy trì sự bền vững của hệ thống. Chúng ta không bao giờ muốn cài ñặt hệ thống mà tất cả các lớp dính chặt lại với nhau, bởi vì ñiều này sẽ làm giảm tính tái sử dụng lại của chúng. Ví dụ, nhiều công cụ giao diện ñồ hoạ phân tách giao diện (GUI) ra khỏi dữ liệu (Data) bên dưới. Các lớp ñịnh nghĩa cho giao diện và dữ liệu trên có thể kết hợp với nhau ñể làm việc cũng như có thể ñược sử dụng 1 cách ñộc lập.
Mẫu Observer mô tả cách thiết lập mối quan hệ này. Có hai ñối tượng then chốt trong mẫu này, ñó là Subject và Observer. Một ñối tượng Subject có thể có một hoặc nhiều ñối tượng Observer phụ thuộc vào nó. Tất cả các ñối tượng Observer sẽ ñược cảnh báo (notify) khi ñối tượng Subject có sự thay ñổi về trạng thái.
Khi ñó, các ñối tượng Observer sẽ lấy thông tin về trạng thái của ñối tượng Subject ñể tự cập nhật lại trạng thái của chính nó. Cấu trúc mẫu Observer Hình 1.2: Cấu trúc mẫu Observer Ở cấu trúc trên, khi khởi tạo một ñối tượng thuộc lớp ConcreteObserver thì sự khởi tạo này phải dựa trên ñối tượng thuộc lớp ConcreteSubject ñể lấy thông tin trạng thái hiện tại của ñối tượng Subject.