Danh mục

Tài liệu công nghệ thông tin - Các nguyên lý cơ bản trong thiết kế HĐT

Số trang: 19      Loại file: doc      Dung lượng: 300.50 KB      Lượt xem: 16      Lượt tải: 0    
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

1.Vai trò của thiết kế Thiết kế là 1 công đoạn quan trọng trong qui trình phát triển phần mềm. Thiết kế là bước chuyển tiếp của giai đoạn phân tích và là bước chuẩn bị trước khi chúng ta tiến hành xây dựng phần mềm. Thiết kế là tiến trình mà ở đó xuất hiện mô hình các kiểu mẫu của phần mềm. Các mô hình này chính là những nét phác thảo nên phần mềm. Nó cho chúng ta biết phần mềm chúng ta đang xây dựng là gì, đã có, đang có và sẽ có những gì. Thiết kế là nơi mà ta có...
Nội dung trích xuất từ tài liệu:
Tài liệu công nghệ thông tin - Các nguyên lý cơ bản trong thiết kế HĐT Các nguyên lý cơ bản trong thiết kế HĐT Các nguyên lý cơ bản trong thiết kế HĐT (basic object-oriented principles) 1.Vai trò của thiết kế Thiết kế là 1 công đoạn quan trọng trong qui trình phát triển phần mềm. Thiết kế là bước chuyển tiếp của giai đoạn phân tích và là bước chuẩn bị trước khi chúng ta tiến hành xây dựng phần mềm. Thiết kế là tiến trình mà ở đó xuất hiện mô hình các kiểu mẫu của phần mềm. Các mô hình này chính là những nét phác thảo nên phần mềm. Nó cho chúng ta biết phần mềm chúng ta đang xây dựng là gì, đã có, đang có và sẽ có những gì. Thiết kế là nơi mà ta có thể trả lời câu hỏi “Liệu phần mềm này có thể chạy được không?” , “Phần mềm có thể đáp ứng được các yêu cầu của khách hàng hay không?” mà không cần đợi đến công đoạn phát triển. 2.Các nguyên lý thiết kế hướng đối tượng - Nguyên lý ‘đóng mở’: một moudle cần “mở” đối với việc phát triển thêm tính năng nhưng phải “đóng” đối với việc sửa đổi mã nguồn - Nguyên lý thay thế Liskov: Các chức năng của hệ thống vẫn thực hiện đúng đắn nếu ta htay bất kì một lớp đối tượng nào bằng đối tượng kế thừa. - Nguyên lý nghịch đảo phụ thuộc: phụ thuộc vào mức trừu tượng, không phụ thuộc vào mức chi tiết. - Nguyên lý phân tách giao diện: nên có nhiều giao diện đặc thù với bên ngoài hơn là chỉ có một giao diện dùng chung cho một mục đích. Theo tác giả thì mọi nguyên lý trong lập trình hướng đối tượng đều quy vào một nguyên lý duy nhất là nguyên lý đóng mở (Open-Closed Principle). Do đó đầu tiên sẽ giới thiệu với các bạn về nguyên lý đóng mở. Các nguyên lý sau sẽ làm rõ hơn làm cách nào để đạt được yêu cầu như nguyên lý đóng mở đề ra. Phát biểu nguyên lý Đóng - Mở: “Các thực thể phần mềm (lớp, đơn thể, hàm, …) nên (được xây dựng theo hướng) mở cho việc mở rộng và đóng cho việc sửa đổi”. Nguyên văn tiếng Anh: “SOFTWARE ENTITIES(CLASSES,MODULES,FUNCTIONS,ETC.)SHOULD BE OPEN FOR EXTENSION, BUT CLOSED FOR MODIFICATION.” Điểm mấu chốt nhất khi xây dựng phần mềm là “yêu cầu (chức năng) của phần mềm luôn luôn thay đổi”. Sự thay đổi này có thể là khách quan (vd: do nhu cầu công việc cần bổ sung thêm chức năng mới) hoặc chủ quan (vd: chuyên viên lấy yêu cầu hoặc khách hàng không mô tả yêu cầu phần mềm rõ ràng). Như vậy vấn đề đặt ra là làm thế nào viết một phần mềm thay đổi “dễ” chứ không phải là viết một phần mềm mà không hề thay đổi. Nguyên lý đóng mở được đưa ra nhằm phục vụ cho mục đích này. Có hai vế trong nguyên lý này: 1. “Mở cho việc mở rộng”: có nghĩa rằng hoạt động của thực thể phần mềm (lớp, đơn thể, hàm,…) có thể được mở rộng. Chúng ta có thể tạo ra thực thể hoạt động theo những cách mới và khác hẳn khi yêu cầu của ứng dụng thay đổi hoặc để thỏa mãn nhu cầu của ứng dụng mới. 2. “Đóng cho việc sửa đổi”: có nghĩa rằng đoạn mã (code) của thực thể này không bị xâm phạm. Không ai được phép thay đổi đoạn mã của thực thể. Có vẻ như hai vế này mâu thuẫn lẫn nhau. Bởi vì khi chúng ta muốn thêm hoặc sửa đổi yêu cầu thì có vẻ “chắc chắn” chúng ta phải sửa đổi đoạn mã cũ. Để làm rõ hơn hai vế trên, chúng ta xét ví dụ chương trình Draw. Chương trình Draw là một chương trình tương tự như Paint trong Windows. Nó cho phép chúng ta vẽ các đối tượng hình học ra màn hình. Bỏ qua các vấn đề liên quan đến giao diện người dùng, chúng ta chỉ tập trung đến thao tác vẽ (draw) của các đối tượng. Giả sử yêu cầu ban đầu của chương trình Draw là chỉ thao tác trên hai loại đối tượng là hình tròn và hình vuông. Sử dụng phương pháp lập trình cấu trúc (structured programming) (hay còn gọi phương pháp lập trình hướng thủ tục – procedural programming), chương trình phác thảo sơ lược sẽ có dạng như sau (sử dụng ngôn ngữ C++): PHP Code: enum ShapeType {circle, square}; struct Shape { ShapeType itsType; }; struct Circle { ShapeType itsType; double itsRadius; Point itsCenter; }; struct Square { ShapeType itsType; double itsSide; Point itsTopLeft; }; // không cần quan tâm chi tiết đến cài đặt hai hàm này void DrawSquare(struct Square*); void DrawCircle(struct Circle*); typedef struct Shape *ShapePointer; void DrawAllShapes(ShapePointer list[], int n) { int i; for (i=0; iitsType) { case square: DrawSquare((struct Square*)s); break; case circle: DrawCircle((struct Circle*)s); break; } } } Đoạn mã ở trên có thể dễ dàng đọc hiểu. Trong đó hàm DrawAllShapes có nhiệm vụ vẽ các đối tượng hình học (hình tròn, hình vuông) ra màn hình. Tham số của hàm DrawAllShapes là một mảng các con trỏ chứa địa chỉ của các đối tượng hình học cần được vẽ. Để đạt được điều đó, hàm DrawAllShapes đến phiên nó lại cần sự trợ giúp của hai hàm vẽ cụ thể cho hai loại đối tượng hình học là hàm DrawCircle và DrawSquare. Để gọi được hai hàm này, hàm DrawAllShapes cần phải xác định đối tượng hiện tại đang thao tác là đối tượng nào thông qua biến thành viên itsType của từng đối tượng. Có vẻ chương trình Draw đã được hoàn thành và đúng với yêu cầu đề ra. Vấn đề sẽ xuất hiện khi chúng ta muốn vẽ thêm một đối tượng khác, như hình tam giác chẳng hạn. Lúc này, hàm DrawAllShapes cần phải xử lý thêm một trường hợp nữa là hình tam giác. Đoạn mã thêm vào và sửa đối sẽ như sau: PHP Code: enum ShapeType {circle, square, triangle};//kiểu dữ liệu liệu kê struct Triangle { ShapeType itsType; Point itsVertices[3]; }; // không cần quan tâm chi tiết đến cài đặt hàm này void DrawTriangle(struct Triangle*); void DrawAllShapes(ShapePointer list[], int n) { int i; for (i=0; iitsType) { case square: DrawSquare((struct Square*)s); break; case circle: DrawCircle((struct Circle*)s); break; // thêm vào case triangle: DrawTriangle((struct Triangle*)s); break; } } } Để ý trong trường hợp này, khi một yêu cầu mới phát sinh (vẽ hình tam giác), thì đoạn mã của hàm DrawAllShapes đã bị thay đổi. Bản thiết ...

Tài liệu được xem nhiều: