1
L
L
Ậ
Ậ
P TRÌNH HƯ
P TRÌNH HƯ
Ớ
Ớ
NG Đ
NG Đ
Ố
Ố
I TƯ
I TƯ
Ợ
Ợ
NG
NG
C
C
++
++
Bộ mônCôngnghệ phầnmềm
Khoa Công Nghệ Thông Tin
ĐạiHọcBáchkhoa–Đạihọc ĐàNẵng
CHƯƠNG
CHƯƠNG
1
1
18/02/2009
L
L
ậ
ậ
p Tr
p Tr
ì
ì
nh Hư
nh Hư
ớ
ớ
ng Đ
ng Đ
ố
ố
i Tư
i Tư
ợ
ợ
ng
ng
(Object
(Object
-
-
oriented Programming)
oriented Programming)
Mụctiêu
Giớithiệunhững khái niệmcơ bảntronglập
trình hướng đốitượng
Nộidung
Trừutượng hóa, đốitượng, lớp
Thuộctínhvàphương thức
Thông điệpvàtruyền thông điệp
Tính bao gói, tính kế thừa, tính đahình
18/02/2009
Kh
Kh
á
á
i
i
Ni
Ni
ệ
ệ
m
m
Lậptrìnhhướng đốitượng (OOP- Object-
Oriented Programming)
mộtcáchtư duy mới, tiếpcậnhướng đốitượng để
giải quyếtvấn đề bằng máy tính.
mộtphương pháp thiếtkế và phát triểnphầnmềm
dựatrênkiếntrúclớpvàđốitượng.
Quá trình tiếnhóacủa OOP
1. Lậptrìnhtuyến tính
2. Lập trình có cấutrúc
3. Sự trừutượng hóa dữ liệu
4. Lậptrìnhhướng đốitượng
18/02/2009
L
L
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
không
không
c
c
ó
ó
c
c
ấ
ấ
u
u
tr
tr
ú
ú
c
c
(non
(non
-
-
structured programming)
structured programming)
Là phương pháp xuấthiện đầutiên
các ngôn ngữ như Assembly, Basic
sử dụng các biếntổng thể
lạmdụng lệnh GOTO
Các nhược điểm
khó hiểu, khó bảo trì, hầunhư không thể sử dụng lại
chấtlượng kém
chi phí cao
không thể phát triển các ứng dụng lớn
2
18/02/2009
L
L
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
không
không
c
c
ó
ó
c
c
ấ
ấ
u
u
tr
tr
ú
ú
c
c
(non
(non
-
-
structured programming)
structured programming)
Đoạn trình trên khó theo dõi, khó hiểu, dễ gây lỗi,
khó sửa đổi.
10 k=1
20 gosub 100
30 if y > 120 goto 60
40 k = k + 1
50 goto 20
60 print k, y
70 stop
100 y = 3*k*k + 7*k - 3
110 return
Lệnh nhảy đếnvị trí bất
kỳ trong chương trình
18/02/2009
L
L
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
c
c
ó
ó
c
c
ấ
ấ
u
u
tr
tr
ú
ú
c/l
c/l
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
th
th
ủ
ủ
t
t
ụ
ụ
c
c
(structured/procedural programming)
(structured/procedural programming)
sử dụng các lệnh có cấu trúc: for, do while, if
then else
các ngôn ngữ: Pascal, C,
chương trình là tập các hàm/thủ tục
Mã chương trình tập trung thể hiệnthuật toán:
làm như thế nào.
Ưu điểm
chương trình đượccụcbộ hóa, do đódễ hiểu, dễ bảo
trì hơn
dễ dàng tạoracácthư việnphầnmềm
18/02/2009
V
V
í
í
d
d
ụ
ụ
int func(int j)
{
return (3*j*j + 7*j-3);
}
int main()
{
int k = 1
while (func(k) < 120)
k++;
printf("%d\t%d\n", k, func(k));
return(0);
}
18/02/2009
L
L
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
c
c
ó
ó
c
c
ấ
ấ
u
u
tr
tr
ú
ú
c/l
c/l
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
th
th
ủ
ủ
t
t
ụ
ụ
c
c
Nhược điểm
dữ liệuvàmãxử lý là tách rời
dữ liệuthụđộng, xử lý chủđộng
khó đảmbảo tính đúng đắncủadữ liệu
không tựđộng khởitạo hay giải phóng dữ liệu động
không đảmbảo được tính nhất quán và các ràng
buộccủadữ liệu
khó cấmmãứng dụng sửadữ liệucủathư viện
khó bảo trì code
phầnxử lý có thể nằmrảirác
ngườilập trình phảibiếtcấutrúcdữ liệu(vấn đề này
mộtthờigiandàiđược coi là hiểnnhiên)
khi thay đổicấutrúcdữ liệuthìmãxử lý (thuật toán)
phảithayđổitheo
3
18/02/2009
V
V
í
í
d
d
ụ
ụ
struct Date
{
int day;
int month;
int year;
};
void setDate(Date& date, int newDay, int newMonth,
int newYear)
{
date.day = newDay;
…
}
…
Chuyệngìxảyranếucácđốisố
newDay, newMonth, newYear
tạo thành ngày tháng năm không hợplệ?
18/02/2009
T
T
ạ
ạ
i
i
sao
sao
ph
ph
ả
ả
i
i
thay
thay
đ
đ
ổ
ổ
i
i
c
c
ấ
ấ
u
u
tr
tr
ú
ú
c
c
d
d
ữ
ữ
li
li
ệ
ệ
u
u
?
?
Cấutrúcdữ liệulàmôhìnhcủa bài toán cầngiải
quyết
Do thiếukiếnthứcvề bài toán, về miền ứng dụng ,
không phải lúc nào cũng tạo đượccấutrúcdữ liệu
hoàn thiện ngay từđầu.
Tạoramộtcấutrúcdữ liệuhợp lý luôn là vấn đề đau
đầucủangườilập trình.
Bản thân bài toán cũng không bấtbiến
Cầnphải thay đổicấutrúcdữ liệu để phù hợpvớicác
yêu cầuthayđổi.
18/02/2009
C
C
á
á
c
c
v
v
ấ
ấ
n
n
đ
đ
ề
ề
Thay đổicấutrúc
dẫn đếnviệcsửalạimãchương trình (thuật toán)
tương ứng và làm chi phí phát triểntăng cao.
không tái sử dụng đượccácmãxử lý ứng vớicấu
trúc dữ liệucũ.
Đảmbảo tính đúng đắncủadữ liệu
một trong những nguyên nhân chính gây ra lỗiphần
mềm là gán các dữ liệu không hợplệ
cầnphảikiểm tra tính đúng đắncủadữ liệumỗikhi
thay đổigiátrị
18/02/2009
V
V
í
í
d
d
ụ
ụ
:
:
MyDate
MyDate
struct Date {
int year, month, day;
};
Date d;
d.day = 32; // invalid day
d.day = 31; d.month = 2; // how to check
d.day = d.day + 1; //
4
18/02/2009
V
V
í
í
d
d
ụ
ụ
:
:
MyDate
MyDate
(2)
(2)
Thay đổicấutrúcdữ liệu:
struct Date {
short year;
short mon_n_day;
};
18/02/2009
Gi
Gi
ả
ả
i
i
ph
ph
á
á
p
p
Che dấudữ liệu(chedấucấutrúc)
Truy cậpdữ liệu thông qua giao diệnxácđịnh
class MyDate {
private int year, mon, day;
public int getDay() { }
public boolean setDay(int) { }
};
18/02/2009
S
S
ử
ử
d
d
ụ
ụ
ng
ng
giao
giao
di
di
ệ
ệ
n
n
MyDate d;;
d.day = 30; // compile error
d.setDay(31);
d.setMonth(2); // should return False
18/02/2009
T
T
ạ
ạ
i
i
Sao
Sao
Ti
Ti
ế
ế
p
p
C
C
ậ
ậ
n
n
Hư
Hư
ớ
ớ
ng
ng
Đ
Đ
ố
ố
i
i
Tư
Tư
ợ
ợ
ng
ng
?
?
Loại bỏ những thiếu sót của tiếp cận theo thủ
tục
Trong OOP
Dữ liệu được xem như một phần tử chính yếu và
được bảo vệ
Hàm gắnkết với dữ liệu, thao tác trên dữ liệu
Phân tách bài toán thành nhiều thực thể (đối tượng)
Æ xây dựng dữ liệu + hàm cho các đối tượng này.
Tăng cường khả năng sử dụng lại
5
18/02/2009
Đ
Đ
ặ
ặ
c Đi
c Đi
ể
ể
m Quan Tr
m Quan Tr
ọ
ọ
ng
ng
Nhấn mạnh trên dữ liệu hơn là thủ tục
Các chương trình được chia thành các đối
tượng
Dữ liệu được che giấu và không thể được
truy xuất từ các hàm bên ngoài
Các đối tượng có thể giao tiếp với nhau
thông qua các hàm
Dữ liệu hay các hàm mới có thể được
thêm vào khi cần
Theo tiếp cận từ dưới lên
18/02/2009
Thu
Thu
ậ
ậ
n L
n L
ợ
ợ
i
i
So với các tiếp cận cổ điển thì OOP có
những thuận lợi sau:
OOP cung cấp một cấu trúc module rõ ràng
Giao diện được định nghĩa tốt
Những chi tiết cài đặt được ẩn
OOP giúp lập trình viên duy trì mã và sửa đổi mã tồn
tại dễ dàng (các đối tượng được tạo ra với những
khác nhau nhỏ so với những đối tượng tồn tại).
OOP cung cấp một framework tốt với các thư viện mã
mà các thành phần có thể được chọn và sửa đổi bởi
lập trình viên.
18/02/2009
L
L
ị
ị
ch
ch
s
s
ử
ử
OOP
OOP
Các ngôn ngữ lậptrìnhhướng đốitượng không
mới
Simula (1967) là ngôn ngữđầu tiên, có lớp, thừakế,
liên kết động (hay còn gọi là hàm ảo)
Nhưng các ngôn ngữ hướng đốitượng chậm
hơn các ngôn ngữ thờikỳđầu
nên chúng chỉđược dùng rộng rãi khi máy tính bắt
đầuchạy nhanh (khoảng thờigianchiếc máy Pentium
đầutiênrađời)
Lưuý rằng biên dịch các chương trình hướng đối
tượng cũng chậm
18/02/2009
L
L
ị
ị
ch
ch
s
s
ử
ử
OOP
OOP
Mộtsố hệ thống “hướng đốitượng” thờikỳđầu không
có các lớp
chỉ có các “đốitượng” và các “thông điệp” (v.d. Hypertalk)
Hiệngiờ, đãcósự thống nhấtrằng hướng đốitượng là:
lớp-class
thừakế - inheritance và liên kết động - dynamic binding
Mộtsốđặc tính củalậptrìnhhướng đốitượng có thể
đượcthựchiệnbằng C hoặc các ngôn ngữ lậptrìnhthủ
tục khác.
Điểm khác biệtsự hỗ trợ và ép buộc ba khái niệmtrên
đượccàihẳn vào trong ngôn ngữ.
Mức độ hướng đốitượng của các ngôn ngữ không
giống nhau
Eiffel (tuyệt đối), Java (rất cao), C++ (nửanọ nửakia)
6
18/02/2009
L
L
ị
ị
ch
ch
s
s
ử
ử
ngôn
ngôn
ng
ng
ữ
ữ
l
l
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
FORTRAN I
FORTRAN II
ALGOL 60
LISP
ALGOL 58
CPL
COBOL
COMTRAN
FLOW-MATIC
PROLOG
ADA
PASCAL
SIMULA 67
SIMULA I
PL/1
BASIC
FORTRAN IV
B
BCPL
ALGOL 68
SMALLTALK 80
EIFFEL
C++
C
BETA
JAVA
1957
1960
1965
1970
1975
1980
1985
1990
1995
MODULA 2
MODULA 3OBERON
C# 2000
18/02/2009
Tr
Tr
ừ
ừ
u
u
Tư
Tư
ợ
ợ
ng
ng
H
H
ó
ó
a
a
(Abstraction)
(Abstraction)
Trừutượng hóa
Phân biệt cầnthiết với chi tiết
Giao diện–Càiđặt
Cái gì – Thế nào
Phân tích – Thiếtkế
Các kỹ thuậttrừutượng
Đóng gói (encapsulation)
Ẩn thông tin (information hiding)
Thừakế (inheritance)
Đahình(polymorphism)
18/02/2009
Đ
Đ
ố
ố
i Tư
i Tư
ợ
ợ
ng
ng
(Object)
(Object)
Đối tượng là
chìa khóa để hiểu
đượckỹ thuật
hướng đốitượng
Trong hệ thống
hướng đốitượng,
mọithứđềulàđối
tượng
Viếtmộtchương trình hướng đốitượng nghĩalàđang xây dựng
mộtmôhìnhcủamộtvàibộ phậntrongthế giớithực
18/02/2009
Đ
Đ
ố
ố
i
i
Tư
Tư
ợ
ợ
ng
ng
Th
Th
ế
ế
Gi
Gi
ớ
ớ
i
i
Th
Th
ự
ự
c
c
(Real Object)
(Real Object)
Một đốitượng thế giớithực là mộtthực
thể cụ thể mà thông thường bạncóthể sờ,
nhìn thấy hay cảmnhận được.
Tấtcả có
trạng thái
(state) và
hành động
(behaviour)
7
18/02/2009
Đ
Đ
ố
ố
i
i
Tư
Tư
ợ
ợ
ng
ng
Ph
Ph
ầ
ầ
n
n
M
M
ề
ề
m
m
(Software Object)
(Software Object)
Các đốitượng phầnmềm có thểđược
dùng để biểudiễn các đốitượng thế giới
thực.
Cũng có trạng thái và
hành động
Trạng thái: thuộc tính
(attribute; property)
Hành động: phương thức
(method)
18/02/2009
Đ
Đ
ố
ố
i
i
Tư
Tư
ợ
ợ
ng
ng
Đốitượng (object) là một
thựcthể phầnmềm bao
bọccácthuộctínhvà
các phương thức liên
quan.
Đốitượng phầnmềm Đốitượng phầnmềm Xe Đạp
Thuộc tính đượcxácđịnh
bởigiátrị cụ thể gọilà
thuộctínhthể hiện.
Một đốitượng cụ thể
đượcgọilàmột thể hiện.
18/02/2009
L
L
ớ
ớ
p
p
(Class)
(Class)
Trong thế giớithực có nhiều đốitượng cùng loại.
Chương trình hướng đốitượng có nhiều đối
tượng cùng loạichiasẻ những đặc điểm chung.
Ví dụ
18/02/2009
L
L
ớ
ớ
p
p
(Class)
(Class)
Một lớp là mộtthiếtkế (blueprint) hay mẫu (prototype)
cho các đốitượng cùng kiểu
Ví dụ:lớp XeDap là mộtthiếtkế chung cho nhiều đốitượng xe
đạp đượctạora
Lớp định nghĩacácthuộctínhvàcácphương thức chung
cho tấtcả các đốitượng của cùng mộtloại nào đó
Một đốitượng là một thể hiện cụ thể củamộtlớp.
Ví dụ: mỗi đốitượng xe đạplàmộtthể hiệncủalớp XeDap
Mỗithể hiệncóthể có những thuộc tính thể hiện khác
nhau
Ví dụ: mộtxeđạpcóthểđang ở bánh răng thứ 5 trong khi mộtxe
khác có thể là đang ở bánh răng thứ 3.
8
18/02/2009
Đ
Đ
ố
ố
i
i
tư
tư
ợ
ợ
ng
ng
(Object)
(Object)
Đốitượng có
định danh
thuộc tính (dữ liệu)
hành vi (phương thức)
Mỗi đốitượng bấtkểđang ở trạng thái nào đềucó
định danh và được đốixử như mộtthựcthể riêng
biệt.
mỗi đốitượng có một handle (trong C++ là địa
chỉ)
hai đốitượng có thể có giá trị giống nhau nhưng
handle khác nhau
18/02/2009
V
V
í
í
D
D
ụ
ụ
L
L
ớ
ớ
p
p
Xe
Xe
Đ
Đ
ạ
ạ
p
p
Khai báo cho lớp
XeDap
Đốitượng củalớp
XeDap
18/02/2009
Thu
Thu
ộ
ộ
c
c
T
T
í
í
nh
nh
L
L
ớ
ớ
p
p
&
&
Phương
Phương
Th
Th
ứ
ứ
c
c
L
L
ớ
ớ
p
p
18/02/2009
Thu
Thu
ộ
ộ
c
c
T
T
í
í
nh
nh
L
L
ớ
ớ
p
p
&
&
Phương
Phương
Th
Th
ứ
ứ
c
c
L
L
ớ
ớ
p
p
Thuộctínhlớp (class attribute) là mộthạng mụcdữ
liệu liên kếtvớimộtlớpcụ thể mà không liên kếtvới
các thể hiệncủalớp. Nó được định nghĩa bên trong
định nghĩalớpvàđượcchiasẻ bởitấtcả các thể hiện
củalớp.
Phương thứclớp (class method) là mộtphương
thức đượctriệugọi mà không tham khảotớibấtkỳ
một đốitượng nào. Tấtcả các phương thứclớp ảnh
hưởng đếntoànbộ lớpchứ không ảnh hưởng đến
mộtlớp riêng rẽ nào.
9
18/02/2009
Thu
Thu
ộ
ộ
c
c
T
T
í
í
nh
nh
&
&
Phương
Phương
Th
Th
ứ
ứ
c
c
Thuộctính(attribute) là dữ liệu trình bày
các đặc điểmvề một đốitượng.
Phương thức (method) cóliênquantới
những thứ mà đốitượng có thể làm. Một
phương thức đáp ứng mộtchứcnăng tác
động lên dữ liệucủa đốitượng (thuộc
tính).
18/02/2009
Thông
Thông
Đi
Đi
ệ
ệ
p
p
&
&
Truy
Truy
ề
ề
n
n
Thông
Thông
Đi
Đi
ệ
ệ
p
p
Thông điệp (message) là mộtlờiyêucầu
mộthoạt động. Gồmcó:
Đốitượng nhận thông điệp
Tên củaphương thứcthựchiện
Các tham số mà phương thứccần
Truyền thông điệp: một đốitượng triệu
gọimột hay nhiềuphương thứccủa đối
tượng khác để yêu cầuthôngtin.
18/02/2009
T
T
í
í
nh
nh
Bao
Bao
G
G
ó
ó
i
i
(Encapsulation)
(Encapsulation)
Đóng gói (encapsulation) là tiếntrìnhche
giấuviệcthựcthichi tiếtcủamột đối
tượng.
18/02/2009
Ẩ
Ẩ
n
n
Thông
Thông
Tin
Tin
(Information Hiding)
(Information Hiding)
Đóng gói Æ Thuộctínhđượclưutrữ
hay phương thức đượccàiđặtnhư thế
nào Æ đượcchegiấu đitừ các đối
tượng khác
Việc che giấunhững chi
tiếtthiếtkế và cài đặttừ
những đốitượng khác
đượcgọilàẩn thông tin
10
18/02/2009
T
T
í
í
nh
nh
Th
Th
ừ
ừ
a
a
K
K
ế
ế
(Inheritance)
(Inheritance)
Hệ thống hướng đốitượng cho phép các
lớp được định nghĩakế thừatừ các lớp
khác
Ví dụ, lớp xe đạpleonúivà xe đạp đua là
những lớp con (subclass) củalớp xe đạp.
Thừakế nghĩalàcácphương thứcvàcác
thuộctínhđược định nghĩa trong mộtlớp
có thểđượcthừakế hoặc đượcsử dụng
lạibởilớp khác.
18/02/2009
T
T
í
í
nh
nh
Th
Th
ừ
ừ
a
a
K
K
ế
ế
(Inheritance)
(Inheritance)
cho phép các phần
mềmsử dụng quan hệ
“là”
giúp ta thiếtkế các
dịch vụ tổng quát rồi
chuyên môn hóa
chúng
18/02/2009
T
T
í
í
nh
nh
Đa
Đa
H
H
ì
ì
nh
nh
(Polymorphism)
(Polymorphism)
Đahình: “nhiềuhìnhthức”, hành động
cùngtêncóthểđượcthựchiện khác nhau
đốivớicácđốitượng/các lớp khác nhau.
Ngữ cảnh khác Æ kếtquả khác
Đường Thẳng Hình TrònĐiểm Hình Vuông
Vẽ
18/02/2009
T
T
í
í
nh
nh
Đa
Đa
H
H
ì
ì
nh
nh
(Polymorphism)
(Polymorphism)
Đa hình hàm - Functional polymorphism
cơ chế cho phép một tên thao tác hoặcthuộctínhcóthểđược
định nghĩatạinhiềulớpvàcóthể có nhiềucàiđặt khác nhau tại
mỗilớptrongcáclớp đó
v.d. lớp Date cài 2 phương thức setDate(),mộtnhận tham số là một
đốitượng Date, phương thứckianhận 3 tham số day, month, year.
Đahìnhđốitượng - Object polymorphism
các đốitượng thuộccáclớp khác nhau có khả năng hiểucùngmột
thông điệp theo các cách khác nhau
vd. khi nhận được cùng một thông điệp draw(), các đốitượng
Rectangle và Triangle hiểuvàthựchiện các thao tác khác nhau