Chương 7. Thiết kế theo hướng đối tượng (Object Oriented Design – OOD)
Ầ
Cập nhật: 10 tháng 05 năm 2015
TR N MINH THÁI Email: minhthai@itc.edu.vn Website: www.minhthai.edu.vn
Nội dung
#2
1. Các giai đoạn phát triển hệ thống
2. Các bước thiết kế chương trình theo hướng OOP
3. Kỹ thuật thiết kế lớp
4. Ví dụ
Các giai đoạn phát triển hệ thống [1/7]
#3
1.
Phân tích yêu cầu (Requirement analysis)
2.
Phân tích (Analysis)
3.
Thiết kế (Design)
4.
Lập trình (Programming)
5.
Kiểm tra (Testing)
Các giai đoạn phát triển hệ thống [2/7]
#4
Phân tích yêu cầu
• Bằng việc tìm hiểu các use case để nắm bắt các yêu cầu của
khách hàng, của vấn đề cần giải quyết
• Dựa vào use case xác định các nhân tố bên ngoài có tham gia vào hệ thống cũng được mô hình hóa bằng các tác nhân (actor)
• Mỗi use case được mô tả bằng văn bản, đặc tả yêu cầu của
khách hàng
Các giai đoạn phát triển hệ thống [3/7]
#5
Phân tích
• Từ các đặc tả yêu cầu trên, hệ thống sẽ bước đầu được mô hình hóa bởi các khái niệm lớp, đối tượng và các cơ chế để diễn tả hoạt động của hệ thống
• Trong giai đoạn phân tích, ta chỉ mô tả các lớp trong lĩnh vực của vấn đề cần giải quyết chứ không đi sâu vào các chi tiết kỹ thuật
Các giai đoạn phát triển hệ thống [4/7]
#6
Thiết kế
• Các kết quả của quá trình phân tích được mở rộng thành một
giải pháp kỹ thuật
• Một số các lớp được thêm vào để cung cấp cơ sở hạ tầng kỹ thuật như lớp giao diện, lớp cơ sở dữ liệu, lớp chức năng, …
Các giai đoạn phát triển hệ thống [5/7]
#7
Lập trình
• Giai đoạn này sẽ đặc tả chi tiết kết quả của giai đoạn thiết kế
• Các lớp của bước thiết kế sẽ được chuyển thành mã nguồn
theo một ngôn ngữ lập trình theo hướng đối tượng nào đó
Các giai đoạn phát triển hệ thống [6/7]
#8
Kiểm tra: có bốn hình thức kiểm tra hệ thống
• Kiểm tra từng đơn thể (unit testing): dùng kiểm tra các lớp hoặc
các nhóm đơn
• Kiểm tra tính tích hợp (integration testing): kết hợp với các thành phần và các lớp để kiểm tra xem chúng hoạt động với nhau có đúng không
Các giai đoạn phát triển hệ thống [7/7]
#9
• Kiểm tra hệ thống (system testing): kiểm tra xem hệ thống có
đáp ứng được chức năng mà người dùng yêu cầu không
• Kiểm tra tính chấp nhận được (acceptance testing): được thực hiện bởi khách hàng, việc kiểm tra cũng thực hiện giống như kiểm tra hệ thống
Các bước để thiết kế chương trình [1/6]
#10
Để thiết kế một chương trình theo hướng đối tượng, ta phải trải qua bốn bước sau:
• Xác định các dạng đối tượng (lớp) của bài toán (định danh các
đối tượng)
• Tìm kiếm các đặc tính chung (dữ liệu chung) trong các dạng đối
tượng này, những gì chúng cùng nhau chia sẻ
• Xác định được lớp cơ sở dựa trên cơ sở các đặc tính chung
của các dạng đối tượng
Các bước để thiết kế chương trình [2/6]
#11
• Từ lớp cơ sở, sử dụng quan hệ tổng quát hóa để đặc tả trong việc đưa ra các lớp dẫn xuất chứa các thành viên, những đặc tính không chung còn lại của dạng đối tượng
• Từ đó xây dựng được một cây kế thừa và các mối quan hệ
giữa các lớp
Các bước để thiết kế chương trình [3/6]
#12
Đối với hệ thống phức tạp hơn, cần phải phân tích để giải quyết được vấn đề đặt ra theo nguyên tắc:
• Phân tích một cách cẩn thận về các đối tượng của bài toán
theo trật tự từ dưới lên (bottom up)
• Tìm ra những gì tồn tại chung giữa các đối tượng, nhóm các
đặc tính này lại để được các lớp cơ sở
Các bước để thiết kế chương trình [4/6]
#13
Các bước để thiết kế chương trình [5/6]
#14
• Tiếp tục theo hướng từ dưới lên, ta thiết kế được các đối tượng
phù hợp
Các bước để thiết kế chương trình [6/6]
#15
• Bằng cách này, tiếp tục tìm các đặc tính chung cho đến tột
cùng của các đối tượng
• Sau đó cài đặt theo hướng đối tượng từ trên xuống bằng cách
cài đặt lớp cơ sở chung nhất
• Tiếp tục cài đặt các lớp dẫn xuất trên cơ sở các đặc tính chung
của từng nhóm đối tượng
• Cho đến khi tất cả các dạng đối tượng của hệ thống được cài
đặt xong để được cây kế thừa
Ví dụ 1 [1/7]
#16
Tính tiền lương của các nhân viên trong cơ quan theo các dạng:
• Biến chế: người lao động lãnh lương từ ngân sách nhà nước
được gọi là cán bộ, công chức
• Hợp đồng: người lao động lãnh lương từ ngân sách của cơ
quan được gọi là người làm
Ví dụ 1 [2/7]
#17
• Hệ thống có hai đối tượng: biên chế và hợp đồng
• Hai loại đối tượng này có đặc tính chung đó là viên chức làm
việc cho cơ quan
• Tạo lớp cơ sở để quản lý một viên chức (lớp CNguoi) bao gồm
mã số, họ tên và lương
Ví dụ 1 [3/7]
#18
• Xây dựng các lớp còn lại kế thừa từ lớp cơ sở trên
• Lớp dành cho cán bộ, công chức (lớp CBienChe) gồm các
thuộc tính: hệ số lương, tiền phụ cấp chức vụ
• Lớp dành cho người làm hợp đồng (lớp CHopDong) gồm các thuộc tính: tiền công lao động, số ngày làm việc trong tháng, hệ số vượt giờ
Ví dụ 1 [4/7]
#19
Ví dụ 1 [5/7]
#20
CNguoi::CNguoi() {
50
5
#define MAX_TEN #define MAX_MASO #define MUC_CO_BAN 120000
strcpy(HoTen,""); strcpy(MaSo,""); Luong=0;
class CNguoi {
} void CNguoi::Xuat() const {
protected:
cout<<"Ma so:"< char HoTen[MAX_TEN+1];
char MaSo[MAX_MASO+1];
double Luong; public: }
void CNguoi::Nhap()
{ CNguoi();
virtual void TinhLuong()=0;
void Xuat() const;
virtual void Nhap(); }; cout<<"Ma so:";
cin>>MaSo;
cin.ignore();
cout<<"Ho ten:";
cin.getline(HoTen,MAX_TEN); } #21 CBienChe::CBienChe()
{ HeSoLuong=HeSoPhuCap=0; class CBienChe: public CNguoi
{ protected: }
void CBienChe::Nhap()
{ double HeSoLuong;
double HeSoPhuCap; public: CNguoi::Nhap();
cout<<"He so luong:";
cin>>HeSoLuong;
cout<<"He so phu cap chuc vu:";
cin>>HeSoPhuCap; CBienChe();
virtual void TinhLuong();
virtual void Nhap(); } }; void CBienChe::TinhLuong()
{ Luong=MUC_CO_BAN*(1.0+HeSoLuong+HeSoPhuCap); } #22 CHopDong::CHopDong()
{ TienCong=NgayCong=HeSoVuotGio=0; class CHopDong : public CNguoi
{ protected: }
void CHopDong::Nhap()
{ double TienCong;
double NgayCong;
double HeSoVuotGio; public: CHopDong();
virtual void TinhLuong();
virtual void Nhap(); CNguoi::Nhap();
cout<<"Tien cong:";
cin>>TienCong;
cout<<"Ngay cong:";
cin>>NgayCong;
cout<<"He so vuot gio:";
cin>>HeSoVuotGio; }; } void CHopDong::TinhLuong()
{ Luong=TienCong*NgayCong*(1+HeSoVuotGio); } #23 Giả sử cuối năm học cần trao giải thưởng cho các sinh viên xuất
sắc và các giảng viên có nhiều công trình khoa học được công
bố trên tạp chí #24 50 #define MAX_TEN
class CNguoi
{ protected: char HoTen[MAX_TEN+1]; public: CNguoi(char *ht);
virtual bool DuocKhenThuong() const=0; virtual void Xuat() const=0; class CSinhVien : public CNguoi
{ };
CNguoi::CNguoi(char *ht)
{ protected: strcpy(HoTen,ht); double DiemTB; } public: CSinhVien(char *ht,double dtb);
virtual bool DuocKhenThuong() const;
virtual void Xuat() const; }; CSinhVien::CSinhVien(char *ht,double dtb):CNguoi(ht)
{ #25 DiemTB=dtb; }
bool CSinhVien::DuocKhenThuong() const
{ return DiemTB>9.0; }
void CSinhVien::Xuat() const
{ cout<<"Ho va ten cua sinh vien:"< } class CGiangVien : public CNguoi
{ protected: int SoBaiBao; public: CGiangVien(char *ht,int sbb);
virtual bool DuocKhenThuong() const;
virtual void Xuat() const; }; #26 CGiangVien::CGiangVien(char *ht,int sbb):CNguoi(ht)
{ SoBaiBao=sbb; }
bool CGiangVien::DuocKhenThuong() const
{ return SoBaiBao>5; }
void CGiangVien::Xuat() const
{ cout<<"Ho va ten cua giang vien:"< } #27 • Thiết kế thuộc tính • Thiết kế phương thức #28 Đối với mỗi đối tượng, xác định các thông tin cần lưu trữ. Sau đó
lập bảng mô tả thuộc tính như sau: ộ Stt Thu c tính Ràng bu c ộ ễ
Di n gi ả
i Ki u/ ể
l pớ ế ộ ộ
N u có ràng bu c liên thu c tính ả Stt Mô t ộ
ràng bu c Ghi chú ộ
Thu c tính
liên quan 28 #29 Ràng buộc trên lớp là các quy định, quy tắc áp đặt trên các giá trị thuộc tính của đối tượng sao cho đối tượng này thể hiện đúng với thực tế
• Ràng buộc tĩnh: ràng buộc trên giá trị thuộc tính • Ràng buộc trên thuộc tính (Ràng buộc MGT)
• Ràng buộc liên thuộc tính • Ràng buộc động: ràng buộc trên biến đổi giá trị thuộc tính 29 #30 Ví dụ: • “Lương của nhân viên ít nhất là 1.500.000 đồng” Ràng buộc tĩnh. • “Lương của nhân viên chỉ có thể tăng” Ràng buộc động. 30 #31 VD: Xét lớp điểm ký tự (CDiemKT) trên cửa sổ Console ể Stt ớ
Ki u/ l p Ràng bu c ộ Thu cộ
tính Di n ễ
iả
gi ố 1 x S nguyên C tộ ướ ố 2 y S nguyên Dòng 0 ≤ x < Kích
c ngang
th
0 ≤ y < Kích
ướ ọ
c d c
th 3 ch Ký tự 31 ị ự
Ký t
hi n thể #32 Chiều ngang Tọa độ góc g
n
ứ
đ i u
ề
h
C ể Stt ớ
Ki u/ l p Ràng bu c ộ ễ
Di n gi ả
i Thu c ộ
tính ữ ậ ử ổ ớ Xét l p hình ch nh t (CHCN) trên c a s Console 1 goc CDiemKT Toa đô go ć ố ướ ề 2 cngang S nguyên 1 c ngang Chi u ngang ố 3 cdung S nguyên 1 ướ ọ
c d c ề ứ
Chi u đ ng 32 ̣ ̣ #33 ả Mô t ộ
ràng bu c Ghi chú ộ
Thu c tính
liên quan ộ ổ ủ Goc, m ơ ST
T
1 T ng c a hoành đ góc
ỏ
và m nh h n kích
ướ
c ngang
th
ủ
ổ ộ Goc, n ơ 33 2 T ng c a tung đ góc
ỏ
và n nh h n kích
th ướ ọ
c d c #34 ả ộ ớ Mô t ộ
ràng bu c liên thu c tính cho l p CDate ả Mô t ộ
ràng bu c ộ
Thu c tính
liên quan Ghi
chú Ng, Th ố ế
Ng t
ế Ng, Th, Nm ậ ố ế 34 ố ST
T
1 N u Th là 4, 6, 9, 11 thì
i đa là 30
2 N u Th là 2 và Nm
i đa là 29
nhu n thì Ng t
N u Th là 2 và Nm
ậ
không nhu n thì Ng t
i
đa là 28 #35 • Lớp thời gian CTime • Lớp ngày tháng năm CDate • Lớp phân số CPhanSo • Lớp CDaThuc (Đa thức 1 ẩn) Pn(x) = a0 + a1x + a2x2+ a3x3 + ... + anxn • Lớp đường thẳng trong mặt phẳng CDuongThang 35 #36 ́ ̀ ợ ̉ ̣ ̉ Kiêm tra tính h p 1. Nho m kiêm tra ra ng buôc:
ộ
giá tr thu c tính c a đ i t ủ ố ượ ệ ị l ng 2. Nho m kh i tao: ̀ ́ ̣ ́
̣ Cung câ p gia tri ban đâ u cho ́
́ ượ
đô i t ở
ng 3. Nho m câp nhât:
́ ́ ̣ ̉ ̣ ̣ ́
̣ Thay đôi gia tri thuôc ti nh ượ ̉ ́
cua đô i t ng 4. Nho m x ly ti nh toa n: ́ ́ ́ X ly ti nh toa n các ́
́
ủ ố ượ ́
ử
ầ ừ
yêu c u t ử
thông tin c a đ i t ́
ng 5. Nho m cung câ p thông tin: ́ ́ ̣ ́
Cung câ p thuôc ́ ́ ượ ̣ ̣ ̉ ti nh nôi bô cua đô i t ng #37 ở ạ
2. Kh i t o ể
1. Ki m tra ràng
bu cộ ậ
ậ
3. C p nh t ử 4. X lý, tính toán ấ
5. Cung c p thông
tin #38 • Giá trị trả về • true: Thoả ràng buộc.
• false: Không thoả ràng buộc. • Tham số • Ràng buộc miền giá trị: Chỉ có 1 tham số ứng với tham số cần kiểm tra.
• Ràng buộc liên thuộc tính: Có tham số là các thuộc tính liên quan. 38 Mẫu: bool KiemTra... ( tham số ) #39 • Tên phương thức Bắt đầu bằng chữ KiemTra
• Ràng buộc miền giá trị: Ghép thêm tên thuộc tính
• Ràng buộc liên thuộc tính: Ghép thêm số thứ tự ràng buộc 39 #40 class CHCN
{ private: CDIEM Goc;
int ngang, dung; public: bool KiemTraNgang(int ng);
public bool KiemTraDung(int d);
public bool KiemTra1(int ng, CDiem X);
public bool KiemTra2(int d, CDiem Y); }; 40 VD cài đặt ràng buộc cho lớp CHCN #41 • Các phương thức thuộc nhóm khởi tạo và cập nhật có liên quan đến ràng buộc phải được bổ sung thêm kiểm tra ràng buộc • Việc kiểm tra tham số thoả hoặc không thoả ràng buộc bằng cách gọi phương thức kiểm tra ràng buộc tương ứng 41 bool Tên hàm ( Tham số ) { //Trả về true: thực hiện được #42 //Trả về false: không thực hiện được bool kq = false; if (Tham số thoả ràng buộc) { gán giá trị tương ứng cho thuộc tính của lớp kq=true; } return kq; } 42 hoặc #43 bool Tên hàm ( Tham số ) { //Trả về true: thực hiện được, false: không thực hiện được if (Tham số không thoả ràng buộc) return false; gán giá trị tương ứng cho thuộc tính của lớp
return true; } 43 bool CHCN::CapNhatX(int xx)
{ #44 if(!KiemTraX(xx))
return false; x=xx;
return true; }
bool CHCN::CapNhatM(int mm)
{ if(!KiemTra1(mm, Goc)) return false; m=mm;
return true; } 44 #45 VD1 Thiết kế các hành động của lớp CDiemKT ̀ ́ ̉ ̣ 1. Nho m kiêm tra ra ng buôc bool KiemTraX(int xx); bool KiemTraY(int yy); ́ ở ̣ 2. Nho m kh i tao void Nhap(); bool KhoiTao (int xx, int yy, char cc); 45 void PhatSinh(); #46 ́ ̣ ̣ VD1 Thiết kế các hành động của lớp CDiemKT
3. Nho m câp nhât
//Tr c tiê ṕ
ự bool CapNhatX(int xx); bool CapNhatY(int yy); void CapNhatCh(char c); ́ ́
//Gia n tiê p bool DichPhai(uint k); bool DichTrai(uint k); bool DichLen(uint k); 46 bool DichXuong(uint k); bool DichXien1(uint k); bool DichXien2(uint k); #47 VD1 Thiết kế các hành động của lớp CDiemKT ́ ́ ́ ́ ử 4. Nho m x ly ti nh toa n double KhoangCach(CDiemKT M); int KhoangCachX(CDiemKT M); int KhoangCachY(CDiemKT M); ́ ́ 5. Nho m cung câ p thông tin void Xuat(); void Xoa(); int GiaTriX(); 47 int GiaTriY(); char GiaTriCh(); #48 VD2 Thiết kế các hành động của lớp CHCN ̀ ́ ̉ ̣ 1. Nho m kiêm tra ra ng buôc bool KiemTraM(int mm); bool KiemTraN(int nn); ́ ở ̣ 2. Nho m kh i tao void Nhap(); bool KhoiTao(CDiemKT M,int cng, int cd); bool KhoiTao(int x, int y, int cng, int cd); void KhoiTao(CDiemKT X, CDiemKT Y); 48 void PhatSinh(); #49 VD2 Thiết kế các hành động của lớp CHCN ́ ̣ ̣ 3. Nho m câp nhât
//Tr c tiê ṕ
ự bool CapNhatGoc(CDiemKT M); bool CapNhatNgang(int cng); 49 bool CapNhatDung(int cd); #50 VD2 Thiết kế các hành động của lớp CHCN 50 ́ ̣ ̣ 3. Nho m câp nhât ́
́
//Gia n tiê p
bool DichPhai(int k);
bool DichTrai(int k);
bool DichLen(int k);
bool DichXuong(int k);
bool TangNgang(int k);
bool GiamNgang(int k);
bool TangDung(int k);
bool GiamDung(int k);
bool XoayThuan();
void XoayNghich(); #51 VD2 Thiết kế các hành động của lớp CHCN ́ ́ ́ ́ ử 4. Nho m x ly ti nh toa n ̣ int XetViTri(CDiemKT M);
//1: Bên trong, 0: Trên canh, 1: Bên ngoa ì int KhoangCachX(CDiemKT M); int KhoangCachY(CDiemKT M); #52 VD2 Thiết kế các hành động của lớp CHCN ́ ́
5. Nho m cung câ p thông tin
void Xuat();
void Xoa();
CDiemKT ToaDoGoc();
int ChieuNgang();
int ChieuDung(); int ChuVi(); long DienTich();
double DuongCheo(); #53 • Lớp thời gian CTime • Lớp ngày tháng năm CDate • Lớp phân số CPhanSo • Lớp CDaThuc (Đa thức 1 ẩn) Pn(x) = a0 + a1x + a2x2+ a3x3 + ... + anxn • Lớp đường thẳng trong mặt phẳng CDuongThang 53 #54Ví dụ 1 [6/7]
Ví dụ 1 [7/7]
Ví dụ 2 [1/4]
Ví dụ 2 [2/4]
Ví dụ 2 [3/4]
Ví dụ 2 [4/4]
Kỹ thuật thiết kế 1 lớp đối tượng
Thiết kế thuộc tính
Ràng buộc [1/6]
Ràng buộc [2/6]
Ràng buộc [3/6]
Ràng buộc [4/6]
Ràng buộc [5/6]
Ràng buộc [6/6]
Bài tập: thiết kế thuộc tính các lớp
Thiết kế các hành động của lớp
[1/2]
Thiết kế các hành động của lớp [2/2]
Mẫu cài đặt ràng buộc [1/
Mẫu cài đặt ràng buộc [2/
Cài đặt phương thức khởi tạo và cập
nhật
Bài tập: thiết kế phương thức các lớp
Q&A