Sử dụng các mẫu thiết kế (Design Pattern)

Một phần của tài liệu đồ án công nghệ thông tin Quy trình RUP và ứng dụng (Trang 65)

Do quy trình RUP là một quy trình công nghệ phần mềm chủ yếu dựa vào đối tượng, các dự án phần mềm áp dụng quy trình RUP phụ thuộc rất nhiều vào kỹ thuật hướng đối tượng. Do đó, yêu cầu các thành viên trong đội dự án tham gia quy trình RUP cần phải có các kỹ năng kinh nghiệm về kỹ thuật hướng đối để có thể hoàn thành tốt dự án Trong phần này tôi xin trình bày về sử dụng các mẫu thiết kế áp dụng vào trong dự án. Mục đích chính của sử dụng các mẫu thiết kế này là nhằm tăng cường khả năng tái sử dụng của hệ thống và tăng độ tin cậy của hệ thống thông qua các mẫu thiết kế đã được sử dụng rộng rãi và được kiểm nghiệm. Ở đây cần yêu cầu kỹ năng và kinh nghiệm của người thiết kế (Designer). Mẫu thiết kế là một điểm mạnh của kỹ thuật hướng đối tượng và đóng một vai trò khá quan trọng trong quy trình RUP, vì sử dụng các mẫu thiết kế tốt sẽ có khả năng tăng cường tính sử dụng lại của các đối tượng và tăng khả năng tin cậy của các đoạn mã và hệ thống nói chung. Tuy nhiên, còn một điều nói thêm rằng, không nhất thiết đội dự án phải thực hiện các mẫu thiết kế giống như ở đây và trong các tài liệu tham khảo. Là bởi vì các mẫu thiết kế là các gợi ý một cách nhanh chóng cho các nhà thiết kế tìm kiếm một giải pháp cho vấn đề chứ không phải là giải pháp thích hợp duy nhất hoặc tốt nhất. Điều đó có nghĩa là không nên áp dụng một cách máy móc các mẫu thiết kế đó. Tuy nhiên để làm được điều này yêu cầu người thiết kế phải có trình độ và kỹ năng tốt về các mẫu thiết kế.

Do đặc điểm của dự án này là sử dụng nhiều đến đồ hoạ và các đối tượng đồ hoạ. Tôi chủ yếu sử dụng mẫu thiết kế kết hợp (Composite Pattern) vào trong các

thiết kế của dự án, và có sử dụng thêm một số mẫu khác. Chi tiết các bạn có thể xem thêm trong mô hình thiết kế kèm theo của đồ án này, và các Pattern các bạn có thể tham khảo thêm trong tài liệu tham khảo [3]

CVPoint (from Points) CGlyph (from Graphs) CPoint3D Z : int (from Points) CGraph (from Graphs) +theCGlyph CCircle (from Geometrics) CRectangle Color : COLORREF (from Geometrics) CPoint2D (from Points) CLine (from Geometrics)

Hình 3-2 Mẫu thiết kế kiểu tổng hợp (Composite Pattern)

Một trong những mẫu thiết kế quan trọng nhất mà tôi áp dụng vào dự án này là mẫu thiết kế tổng hợp (Composite Pattern), vì nó đặc biệt thích hợp với kiến trúc đồ hoạ áp dụng trong chương trình. Trong chương trình tôi xây dựng một đối tượng ảo là thực thể đồ hoạ (Glyph). Thực thể đồ hoạ là khái niệm trừu tượng bao gồm nhiều đối tượng đồ hoạ cụ thể như Điểm (CVPoint), Đoạn thẳng (CLine), Hình chữ nhật (CRectangle), Hình tròn (CCircle). Mỗi đối tượng đồ hoạ đó là một loại của thực thể đồ hoạ (quan hệ kế thừa cha con ).

Thực chất hầu hết là trong chương trình thao tác chủ yếu với các đối tượng đồ hoạ tương đối phức tạp, có thể bao gồm nhiều thông tin, nhiều thực thể đồ hoạ trong đó. Một đối tượng đồ hoạ (CGraph) là tổng hợp của nhiều thực thể đồ hoạ. Trong chương trình của ta chủ yếu thao tác trên các đối tượng đồ hoạ này là chính. Có rất nhiều thao tác giống nhau cùng áp dụng với các thực thể khác nhau. Nếu như với mỗi đối tượng đồ hoạ ta lại phải viết lại các đoạn code mã gần tương tự nhau để cùng thực hiện một số hành vi nào đó thì rất mất công sức và tốn kém. Thí dụ như: Đối tượng đồ hoạ (CGraph) muốn thực hiện hành vi thêm các thực thể đồ hoạ (Hình chữ nhật, Điểm, Hình tròn, Đoạn thẳng, vv), thông thường ta phải viết như sau

class CVPoint; class CLine; class CRectangle; class CCircle; class CGraph {

AddPoint(CVPoint ); AddLine(CLine );

AddRectangle (CRectangle ); AddCircle (CCircle );

}

Khi có một đối tượng sử dụng đối tượng CGraph, ta phải lần lượt thực hiện hành vi thêm các thực thể đồ hoạ như sau

CFormRepresentation::OnDraw() { CGraph * _graph; CRectangle _rect; CLine _line; CPoint _point; _graph→AddRectangle(_rect); _graph→AddLine(_line); _graph→AddPoint(_point); }

Phần cài đặt lại lần lượt thực hiện các hành vi giống hệt nhau là thêm các thực thể đồ hoạ khác nhau vào trong đối tượng đồ hoạ CGraph. Như thể là rất tốn kém về thời gian và công sức và việc cài đặt các đoạn mã càng nhiều thì càng kém tin cậy

Giả sử bây giờ cần thiết phải thêm một thực thể đồ hoạ khác thí dụ như tam giác chẳng hạn (CTriangle). Ngoài việc xây dựng các thuộc tính và hành vi cho riêng đối tượng tam giác, ta vẫn cần thiết phải sửa lại tất các các đoạn mã của các đối tượng có liên quan đến đối tượng tam giác như đối tượng CGraph lại phải thực hiện lại hành vi

class CGraph {

AddTriangle(CTriangle ); }

Đối tượng Form cũng phải sửa đổi cài đặt nếu muốn sử dụng đối tượng CTriangle CFormRepresentation::OnDraw() { CGraph * _graph; CTriangle _triangle; graph→AddTriangle(_triangle);

}

Giải pháp sử dụng mẫu thiết kế ở đây như là sử dụng một đối tượng lớp cơ sở ảo đại điện cho tất cả các thực thể đồ hoạ CGlyph, và sử dụng tính chất liên kết động (dynamic binding) của ngôn ngữ lập trình hướng đối tượng C++

class CGlyph {

//Cac phuong thuc ao vitual

}

class CRectangle : public CGlyph {

//Cai dat lai mot so phuong thuc ao cua CGlyph }

class CLine : public CGlyph {

//Cai dat lai mot so phuong thuc ao cua CGlyph }

…vv

Trong đối tượng đồ hoạ chỉ cần sử dụng đến một phương thức Add cho tất cả các thực thể đồ hoạ, việc cài đặt ít mã này sẽ tin cậy hơn

class CGraph {

AddGlyph(CGlyph* );//Chu y la su dung con tro }

Khi đối tượng CFormRepresentation sử dụng đến đối tượng CGraph thì chúng chỉ chúng cũng không cần quan tâm đến các thực thể đồ hoạ khác nhau

CFormRepresentation::OnDraw() {

CGraph * _graph;

CRectangle _rect=new CRectangle(); CLine _line=new CLine();

CPoint _point=new CPoint(); _graph→AddGlyph(&_rect); _graph→AddGlyph(&_line); _graph→AddGlyph(&_point); }

Khi xây dựng thêm đối tượng CTriangle, ta chỉ quan tâm xây dựng đối tượng CTriangle, và bản thân nó là một loại CGlyph nên không cần phải cài đặt thêm các hành vi riêng rẽ với nó trong đối tượng CGraph và các đối tượng khác sử dụng nó

Một phần của tài liệu đồ án công nghệ thông tin Quy trình RUP và ứng dụng (Trang 65)

Tải bản đầy đủ (DOC)

(99 trang)
w