Bài giảng Lập trình hướng đối tượng - Chương 7: Thiết kế theo hướng đối tượng - Trần Minh Thái

pptx 54 trang ngocly 1200
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương 7: Thiết kế theo hướng đối tượng - Trần Minh Thái", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxbai_giang_lap_trinh_huong_doi_tuong_chuong_7_thiet_ke_theo_h.pptx

Nội dung text: Bài giảng Lập trình hướng đối tượng - Chương 7: Thiết kế theo hướng đối tượng - Trần Minh Thái

  1. Chương 7. Thiết kế theo hướng đối tượng (Object Oriented Design – OOD) TRẦN MINH THÁI Email: minhthai@itc.edu.vn Website: www.minhthai.edu.vn Cập nhật: 10 tháng 05 năm 2015
  2. 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ụ
  3. 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)
  4. 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
  5. 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
  6. 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,
  7. 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 đó
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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ở
  13. Các bước để thiết kế chương trình [4/6] #13
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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ờ
  19. Ví dụ 1 [4/7] #19
  20. Ví dụ 1 [5/7] #20 CNguoi::CNguoi() #define MAX_TEN 50 { #define MAX_MASO 5 strcpy(HoTen,""); #define MUC_CO_BAN 120000 strcpy(MaSo,""); Luong=0; class CNguoi } { void CNguoi::Xuat() const protected: { char HoTen[MAX_TEN+1]; cout >MaSo; }; cin.ignore(); cout<<"Ho ten:"; cin.getline(HoTen,MAX_TEN); }
  21. Ví dụ 1 [6/7] #21 CBienChe::CBienChe() { class CBienChe: public CNguoi HeSoLuong=HeSoPhuCap=0; { } protected: void CBienChe::Nhap() double HeSoLuong; { double HeSoPhuCap; CNguoi::Nhap(); public: cout >HeSoLuong; virtual void TinhLuong(); cout >HeSoPhuCap; }; } void CBienChe::TinhLuong() { Luong=MUC_CO_BAN*(1.0+HeSoLuong+HeSoPhuCap); }
  22. Ví dụ 1 [7/7] #22 CHopDong::CHopDong() { class CHopDong : public CNguoi TienCong=NgayCong=HeSoVuotGio=0; { } protected: void CHopDong::Nhap() double TienCong; { double NgayCong; CNguoi::Nhap(); double HeSoVuotGio; cout >TienCong; CHopDong(); cout >NgayCong; virtual void Nhap(); cout >HeSoVuotGio; } void CHopDong::TinhLuong() { Luong=TienCong*NgayCong*(1+HeSoVuotGio); }
  23. 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í
  24. Ví dụ 2 [2/4] #24 #define MAX_TEN 50 class CNguoi { protected: char HoTen[MAX_TEN+1]; public: CNguoi(char *ht); virtual bool DuocKhenThuong() const=0; virtual void Xuat() const=0; }; CNguoi::CNguoi(char *ht) class CSinhVien : public CNguoi { { strcpy(HoTen,ht); protected: } double DiemTB; public: CSinhVien(char *ht,double dtb); virtual bool DuocKhenThuong() const; virtual void Xuat() const; };
  25. 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:"<<HoTen<<endl; } class CGiangVien : public CNguoi { protected: int SoBaiBao; public: CGiangVien(char *ht,int sbb); virtual bool DuocKhenThuong() const; virtual void Xuat() const; };
  26. 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:"<<HoTen<<endl; }
  27. 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
  28. 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 Kiểu/ lớp Ràng buộc Diễn giải Nếu có ràng buộc liên thuộc tính Thuộc tính Stt Mô tả ràng buộc Ghi chú liên quan 28
  29. 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
  30. 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
  31. Ràng buộc [3/6] #31 VD: Xét lớp điểm ký tự (CDiemKT) trên cửa sổ Console Thuộc Stt Kiểu/ lớp Ràng buộc Diễn giải tính 0 ≤ x < Kích 1 x Số nguyên Cột thước ngang 0 ≤ y < Kích 2 y Số nguyên Dòng thước dọc Ký tự 3 ch Ký tự hiển thị 31
  32. Ràng buộc [4/6] #32 Xét lớp hình chữ nhật (CHCN) trên cửa sổ Console Chiều ngang Tọa độ góc đứng Chiều Thuộc Stt Kiểu/ lớp Ràng buộc Diễn giải tính 1 goc CDiemKT Toạ độ góc 2 cngang Số nguyên 1<ngang< K/thước ngang Chiều ngang 3 cdung Số nguyên 1<dung< K/thước dọc Chiều đứng 32
  33. Ràng buộc [5/6] #33 ST Mô tả ràng buộc Thuộc tính Ghi chú T liên quan 1 Tổng của hoành độ góc Goc, m và m nhỏ hơn kích thước ngang 2 Tổng của tung độ góc và Goc, n n nhỏ hơn kích thước dọc 33
  34. Ràng buộc [6/6] #34 Mô tả ràng buộc liên thuộc tính cho lớp CDate ST Mô tả ràng buộc Thuộc tính Ghi T liên quan chú 1 Nếu Th là 4, 6, 9, 11 thì Ng, Th Ng tối đa là 30 2 Nếu Th là 2 và Nm Ng, Th, Nm nhuận thì Ng tối đa là 29 Nếu Th là 2 và Nm không nhuận thì Ng tối đa là 28 34
  35. 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) 2 3 n Pn(x) = a0 + a1x + a2x + a3x + + anx Lớp đường thẳng trong mặt phẳng CDuongThang 35
  36. Thiết kế các hành động của lớp [1/2] #36 1. Nhóm kiểm tra ràng buộc: Kiểm tra tính hợp lệ giá trị thuộc tính của đối tượng 2. Nhóm khởi tạo: Cung cấp giá trị ban đầu cho đối tượng 3. Nhóm cập nhật: Thay đổi giá trị thuộc tính của đối tượng 4. Nhóm xử lý tính toán: Xử lý tính toán các yêu cầu từ thông tin của đối tượng 5. Nhóm cung cấp thông tin: Cung cấp thuộc tính nội bộ của đối tượng
  37. 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
  38. Mẫu cài đặt ràng buộc [1/ #38 Mẫu: bool KiemTra ( tham số ) 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. 38 Ràng buộc liên thuộc tính: Có tham số là các thuộc
  39. 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. VD cài đặt ràng buộc cho lớp CHCN #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
  41. 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
  42. bool Tên hàm ( Tham số ) { #42 //Trả về true: thực hiện được //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
  43. #43 hoặc 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
  44. 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 #45 1. Nhóm kiểm tra ràng buộc bool KiemTraX(int xx); bool KiemTraY(int yy); 2. Nhóm khởi tạo void Nhap(); bool KhoiTao (int xx, int yy, char cc); void PhatSinh(); 45
  46. VD1 Thiết kế các hành động của lớp CDiemKT 3. Nhóm cập nhật #46 //Trực tiếp bool CapNhatX(int xx); bool CapNhatY(int yy); void CapNhatCh(char c); //Gián tiếp bool DichPhai(uint k); bool DichTrai(uint k); bool DichLen(uint k); bool DichXuong(uint k); bool DichXien1(uint k); bool DichXien2(uint k); 46
  47. VD1 Thiết kế các hành động của lớp CDiemKT #47 4. Nhóm xử lý tính toán double KhoangCach(CDiemKT M); int KhoangCachX(CDiemKT M); int KhoangCachY(CDiemKT M); 5. Nhóm cung cấp thông tin void Xuat(); void Xoa(); int GiaTriX(); int GiaTriY(); char GiaTriCh(); 47
  48. VD2 Thiết kế các hành động của lớp CHCN #48 1. Nhóm kiểm tra ràng buộc bool KiemTraM(int mm); bool KiemTraN(int nn); 2. Nhóm khởi tạo 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); void PhatSinh(); 48
  49. VD2 Thiết kế các hành động của lớp CHCN #49 3. Nhóm cập nhật //Trực tiếp bool CapNhatGoc(CDiemKT M); bool CapNhatNgang(int cng); bool CapNhatDung(int cd); 49
  50. VD2 Thiết kế các hành động của lớp CHCN #50 3. Nhóm cập nhật //Giá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(); 50
  51. VD2 Thiết kế các hành động của lớp CHCN #51 4. Nhóm xử lý tính toán int XetViTri(CDiemKT M); //-1: Bên trong, 0: Trên cạnh, 1: Bên ngoài int KhoangCachX(CDiemKT M); int KhoangCachY(CDiemKT M);
  52. VD2 Thiết kế các hành động của lớp CHCN #52 5. Nhóm cung cấp thông tin void Xuat(); void Xoa(); CDiemKT ToaDoGoc(); int ChieuNgang(); int ChieuDung(); int ChuVi(); long DienTich(); double DuongCheo();
  53. 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) 2 3 n Pn(x) = a0 + a1x + a2x + a3x + + anx Lớp đường thẳng trong mặt phẳng CDuongThang 53
  54. Q&A #54