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);

}

Ví dụ 1 [6/7]

#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);

}

Ví dụ 1 [7/7]

#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);

}

Ví dụ 2 [1/4]

#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í

Ví dụ 2 [2/4]

#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;

};

Ví dụ 2 [3/4]

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;

};

Ví dụ 2 [4/4]

#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:"<

}

Kỹ thuật thiết kế 1 lớp đối tượng

#27

• Thiết kế thuộc tính

• Thiết kế phương thức

Thiết kế thuộc tính

#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

Ràng buộc [1/6]

#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

Ràng buộc [2/6]

#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

Ràng buộc [3/6]

#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ể

Ràng buộc [4/6]

#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

̣ ̣

Ràng buộc [5/6]

#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

Ràng buộc [6/6]

#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

Bài tập: thiết kế thuộc tính các lớp

#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

Thiết kế các hành động của lớp [1/2]

#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

Thiết kế các hành động của lớp [2/2]

#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

Mẫu cài đặt ràng buộc [1/

#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ố )

Mẫu cài đặt ràng buộc [2/

#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

Cài đặt phương thức khởi tạo và cập nhật

#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();

Bài tập: thiết kế phương thức các lớp

#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

Q&A

#54