Skip to content Skip to navigation

OpenStax-CNX

You are here: Home » Content » Thiết kế chương trình theo hướng đối tượng

Navigation

Lenses

What is a lens?

Definition of a lens

Lenses

A lens is a custom view of the content in the repository. You can think of it as a fancy kind of list that will let you see content through the eyes of organizations and people you trust.

What is in a lens?

Lens makers point to materials (modules and collections), creating a guide that includes their own comments and descriptive tags about the content.

Who can create a lens?

Any individual member, a community, or a respected organization.

What are tags? tag icon

Tags are descriptors added by lens makers to help label content, attaching a vocabulary that is meaningful in the context of the lens.

This content is ...

Affiliated with (What does "Affiliated with" mean?)

This content is either by members of the organizations listed or about topics related to the organizations listed. Click each link to see a list of all content affiliated with the organization.
  • VOCW

    This module is included inLens: Vietnam OpenCourseWare's Lens
    By: Vietnam OpenCourseWare

    Click the "VOCW" link to see all content affiliated with them.

Recently Viewed

This feature requires Javascript to be enabled.
 

Thiết kế chương trình theo hướng đối tượng

Module by: Lê Thị Mỹ Hạnh. E-mail the author

Summary: Tìm hiểu một ít về cách thiết kế chương trình theo hướng đối tượng, các bước cơ bản cần thiết khi bắt tay vào viết chương trình trên quan điểm thiết kế và thảo chương.

CÁC GIAI ĐOẠN PHÁT TRIỂN HỆ THỐNG

Có năm giai đoạn để phát triển hệ thống phần mềm theo hướng đối tượng:

graphics1.pngPhân tích yêu cầu (Requirement analysis)

graphics2.pngPhân tích (Analysis)

graphics3.pngThiết kế (Design)

graphics4.pngLập trình (Programming)

graphics5.pngKiểm tra (Testing)

Phân tích yêu cầu

Bằng việc tìm hiểu các trường hợp sử dụng (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. Qua trường hợp sử dụng này, 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. Mỗi trường hợp sử dụng được mô tả bằng văn bản, đặc tả yêu cầu của khách hàng.

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 chúng ta chỉ mô tả các lớp trong lĩnh vực của vấn đề cần giải quyết chứ chúng ta không đi sâu vào các chi tiết kỹ thuật.

Thiết kế

Trong giai đoạn 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, …

Lập trình

Đây còn gọi là bước xây dựng, 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 đó.

Kiểm tra

Trong giai đoạn kiểm tra, có bốn hình thức kiểm tra hệ thống:

graphics6.pngKiểm tra từng đơn thể (unit testing) được dùng kiểm tra các lớp hoặc các nhóm đơn.

graphics7.pngKiểm tra tính tích hợp (integration testing), được 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.

graphics8.pngKiểm tra hệ thống (system testing) chỉ để 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.

graphics9.pngKiểm tra tính chấp nhận được(acceptance testing), việc kiểm tra này đượ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ÁCH TÌM LỚP

Lớp nên được tìm từ phạm vi bài toán cần giải quyết, vì vậy tên của lớp cũng nên đặt tên các đối tượng thực mà chúng ta biểu diễn. Để tìm ra lớp cho bài toán, chúng ta cần trả lời các câu hỏi sau:

graphics10.pngCó thông tin nào cần lưu trữ hay phân tích không? Nếu có bất kỳ thông tin nào cần phải lưu trữ, biến đổi, phân tích hoặc xử lý thì đó chính là một lớp dự định cần xây dựng.

graphics11.pngCó hệ thống bên ngoài bên ngoài hay không? Hệ thống ngoài có thể được xem như các lớp mà hệ thống của chúng ta chứa hoặc tương tác với nó.

graphics12.pngCó các mẫu thiết kế, thư viện lớp, thành phần, … hay không? Các thành phần này đã được xây dựng từ các project trước đó, từ các đồng nghiệp hoặc các nhà sản xuất?

graphics13.pngCó thiết bị nào mà hệ thống phải đáp ứng? Bất cứ thiết bị nào được nối với hệ thống có thể chuyển thành lớp dự tuyển.

graphics14.pngTác nhân đóng vai trò như thế nào trong hệ thống? Các vai diễn này nên được xem là lớp như người sử dụng, khách hang, người điều khiển hệ thống,…

CÁC BƯỚC CẦN THIẾT ĐỂ THIẾT KẾ CHƯƠNG TRÌNH

Để thiết kế một chương trình theo hướng đối tượng, chúng ta phải trải qua bốn bước sau, từ đó chúng ta xây dựng được một cây phả hệ mang tính kế thừa và các mối quan hệ giữa các đối tượng:

graphics15.pngXác định các dạng đối tượng (lớp) của bài toán (định dang các đối tượng).

graphics16.pngTì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 xẻ.

graphics17.pngXá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.

graphics18.pngTừ 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 phần, những đặc tính không chung còn lại của dạng đối tượng. Bên cạnh đó, chúng ta còn đưa ra các lớp có quan hệ với các lớp cơ sở và lớp dẫn xuất; các quan hệ này có thể là quan hệ kết hợp, quan hệ tập hợp lại, quan hệ phụ thuộc.

Với các bước trên chúng ta có được cây phả hệ và quan hệ giữa các lớp. Đối với hệ thống phức tạp hơn, chúng ta cần phải phân tích để giải quyết được vấn đề đặt ra theo trật tự sau:

graphics19.pngPhâ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).

graphics20.pngTì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ơ như hình 7.1

Hình 1
Hình 1 (graphics21.png)

Hình 7.1

graphics22.pngTiếp tục theo hướng từ dưới lên, chúng ta thiết kế được các đối tượng phù hợp như hình 7.2

Hình 2
Hình 2 (graphics23.png)

Hình 7.2

Bằng cách này, chúng ta 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.

graphics24.pngSau đó 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.

graphics25.pngTiế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.

graphics26.pngCho đế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 phả hệ.

CÁC VÍ DỤ

Hình 3
Hình 3 (graphics27.png)
Ví dụ 7.1: Tính tiền lương của các nhân viên trong cơ quan theo các dạng khác nhau. Dạng 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 (dạng biên chế). Dạ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 hợp đồng. Như vậy hệ thống chúng ta có hai đối tượng: biên chế và hợp đồng.

Hình 4
Hình 4 (graphics28.png)
  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ừ đây có thể tạo nên lớp cơ sở để quản lý một viên chức (lớp Nguoi) bao gồm mã số, họ tên và lương.

Hình 5
Hình 5 (graphics29.png)
  Sau đó chúng ta xây dựng các lớp còn lại kế thừa từ lớp cơ sở trên:

Hình 6
Hình 6 (graphics30.png)
Lớp dành cho cán bộ, công chức (lớp BienChe) gồm các thuộc tính: hệ số lương, tiền phụ cấp chức vụ.

Hình 7
Hình 7 (graphics31.png)
Lớp dành cho người làm hợp đồng (lớp HopDong) 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ờ.

Hình 8
Hình 8 (graphics32.png)

Hình 7.3

graphics33.pngFile PERSON.H

1: //PERSON.H

2: Định nghĩa lớp Nguoi

3: #ifndef PERSON_H

4: #define PERSON_H

5:

6: #include <iostream.h>

7:

8: #define MAX_TEN 50

9: #define MAX_MASO 5

10: #define MUC_CO_BAN 120000

11:

12: class Nguoi

13: {

14: protected:

15: char HoTen[MAX_TEN];

16: char MaSo[MAX_MASO];

17: float Luong;

18: public:

19: Nguoi();

20: virtual void TinhLuong()=0;

21: void Xuat() const;

22: virtual void Nhap();

23: };

24:

25: #endif

graphics34.pngFile PERSON.CPP

1: //PERSON.CPP

2: Định nghĩa hàm thành viên cho lớp Nguoi

3: #include <iomanip.h>

4: #include <string.h>

5: #include "person.h"

6:

7: Nguoi::Nguoi()

8: {

9: strcpy(HoTen,"");

10: strcpy(MaSo,"");

11: Luong=0;

12: }

13:

14: void Nguoi::Xuat() const

15: {

16: cout<<"Ma so:"<<MaSo<<",Ho va ten:"<<HoTen

17:       #9; <<",Luong:"<<setiosflags(ios::fixed)<<setprecision(0)<<Luong<<endl;

18: }

19:

20: void Nguoi::Nhap()

21: {

22: cout<<"Ma so:";

23: cin>>MaSo;

24: cin.ignore();

25: cout<<"Ho va ten:";

26: cin.getline(HoTen,MAX_TEN);

27: }

graphics35.pngFile STAFF.H

1: //STAFF.H

2 Định nghĩa lớp BienChe

3: #ifndef STAFF_H

4: #define STAFF_H

5:

5: #include "person.h"

6:

7: class BienChe: public Nguoi

8: {

9: protected:

10: float HeSoLuong;

11: float HeSoPhuCap;

12: public:

13: BienChe();

14: virtual void TinhLuong();

15: virtual void Nhap();

16: };

17:

18: #endif

graphics36.pngFile STAFF.CPP

1: //STAFF.CPP

2: Định nghĩa hàm thành viên cho lớp BienChe

3: #include "staff.h"

4:

5: BienChe::BienChe()

6: {

7: HeSoLuong=HeSoPhuCap=0;

8: }

9:

10: void BienChe::Nhap()

11: {

12: Nguoi::Nhap();

13: cout<<"He so luong:";

14: cin>>HeSoLuong;

15: cout<<"He so phu cap chu vu:";

16: cin>>HeSoPhuCap;

17: }

18:

19: void BienChe::TinhLuong()

20: {

21: Luong=MUC_CO_BAN*(1.0+HeSoLuong+HeSoPhuCap);

22: }

graphics37.pngFile CONTRACT.H

1: //CONTRACT.H

2: Định nghĩa lớp HopDong

3: #ifndef CONTRACT_H

4: #define CONTRACT_H

5:

6: #include "person.h"

7:

8: class HopDong : public Nguoi

9: {

10: protected:

11: float TienCong;

12: float NgayCong;

13: float HeSoVuotGio;

14: public:

15: HopDong();

16: virtual void TinhLuong();

17: virtual void Nhap();

18: };

19:

20: #endif

graphics38.pngFile CONTRACT.CPP:

1: //CONTRACT.CPP

2: Định nghĩa hàm thành viên cho lớp HopDong

3: #include "contract.h"

4:

5: HopDong::HopDong()

6: {

7: TienCong=NgayCong=HeSoVuotGio=0;

8: }

9:

10: void HopDong::Nhap()

11: {

12: Nguoi::Nhap();

13: cout<<"Tien cong:";

14: cin>>TienCong;

15: cout<<"Ngay cong:";

16: cin>>NgayCong;

17: cout<<"He so vuot gio:";

18: cin>>HeSoVuotGio;

19: }

20:

21: void HopDong::TinhLuong()

22: {

23: Luong=TienCong*NgayCong*(1+HeSoVuotGio);

24: }

graphics39.pngFile CT7_1.CPP:

1: //CT7_1.CPP

2: //Chương trình 7.1

3: #include <iostream.h>

4: #include <ctype.h>

5: #include "person.h"

6: #include "staff.h"

7: #include "contract.h"

8:

9: int main()

10: {

11: Nguoi *Ng[100];

12: int N=0;

13: char Chon,Loai;

14: do

15: {

16: cout<<"Bien che hay Hop dong (B/H)? ";

17: cin>>Loai;

18: Loai=toupper(Loai);

19: if (Loai=='B')

20: Ng[N]=new BienChe;

21: else

22: Ng[N]=new HopDong;

23: Ng[N++]->Nhap();

24: cout<<"Tiep tuc (C/K)? ";

25: cin>>Chon;

26: Chon=toupper(Chon);

27: if ((N==100)||(Chon=='K'))

28: break;

29: }

30: while (1);

31: for(int I=0;I<N;++I)

32: {

33: Ng[I]->TinhLuong();

34: Ng[I]->Xuat();

35: }

36: return 0;

37: }

Chúng ta chạy ví dụ 7.1, kết quả ở hình 7.4

Hình 9
Hình 9 (graphics40.png)

Hình 7.4: Kết quả của ví dụ 7.1

Hình 10
Hình 10 (graphics41.png)
Ví dụ 7.2: 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í. Các lớp trong cây phả hệ như hình 7.5: lớp Nguoi để quản lý hồ sơ cá nhân, lớp SinhVien quản lý về sinh viên và lớp GiangVien quản lý giảng viên.

Hình 11
Hình 11 (graphics42.png)
Lớp Nguoi:

Hình 12
Hình 12 (graphics43.png)
Dữ liệu họ và tên.

Hình 13
Hình 13 (graphics44.png)
Phương thức kiểm tra khả năng được khen thưởng. Đây là phương thức thuần ảo.

Hình 14
Hình 14 (graphics45.png)
Phương thức xuất. Đây là phương thức thuần ảo.

Hình 15
Hình 15 (graphics46.png)
Lớp SinhVien:

Hình 16
Hình 16 (graphics47.png)
Dữ liệu điểm trung bình.

Hình 17
Hình 17 (graphics48.png)
Phương thức kiểm tra khả năng được khen thưởng.

Hình 18
Hình 18 (graphics49.png)
Phương thức xuất.

Hình 19
Hình 19 (graphics50.png)
Lớp GiangVien:

Hình 20
Hình 20 (graphics51.png)
Dữ liệu điểm trung bình.

Hình 21
Hình 21 (graphics52.png)
Phương thức kiểm tra khả năng được khen thưởng.

Hình 22
Hình 22 (graphics53.png)
Phương thức xuất.

Hình 23
Hình 23 (graphics54.png)

Hình 7.5

graphics55.pngFile PERSON.H

1: //PERSON.H

2: Định nghĩa lớp Nguoi

3: #ifndef PERSON_H

4: #define PERSON_H

5:

6: #include <iostream.h>

7:

8: #define MAX_TEN 50

9:

10: class Nguoi

11: {

12: protected:

13: char HoTen[MAX_TEN];

14: public:

15: Nguoi(char *HT);

16: virtual int DuocKhenThuong() const=0;

17: virtual void Xuat() const=0;

18: };

19:

20: #endif

graphics56.pngFile PERSON.CPP:

1: //PERSON.CPP

2: Định nghĩa hàm thành viên cho lớp Nguoi

3: #include <string.h>

4: #include "person.h"

5:

6: Nguoi::Nguoi(char *HT)

7: {

8: strcpy(HoTen,HT);

9: }

graphics57.pngFile STUDENT.H:

1: //STUDENT.H

2: Định nghĩa lớp SinhVien

3: #ifndef STUDENT_H

4: #define STUDENT_H

5:

6: #include "person.h"

7:

8: class SinhVien : public Nguoi

9: {

10: protected:

11: float DiemTB;

12: public:

13: SinhVien(char *HT,float DTB);

14: virtual int DuocKhenThuong() const;

15: virtual void Xuat() const;

16: };

17:

18: #endif

graphics58.pngFile STUDENT.CPP:

1: //STUDENT.CPP

2: Định nghĩa hàm thành viên cho lớp SinhVien

3: #include "student.h"

4:

5: SinhVien::SinhVien(char *HT,float DTB):Nguoi(HT)

6: {

7: DiemTB=DTB;

8: }

9:

10: int SinhVien::DuocKhenThuong() const

11: {

12: return DiemTB>9.0;

13: }

14:

15: void SinhVien::Xuat() const

16: {

17: cout<<"Ho va ten cua sinh vien:"<<HoTen;

18: }

graphics59.pngFile TEACHER.H:

1: //TEACHER.H

2: Định nghĩa lớp GiangVien

3: #ifndef TEACHER_H

4: #define TEACHER_H

5:

6: #include "person.h"

7:

8: class GiangVien : public Nguoi

9: {

10: protected:

11: int SoBaiBao;

12: public:

13: GiangVien(char *HT,int SBB);

14: virtual int DuocKhenThuong() const;

15: virtual void Xuat() const;

16: };

17:

18: #endif

graphics60.pngFile TEACHER.CPP:

1: //TEACHER.CPP

2: Định nghĩa hàm thành viên cho lớp GiangVien

3: #include "teacher.h"

4:

5: GiangVien::GiangVien(char *HT,int SBB):Nguoi(HT)

6: {

7: SoBaiBao=SBB;

8: }

9:

10: int GiangVien::DuocKhenThuong() const

11: {

12: return SoBaiBao>5;

13: }

14:

15: void GiangVien::Xuat() const

16: {

17: cout<<"Ho va ten cua giang vien:"<<HoTen;

18: }

graphics61.pngFile CT7_2.CPP:

1: //CT7_2.CPP

2: //Chương trình 7.2

3: #include <ctype.h>

4: #include "person.h"

5: #include "student.h"

6: #include "teacher.h"

7:

8: int main()

9: {

10: Nguoi *Ng[100];

11: int N=0;

12: char Chon,Loai;

13: char HoTen[MAX_TEN];

14: do

15: {

16: cout<<"Ho va ten:";

17: cin.getline(HoTen,MAX_TEN);

18: cout<<"Sinh vien hay Giang vien(S/G)? ";

19: cin>>Loai;

20: Loai=toupper(Loai);

21: if (Loai=='S')

22: {

23: float DTB;

24: cout<<"Diem trung binh:";

25: cin>>DTB;

26: Ng[N++]=new SinhVien(HoTen,DTB);

27: }

28: else

29: {

30: int SoBaiBao;

31: cout<<"So bai bao:";

32: cin>>SoBaiBao;

33: Ng[N++]=new GiangVien(HoTen,SoBaiBao);

34: }

35: cout<<"Tiep tuc (C/K)? ";

36: cin>>Chon;

37: Chon=toupper(Chon);

38: cin.ignore();

39: if ((N==100)||(Chon=='K'))

40: break;

41: }

42: while (1);

43: for(int I=0;I<N;++I)

44: {

45: Ng[I]->Xuat();

46: if (Ng[I]->DuocKhenThuong())

47: cout<<". Nguoi nay duoc khen thuong";

48: cout<<endl;

49: }

50: return 0;

51: }

Chúng ta chạy ví dụ 7.2, kết quả ở hình 7.6

Hình 24
Hình 24 (graphics62.png)

Hình 7.6: Kết quả của ví dụ 7.2

Hình 25
Hình 25 (graphics63.png)
Ví dụ 7.3: Giả sử cần phải tạo các hình: hình tròn và hình chữ nhật được tô theo hai màu red và blue. Xây dựng một cây phả hệ để quản lý các hình này.

Trước hết chúng ta cần có lớp cơ sở Shape để lưu trữ thông tin chung cho các hình, sau đó là hai lớp dẫn xuất Rectangle về hình hình chữ nhật và Circle về hình tròn như hình 7.7

Hình 26
Hình 26 (graphics64.png)
Hình 27
Hình 27 (graphics65.png)
Lớp Shape:

Hình 28
Hình 28 (graphics66.png)
Tọa độ tâm.

Hình 29
Hình 29 (graphics67.png)
Màu đường biên.

Hình 30
Hình 30 (graphics68.png)
Màu tô.

Hình 31
Hình 31 (graphics69.png)
Phương thức thiết lập tô màu.

Hình 32
Hình 32 (graphics70.png)
Phương thức vẽ hình. Đây là phương thức thuần ảo.

Hình 33
Hình 33 (graphics71.png)
Lớp Rectangle:

Hình 34
Hình 34 (graphics72.png)
Chiều dài và chiều rộng.

Hình 35
Hình 35 (graphics73.png)
Phương thức vẽ hình.

Hình 36
Hình 36 (graphics74.png)
Lớp Circle:

Hình 37
Hình 37 (graphics75.png)
Bán kính.

Hình 38
Hình 38 (graphics76.png)
Phương thức vẽ hình.

Content actions

Download module as:

Add module to:

My Favorites (?)

'My Favorites' is a special kind of lens which you can use to bookmark modules and collections. 'My Favorites' can only be seen by you, and collections saved in 'My Favorites' can remember the last module you were on. You need an account to use 'My Favorites'.

| A lens I own (?)

Definition of a lens

Lenses

A lens is a custom view of the content in the repository. You can think of it as a fancy kind of list that will let you see content through the eyes of organizations and people you trust.

What is in a lens?

Lens makers point to materials (modules and collections), creating a guide that includes their own comments and descriptive tags about the content.

Who can create a lens?

Any individual member, a community, or a respected organization.

What are tags? tag icon

Tags are descriptors added by lens makers to help label content, attaching a vocabulary that is meaningful in the context of the lens.

| External bookmarks