Mục tiêu: Xây dựng chương trình quản lý
về hồ sơ cá nhân của các đối tượng này,
qua đó để có được danh sách những
người làm việc trong cơ quan, nguồn gốc
xuất thân của họ và chức năng của từng
người.
14 trang |
Chia sẻ: thienmai908 | Lượt xem: 1297 | Lượt tải: 0
Nội dung tài liệu Lập trình hướng đối tượng Phần 9, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
11
Object – Oriented Programming
PGS. TS. Trần Văn Lăng
KHOA CÔNG NGHỆ THÔNG TIN
TRƯỜNG ĐẠI HỌC LẠC HỒNG
lang@lhu.edu.vn
2
Chương 9
Xây dựng chương trình
theo hướng đối tượng
3
Các bước cơ bản
Để thiết kế một chương trình theo hướng
đối tượng cần phải trải qua các bước:
Xác định các dạng đối tượng của bài toán
(định danh các đối tượng)
Tìm kiếm những đặc tính chung trong các
dạng đối tượng này, những gì các dạng đối
tượng này cùng nhau chia sẻ.
Xác định được lớp cơ sở trên cơ sở các đặc
tính chung của những dạng đối tượng.
4
Từ lớp cơ sở, sử dụng quan hệ tổng quát hóa
(generalization) để đặc tả hóa (specification)
trong việc tạo ra các lớp dẫn xuất chứa
những thành phần là những đặc tính còn lại
(những đặc tính không chung còn lại) của
dạng đối tượng.
25
Bên cạnh đó còn đưa ra những 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 (association),
Tập hợp lại (aggregation),
Phụ thuộc (dependency)
Trường hợp tham số của hàm là dữ liệu thuộc
kiểu lớp, cũng được xem là quan hệ phụ thuộc
6
Từ đó xây dựng được một phả hệ mang
tính thừa kế (có tổ tiên và hậu duệ) và
các mối quan hệ giữa các đối tượng
7
Với các bước trên, có được 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
phải phân tích để giải quyết được vấn đề
đặt ra theo trật tự như sau:
8
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.
Và 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 chung này lại để
được các lớp cơ sở
39
Ñoái tö ôïng N
Caùc ñaëc tính chung tö ø ñoái
tö ôïng 1 ñeán ñoái tö ôïng I
Caùc ñaëc tính chung tö ø oi
tö ôïng J ñeán oái tö ôïng N
Ñoái tö ôïng 1 Ñoái tö ôïng I Ñoái tö ôïng J
10
Tiế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
Caùc ñaëc tính chung tö ø ñoái
tö ôïng J ñeán ñoái tö ôïng N
Caùc ñaëc tính chung tö ø ñoái
tö ôïng 1 ñeán ñoái tö ôïng N
Caùc ñaëc tính chung tö ø ñoái
tö ôïng 1 ñeán ñoái tö ôïng I
11
Bằng cách này tiếp tục tìm những đặ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 theo cài đặt các lớp dẫn xuất trên cơ sở những
đặc tính chung của từng nhóm đối tượng.
Cho đến khi tất cả các đối tượng của hệ thống được
cài đặt xong để được một phả hệ.
12
Ví dụ tính lương của một cơ quan
Mục tiêu: Quản lý thu nhập hằng tháng
của một cơ quan, cuối tháng in bảng tiền
lương của tất cả những người làm việc
trong cơ quan theo các dạng khác nhau.
Giả sử trong một cơ quan, lương tiền có
được từ hai nguồn:
Ngân sách Nhà nước
Kinh phí tự có do sản xuất kinh doanh
413
Tương ứng, mỗi loại có tên gọi riêng
Công chức (dạng biên chế)
Người làm hợp đồng
14
Từ đây có thể tạo nên lớp cơ sở để quản
lý một viên chức (NGUOI) trong cơ quan
bao gồm
Tên họ (th)
Mã số (ms)
Tiền lương (tl)
15
Sau đó xây dựng các lớp còn lại được kế
thừa từ lớp chung này dựa trên các thuộc
tính cho từng lớp:
Lớp BIENCHE
Hệ số lương (hsl),
Tiền phụ cấp từ nguồn tự có (pc)
16
Lớp HOPDONG
Tiền công lao động (l1n)
Số ngày làm việc trong tháng (nc)
517
Chương trình có nhiệm vụ in bảng lương
theo cán bộ công chức và người làm hợp
đồng.
NGUOI
BIENCHE HOPDONG
18
Các lớp liên quan
class NGUOI{
char th[30];
char ms[4];
float tl;
public:
void input();
void output();
void setTl( float );
float getTl();
};
19
class BIENCHE: public NGUOI{
float hsl;
float pc;
public:
BIENCHE(){}
BIENCHE( BIENCHE*, int );
void inBangLuong(BIENCHE*,int);
};
20
class HOPDONG: public NGUOI{
int nc;
float l1n;
public:
HOPDONG(){}
HOPDONG( HOPDONG*, int );
void inBangLuong(HOPDONG*,int);
};
621
void main(){
const int nb = 3;
const int nh = 3;
BIENCHE *b = new BIENCHE[nb];
HOPDONG *h = new HOPDONG[nh];
BIENCHE B( b, nb );
HOPDONG H( h, nh );
B.inBangLuong( b, nb );
H.inBangLuong( h, nh );
}
22
Ví dụ quản lý phòng khám bệnh
Mục tiêu: Quản lý phòng khám của bác
sĩ, qua đó thống kê số bệnh nhân đến
khám bệnh tại phòng khám.
Để thực hiện công việc, trước hết xem xét
các tác nhân (actor) tác động đến hệ
thống.
Từ đó suy ra xuất xứ của các nguồn dữ
liệu cần cho hệ thống.
23
Hai nhân tố cần cho hệ thống đó là
Bệnh nhân
Bác sĩ
Để giải quyết được vấn đề đặt ra, phải
xem xét trong bối cảnh của ngôn ngữ lập
trình hướng đối tượng sẽ được sử dụng
để cài đặt.
Chuỗi ký tự
Ngày tháng
24
Với những nhận định trên, chúng ta có
thể có các dạng đối tượng (lớp) sau đây
cần cho hệ thống:
Lớp bệnh nhân (PATIENT), bao gồm các
thuộc tính như:
Họ tên (name)
Ngày tháng năm sinh (date)
Số lần khám bệnh trong tháng (visit)
725
Lớp bác sĩ (DOCTOR), bao gồm
Tên họ của người bác sĩ (name)
Danh sách những bệnh nhân đến khám bệnh (list)
Số bệnh nhân đã khám bệnh trong tháng (count).
Lớp chuỗi ký tự (STRING) để quản lý
Tên họ (data)
Lớp ngày tháng (DATE) để lưu trữ
Dữ liệu ngày (day)
Tháng (month)
Năm (year)
26
Qua các lớp trên, xây dựng hệ thống phả
hệ bằng cách tìm ra những đặc tính
chung của các lớp đã nêu.
Hai lớp bệnh nhân và bác sĩ có thể
chung nhau những dữ liệu và hành vi liên
quan đến họ tên.
27
Từ đó, có thể cấu tạo nên lớp người
(PERSON) với thuộc tính
Tên họ (name) thuộc kiểu chuỗi ký tự.
28
Trên cơ sở những đặc tính không chung
còn lại, có được hai lớp dẫn xuất là bệnh
nhân và bác sĩ được kế thừa từ lớp
người.
Lớp người có thuộc tính là tên họ thuộc
lớp chuỗi ký tự (name), điều đó có nghĩa
là nó được tập hợp lại từ những thuộc
tính riêng của nó và lớp chuỗi ký tự.
829
Lớp bệnh nhân có thuộc tính ngày sinh
(date), nên lớp ngày tháng được tập hợp
lại trong lớp bệnh nhân.
Lớp bác sĩ lại có danh sách những bệnh
nhân đến khám (list), nên cũng được tập
hợp lại dưới dạng kết hợp một bác sĩ có
thể có một hoặc nhiều bệnh nhân.
30
Mô hình hóa hệ thống
MAIN
DOCTORPATIENT
DATE
PERSONSTRING
31
Các lớp liên quan
class PERSON{
STRING name;
public:
STRING getName();
void setName( STRING& );
};
32
class PATIENT:public PERSON{
DATE date;
int visit;
public:
PATIENT( STRING&, DATE&, int );
PATIENT();
int getVisit();
};
933
class DOCTOR: public PERSON{
PATIENT list[MAX];
int count;
public:
DOCTOR( STRING& n );
void registerPatient( PATIENT& p );
double statistics();
void output( double );
};
34
class STRING{
char* data;
public:
STRING ( unsigned int = 0, char = ' ' );
STRING ( STRING& );
~STRING ();
friend istream& operator >> (i&,STRING&);
friend ostream& operator << (o&,STRING&);
};
35
class DATE{
int day, month, year;
public:
DATE(int=1,int=1,int=2008);
void input();
void output();
};
36
Để chương trình mang tính thực thi, xây dựng
lớp MAIN,
Trong lớp này được tập hợp vào đối tượng
thuộc lớp DOCTOR.
class MAIN{
DOCTOR *dr;
public:
MAIN();
};
10
37
Ví dụ quản lý hoạt động khoa học
Mục tiêu: Quản lý hoạt động khoa học
trong một trường đại học có chức năng
đào tạo sinh viên đại học và sau đại học.
Những hoạt động ở đây chủ yếu là nghiên
cứu khoa học và giảng dạy.
38
Đây là hoạt động của con người nên những yếu
tố được xoay quanh người làm việc trong
trường đại học.
Từ đó có được các dạng đối tượng cần cho hệ
thống bao gồm:
Giáo sư (giáo sư, phó giáo sư)
Giảng viên (giảng viên cao cấp, giảng viên chính,
giảng viên)
Nghiên cứu sinh (tiến sĩ, thạc sĩ)
Sinh viên
39
Trong các lớp trên, chúng ta phải sử dụng
chuỗi ký tự để mô tả những dữ liệu
dạng văn bản.
40
Các đối tượng này được nhóm lại theo từng
nhóm trên cơ sở những thuộc tính chung theo
chiều từ dưới lên.
Lớp giáo sư (PROFESSOR), lớp giảng viên
(LECTURER) được xem là dạng người tham gia
việc giảng dạy (TEACHER).
Hai lớp nghiên cứu sinh (RESEARCHER) và
sinh viên (STUDENT) được xem là dạng người
đi học (PUPIL).
11
41
PUPIL
PROFESSOR LECTURER RESEARCHER STUDENT
PERSON
TEACHER
STRING
42
Từ đó, có các lớp cơ sở PERSON với các
thuộc tính có thể như là
Name chứa tên họ,
NumberID chứa mã số
Lớp này được đặc tả hóa để có lớp
TEACHER với thuộc tính
Degree lưu trữ học vị của giáo viên,
Paper về số bài báo
43
Lớp PUPIL gồm
GPA là điểm trung bình.
Những lớp còn lại có thể quan hệ kết hợp
(association), tập hợp (aggregation) hay
kế thừa (inheritance) từ các lớp trên.
44
Trong lớp PROFESSOR ngoài việc được kế
thừa từ lớp TEACHER, còn có thêm một
số thuộc tính như:
NumberResearcher chứa số nghiên cứu sinh
đã bảo vệ,
NumberBook là số sách đã xuất bản.
12
45
Lớp LECTURER thừa kế từ lớp TEACHER
và chứa
Số sinh viên đã bảo vệ xuất sắc luận văn tốt
nghiệp (NumberStudent).
46
Lớp RESEARCHER thừa kế từ hai lớp
TEACHER và PUPIL, đồng thời để phân
biệt, chúng ta đưa thêm vào
Loại hình nghiên cứu sinh là thạc sĩ hay tiến
sĩ.
47
Lớp STUDENT chỉ thừa kế từ lớp PUPIL
ngoài ra chúng ta đưa thêm yếu tố để
biết
Có nghiên cứu khoa học không (Studying),
nếu có, tên công trình.
48
Bên cạnh đó, có lớp STRING lưu trữ các
thuộc tính và hành vi liên quan đến chuỗi
ký tự.
Lớp này được kết hợp với những lớp có
thuộc tính chuỗi ký tự như Name, Degree,
v.v...
13
49
Lưu ý với lớp RESEARCHER, do thừa kế
bội với cấu trúc không bình thường,
Nên trong trường hợp này phải sử dụng
thừa kế ảo (virtual inheritance) khi xây
dựng lớp để tránh tình trạng các phương
thức của lớp PERSON xuất hiện hai lần
trong lớp RESEARCHER.
50
Ví dụ quản lý hồ sơ cá nhân
Trong một cơ sở nghiên cứu khoa học có
những thành viên khác nhau:
Người làm công việc quản lý hành chánh
Người nghiên cứu khoa học
Những thí nghiệm viên trợ lý cho những nhà
nghiên cứu
51
Mục tiêu: Xây dựng chương trình quản lý
về hồ sơ cá nhân của các đối tượng này,
qua đó để có được danh sách những
người làm việc trong cơ quan, nguồn gốc
xuất thân của họ và chức năng của từng
người.
52
EMPLOYEE
Name : STRING
Age : int
EDUCATION
School : STRING
Degree : STRING
MANAGER
Title : STRING
STRING
SCIENTIST
pubs : int
slave : LABORER
LABORER
What : STRING
14
53
Lớp SCIENTIST và lớp MANAGER được
dẫn xuất từ hai lớp EMPLOYEE và
EDUCATION,
Hai lớp này lưu trữ
Hồ sơ nhân thân
Nền học vấn của từng cá nhân
54
Lớp STRING đóng vai trò kiểu dữ liệu sử
dụng trong các lớp khác, nên có mối quan
hệ kết hợp giữa các lớp tương ứng.
Bên cạnh đó, mỗi nhà khoa học lại có một
người trợ lý, nên giữa hai lớp SCIENTIST
và LABORER cũng có mối quan hệ.
55
Yêu cầu
Tạo ra cây phả hệ gồm 2 hoặc 3 cấp
Hiểu các chương trình minh hoạ
Viết vài chương trình đơn giản
56
Ôn tập
Hai vấn đề chính:
Xây dựng lớp hoàn chỉnh dùng C++
Minh hoạ hệ thống từ 2 đến 3 cấp gồm các
lớp có quan hệ thừa kế, quan hệ dạng lớp là
thành viên của lớp.
Viết chương trình chính bằng C++ để thử
nghiệm.
Các file đính kèm theo tài liệu này:
- jyksagupierh'iufgoasidu[ps (9).pdf