Bài giảng Chương 8: Thiết kế lớp và phương thức giúp người học làm quen với các tiêu chí của thiết kế hướng đối tượng: khớp nối, sự gắn kết và sự đồng cảm; chỉ định, tái cấu trúc và tối ưu hóa thiết kế đối tượng; xác định việc sử dụng lại các lớp, thư viện, khung và thành phần được xác định trước; chỉ định các ràng buộc và hợp đồng; tạo ra một đặc tả phương pháp.
Trang 1Chương 8: Thiết kế lớp và phương thức
Trang 2Mục tiêu của chương:
Làm quen với các tiêu chí của thiết kế hướng đối tượng: khớp nối, sự gắn kết và
sự đồng cảm
Có thể chỉ định, tái cấu trúc và tối ưu hóa thiết kế đối tượng
Có thể xác định việc sử dụng lại các lớp, thư viện, khung và thành phần được
xác định trước
Có thể chỉ định các ràng buộc và hợp đồng
Có thể tạo ra một đặc tả phương pháp
Trang 3Các đặc điểm cơ bản của hướng đối tượng
Trang 4Các phần tử của phân tích hướng đối tượng:
Trang 5Tính đóng gói và ẩn dấu thông tin
- Đóng gói là cơ chế tổ hợp các thao tác và dữ liệu vào một đối tượng
- Ẩn dấu thông tin có nghĩa là chỉ những thông tin của một đối tượng được yêu cầu
sử dụng mới xuất hiện ở bên ngoài đối tượng đó Ẩn dấu thông tin có liên quan
mật thiết với phạm vi hoạt động của phương thức và thuộc tính (visibility)
- Sự liên lạc/tương tác giữa các đối tượng đều thông qua phương thức
- Việc sử dụng đối tượng để gửi một thông điệp làm kích họat một phương thức là
chìa khóa cho khả năng sử dụng lại (key to reusability), vì nó che cho hoạt động
bên trong của đối tượng khỏi bị những thay đổi bên ngoài của hệ thống tác động
đến Nó cũng giữ cho hệ thống không bị ảnh hưởng khi đối tượng bị thay đổi
Trang 6Tính đa hình (Đa xạ) và ràng buộc động
- Đa hình có nghĩa là hệ thống hướng đối tượng có thể cùng gửi một thông điệp
được gửi đến một tập các đối tượng nhưng nó kích hoạt thực hiện các phương
thức khác nhau trên các đối tượng khác nhau
- Ràng buộc động có nghĩa kiểu của đối tượng được phân biệt tại thời điểm thực
hiện Ví dụ, giả sử chúng ta có một danh sách (mảng) các nhân viên bao gồm cả
nhân viên trả lương theo giờ công và nhân viên trả lương theo tháng Trên mỗi đối
tượng nhân viên thuộc cả hai loại này đều có phương thức tính lương
(computerPay()) như hình ở slide liền sau Khi một thông điệp gửi tính lương cho
tất cả các đối tượng nhân viên thì với mỗi loại nhân viên sẽ thực hiện phương thức
tính lương khác nhau Như vậy phương thức cụ thể sẽ được xác định tại thời điểm
nó thực hiện
- Cơ chế đa hình và ràng buộc động phụ thuộc vào ngôn ngữ lập trình cụ thể Hầu
hết các ngôn ngữ lập trình hỗ trợ ràng buộc động cho phương thức, một số ngôn
ngữ hỗ trợ ràng buộc động cho thuộc tính Do đó, đội dự án cần phải biết rõ ngôn
Trang 8Tính kế thừa
- Kế thừa cho phép xác định các lớp sau bằng việc sử dụng lại các lớp đã xác định
trước đó (lớp con kế thừa thuộc tính của siêu lớp)
- Kế thừa đơn (Single inheritance): một lớp có chỉ một lớp cha
- Kế thừa bội/ Đa kế thừa (Multiple inheritance): Một lớp có thể có nhiều lớp cha
- Khái niệm định nghĩa lại và xung đột kế thừa
- Đa phần các xung đột kế thừa đều do phân lớp chưa tốt
Các xung đột kế thừa:
- Hai thuộc tính hay phương thức được kế thừa có cùng tên
và ngữ nghĩa
Trang 9Để giảm bớt các xung đột kế thừa, Jim Rumbaugh và các đồng nghiệp đã đưa ra các
một số quy tắc như sau:
1 Không định nghĩa lại các truy vấn
2 Khi định nghĩa lại các phương thức kế thừa thì nên giữ nguyên ngữ nghĩa của nó
giống như phương thức được kế thừa
3 Ngữ nghĩa kế thừ của phương thức không bao giwof được thay đổi
4 Tập các tham số (đối số) của phương thức kế thừa không nên thay đổi
Trang 10Tiêu chuẩn thiết kế lớp và phương thức
Khi đánh giá bản thiết kế hướng đối tượng, một tập các tiêu chí sẽ được sử dụng để
đánh giá bản thiết kế đó Các tiêu chí đó bao gồm sự song hành (coupling) giữa các
môđun, sự gắn kết (cohesion) trong môđun, sự công sinh (connascence) giữa các các
môđun Mỗi mô đun là một lớp đối tượng hoặc một đối tượng hoặc một phương
thức
Trang 11Coupling (Song hành/Sự phụ thuộc lẫn nhau)
- Chỉ sự phụ thuộc lẫn nhau hoặc quan hệ nội tại giữa các mô đun trong một hệ
thống Sự phụ thuộc lẫn nhau càng cao thì thay đổi ở mô đun này càng dễ kéo theo
thay đổi ở mô đun khác
- Có hai loại song hành giữa các mô đun: tương tác và kế thừa
- Song hành tương tác (Interaction coupling) đề cập đến các mối quan hệ giữa
phương thức và đối tượng thông qua việc chuyển thông điệp
- Song hành kế thừa đề cập đến các lớp phụ thuộc lẫn nhau chặt chẽ như thế nào
trong phân cấp kế thừa
Trang 12Luật Demeter
Để tối thiểu hóa sự song hành tương tác trong hệ thống thiết kế, chúng ta nên áp
dụng các luật Demeter Một đối tượng chỉ nên gửi thông điệp cho:
- Chính nó
- Đối tượng chứa trong các thuộc tính của chính nó hoặc của lớp cha
- Đối tượng được truyền như một tham số cho phương thức
- Đối tượng được tạo ra bằng phương thức
- Đối tượng được lưu trữ trong một biến toàn cục
Trang 13Ví dụ minh họa luật Demeter
Trang 14Ví dụ minh họa luật Demeter
Trang 15Các kiểu tương tác song hành:
Có 6 loại tương tác song hành như trên bảng, các loại tương tác được đánh giá tốt
hay xấu theo thứ tự trừ trên xuống:
- Không song hành trực tiếp: Các phương pháp không liên quan đến nhau,
nghĩa là chúng không gọi nhau
- Dữ liệu (Data): Phương thức gọi truyền một biến sang phương thức được
gọi Nếu biến được truyền là một đối tượng thì toàn bộ đối tượng đó được
sử dụng bởi phương thức được gọi để thực hiện chức năng của nó
- Tương tác một phần (Stamp): Phương thức gọi truyền một biến đối tượng đến
cho phương thức được gọi, nhưng phương thức được gọi chỉ sử dụng một
phần của đối tượng để thực hiện chức năng của nó
- Tương tác điều khiển (Control): Phương thức truyền biến điều khiển mà giá trị
của nó sẽ điều khiển việc thực thi phương thức gọi
- Truy cập ra ngoài phạm vi (Common hoặc Global): Các phương thức truy cập
đến một "vùng dữ liệu toàn cục" nằm bên ngoài các đối tượng
- Truy cập vào bên trong đối tượng (Content hoặc Pathological): Một phương thức
của một đối tượng truy cập đến phần bên trong (phần ẩn) của đối tượng
Điều này vi phạm qui tắc đóng gói và ẩn dấu thông tin Tuy nhiên, C ++ cho
phép điều này diễn ra thông qua việc sử dụng “friends"
Trang 16Sự gắn kết (Conhension)
- Mỗi môđun nên được thiết kế đơn nhất, nghĩa là:
- Một lớp hay một đối tượng chỉ thể hiện một sự vật, hiện tượng
- Một phương thức chỉ giải quyết một nhiệm vụ Một phương thức biểu diễn
đa nhiệm bao giờ cũng khó hiểu hơn biểu diễn đơn nhiệm
- Có 3 loại gắn kết môđun:
- Sự gắn kết trong phương thức
- Sự gắn kết trong lớp đối tượng
- Sự gắn kết trong tổng quát hóa/chuyên biệt hóa
Trang 17Sự gắn kết (Conhension) – tiếp
Sự gắn kết trong phương thức có nghĩa:
- Thể hiện sự gắn kết bên trong của mỗi phương thức
- Mỗi phươg thức chỉ nên làm một việc
- Mỗi phương thức chỉ nên thực hiện một chức năng
Trang 187 kiểu gắn kết trong phương thức (được sắp xếp từ tốt đến xấu):
- Gắn kết chức năng (Functional): Một phương thức thực hiện một công việc Ví dụ,
tính điểm trung bình học kì cho sinh viên Đây là kiểu gắn kết tốt nhất
- Gắn kết tuyến tính (Sequential): Một phương thức bao gồm hai chức năng với kết
quả của chức năng thứ nhất sẽ là đầu vào của chức năng thứ hai Ví dụ, định dạng
và xác nhận điểm trung bình học kì của sinh viên
- Gắn kết kết nối (Communicational): Một phương thức kết hợp hai chức năng sử
dụng chung một tập thuộc tính khi thực hiện Ví dụ tính điểm trung bình học kì,
điểm trung bình tích lũy
- Gắn kết thủ tục (Procedural): Một phương bao gồm nhiều chức năng có mức độ
liên quan với nhau ít Ví dụ, một phương thức có thể tính điểm trụng bình học tập,
in bảng điểm sinh viên viên, in bảng điểm tích lũy học tập
- Gắn kết tạm thời (Temporal or Classical): Phương thức hỗ trợ nhiều chức năng liên
quan tại một thời điểm Ví dụ, khởi tạo tất cả các thuộc tính
- Gắn kết lôgic (Logical): Một phương thức chứa nhiều chức năng nhưng việc lựa
Trang 19phân tích cấu trúc giá của đối thủ cạnh tranh Đây là kiểu gắn kết phương thức
tệ nhất
Trang 20Sự gắn kết (Conhension) – tiếp
Sự gắn kết trong lớp đối tượng có nghĩa:
- Thể hiện sự gắn kết giữa các thuộc tính và các phương thức trong cùng một lớp
- Một lớp nên chỉ biểu diễn cho một thứ
- Tất cả các thuộc tính và phương thức trong một lớp nên chỉ là thuộc tính và
phương thức được yêu cầu (một đối tượng có nhiều thuộc tính và hoạt động khác
nhau, nhưng chỉ quan tâm đến những thuộc tính/hoạt động thuộc phạm vi quan
tâm)
Trang 21Các kiểu gắn kết trong lớp đối tượng:
- Kiểu lý tưởng (Ideal): Trong lớp đổi tượng không có sự gắn kết pha trộn nào
- Pha trộn vai trò (Mixed-Role): Lớp đối tượng có một hoặc nhiều thuộc tính biểu
diễn ngữ nghĩa cho các đối tượng thuộc lớp đối tượng khác trong cùng tầng kiến
trúc
- Pha trộng miền (Mixed-Domain): Một lớp có một hoặc nhiều thuộc tính biểu diễn
cho các đối tượng thuộc lớp khác ở tầng kiến trúc khác
- Pha trộn đối tượng (Mixed-Instance): Một lớp biểu diễn hai kiểu đối tượng khác
nhau Lớp đối tượng nên được tách ra thành hai lớp riêng biệt
Trang 22Sự gắn kết tổng quát hóa/chuyên biệt hóa
- Sự gắn kết tổng quát hóa/chuyên biệt hóa thể hiện mức độ gắn kết trong cây phân
cấp thừa kế
- Các lớp trong cây phân cấp kế thừa có quan hệ với nhau như thế nào?
- Các lớp có quan hệ thông qua ngữ nghĩa tổng quát hóa và chuyên biệt hóa không?
- Chúng có liên quan thông qua một trong các loại quan hệ liên kết, kết hợp, hợp
thành để hỗ trợ cho mục đích sử dụng lại không?
Trang 23Sự cộng sinh giữa các môđun (Connascence)
- Hai môđun (lớp hay phương thức) là cộng sinh
nếu ta thay đổi ở một môđun thì cũng cần thay
đổi ở môđun kia
- Cộng sinh và đóng gói:
- Tối thiểu hóa cộng sinh tổng thể bằng cách
giới hạn các cộng sinh không cần thiết
trong suốt hệ thống
- Tối thiểu hóa cộng sinh xuyên qua mọi biên
của gói chẳng hạn biên phương thức và
Trang 24biên lớp
- Tối đa hóa cộng sinh bên trong mọi biên
đóng gói
Trang 25Các kiểu cộng sinh giữa các môđun
Trang 26CÁC HOẠT ĐỘNG THIẾT KẾ ĐỐI TƯỢNG
Trang 27Hoạt động 1: Thêm các đặc tả cho lớp và phương thức
- Xem xét lại các các mô hình đã xây dựng trong giai đoạn phân tích (mô hình
chức năng, mô hình cấu trúc, mô hình hành vi)
Đảm báo rằng các lớp đối tượng trong tầng miền vấn đề (problem domain
layer) đã đủ và là các lớp cần thiết
Trong mỗi lớp không có thuộc tính hay phương thức nào bị thiếu
Không có thuộc tính hoặc phương thức được xác định thừa trong các
lớp
- Kiểm phạm vi hoạt động/ hiển thị (ẩn hoặc nhìn thấy được) của các thuộc
tính và phương thức trong mỗi lớp đối tượng (public, private, protect)
Trang 28Thiết đặt tham số/đối số cho phương thức:
• Đăth tên cho phương thưc
• Xác định các tham số / đối số của phương thức
• Kiểu giá trị mà phương thức trả về cho phương thức gọi
Trang 29- Xác định các ràng buộc: Điều kiện trước, Điều kiện sau, Bất biến Các ràng buộc
này sẽ được đề cập chi tiết ở phần sau
• Làm thế nào để xử lý vi phạm ràng buộc (chính là các exception (ngoại lệ) trong
trong C++ và Java)?
Trang 30Hoạt động 2: Xác định các trường hợp có khả năng tái sử dụng
• Pattern: mỗi pattern là một nhóm các lớp cộng tác cung cấp một giải pháp
cho một vấn đề thường xảy ra
• Framework: bao gồm một tập các lớp thực thi có thể được sử dụng làm nên
tảng để xây dựng một ứng dụng
• Các thư viện lớp: Một thư viện lớp có một tập các lớp được thực thi được
thiết kế để tái sử dụng
Trang 31• Components (Các thành phần): Một thành phần là một phần mềm đóng gói
được tích hợp vào một hệ thống ứng dụng để cung cấp một chức năng cụ
thể
Trang 32Hoạt động 3: Cấu trúc lại bản thiết kế
- Sau khi các lớp đối tượng và phương thức đã được xác định và các thư viện lớp,
các framework, các thành phần đã được kết hợp vào bản thiết kế đang phát triển,
chúng ta nên sử dụng kỹ thuật phân tách (factoring) để cấu trúc lại bản thiết kế
- Phân tách là quá trình tách ra thêm một phương thức/một lớp từ một
phương thức/một lớp để đơn giản hóa thiết kế tổng thể
- Một quy trình khác cũng rất hữu ích trong tái kiến trúc bản thiết kế, đó là chuẩn hóa
dữ liệu Quá trình này sẽ giúp xác định lại các lớp bị thiếu trong quá trình mô hình
hóa cấu trúc Chuẩn hóa dữ liệu sẽ được trình bày cụ trong chương thiết kế tầng
quản lý và truy cập dữ liệu
- Đảm bảo rằng tất cả các quan hệ thừa kế chỉ hỗ trợ ngữ nghĩa khái quát hóa/chuyên
biệt hóa
Trang 33Hoạt động 4: Tối ưu hóa bản thiết kế
Các hoạt động tối ưu bản thiết kế bao gồm:
• Xem xét lại đường dẫn truy cập giữa các đối tượng
• Xem xét các thuộc tính của mỗi lớp
• Xem xét lại fan-out (số thông điệp gửi đi từ phương thức) trực tiếp và gián tiếp
• Xem xét thứ tự thực hiện các câu lệnh trong các phương pháp thường
được sử dụng
• Tránh tính toán lại bằng cách tạo các thuộc tính dẫn xuất (tính toán được từ
các thuộc tình khác) và đặt các trình kích hoạt việc tính toán lại các thuộc tình dẫn
xuất trên các thuộc tính có trong biểu thức tính giá trị cho các thuộc tính dẫn xuất
Trang 34Hoạt động 4: Tối ưu hóa bản thiết kế
• Xem xét lại đường dẫn truy cập giữa các đối tượng:
- Một thông điệp đi từ một đối tượng này đến đối tượng khác có thể có đường
đi (long path) rất dài (truyền qua nhiều đối tượng trung gian)
- Nếu đường đi của một thông điệp dài và được gửi đi thường xuyên thì đường
dẫn này cần được xem xét và tối ưu Ví dụ, thêm một thuộc tính cho đối tượng
gọi có kết nối trực tiếp tới đối tượng đích (nhận thông điệp)
Trang 35Hoạt động 4: Tối ưu hóa bản thiết kế
• Xem xét lại thuộc tính của mỗi lớp:
- Xác định rõ phương thức nào sử dụng thuộc tính nào, đối tượng bào sử dụng
phương thức nào
- Nếu các phương thức có một thuộc tính là các phương thức đọc hay cập nhật,
và chỉ có các đối tượng của một lớp gửi các thông điệp để đọc và cập nhật
thuộc tính đó thì thuộc tính này nên được đặt ở lớp gọi thay vì đặt ở lớp được
gọi
Trang 36Hoạt động 4: Tối ưu hóa bản thiết kế
• Xem xét lại thông điệp gửi trực tiếp và gián tiếp:
- Fan-out là số lượng thông điệp bởi một phương thức
- Fan-out trực tiếp là số lượng thông điệp được gửi đi bởi chính phương thức đó
- Fan-out gián tiếp là số lượng thông điệp được gửi bởi cac phương thức được gọi
bởi các phương thức khác trong cây truyền thông điệp
Trang 37Hoạt động 4: Tối ưu hóa bản thiết kế
• Xem xét lại thông điệp gửi trực tiếp và gián tiếp:
- Nếu fan-out của một phương thức cao so với các phương thức khác trong hệ thống,
phương thức nên được tối ưu hóa bằng cách tạo chỉ mục cho các thuộc tính được sử
dụng để gửi các thông điệp đến các đối tượng trong cây thông điệp
Trang 38Các ràng buộc và đặc tả thông điệp
Trang 39Những loại ràng buộc
điều kiện sau
phải đúng trước khi phương thức thực hiện điều kiện trước
phải đúng sau khi phương thức thực hiện Ràng buộc bất biến
phải luôn đúng đối với mọi đối tượng của lớp
Trang 40những biến thiên trên biểu đồ lớp
Trang 41những biến thiên trên biểu đồ lớp
Trang 42Đặc tả thông điệp
- Tài liệu mô tả thông điệp được truyền giữa các đối tượng
- Đặc tả thông điệp được tạo cho mỗi phương thức được hiển thị công khai
trong một lớp
- Nó nên chứa đủ thông tin cho lập trình viên hiểu phương thức này phải làm
việc gì
Trang 43Các thành phần có trong bản đặc tả thông điệp:
- Tên phương thức
- Tên lớp đối tượng
- số ID
- Danh sách các đối tượng và phương thức gửi thông điệp tới cho phương thức này
- Danh sách các ca sử dụng mà ở đó phương thức này được sử sụng để nhận ra sự
thực hiện của ca sử dụng
- Mô tả thông điệp: cung cấp thông tin mô tả thông điệp làm gì
- Các tham số nhận được: các kiểu dữ liệu của các tham số được truyền qua
phương thức
- Kiểu dữ liệu trả lại về cho các các đối tượng và phương thức gửi thông điệp đến
cho phương thức
- Điều kiện trước khi thực hiện phương thức
- Điều kiện sau khi thực hiện phương thức