You are on page 1of 10

Lập Trình Hướng Đối Tượng

(Object-oriented Programming)
LẬP TRÌNH HƯỚ
HƯỚNG ĐỐ
ĐỐI TƯỢ
TƯỢNG „ Mục tiêu

C++
… Giới thiệu những khái niệm cơ bản trong lập
trình hướng đối tượng
„ Nội dung
… Trừu tượng hóa, đối tượng, lớp
Bộ môn Công nghệ phần mềm
Khoa Công Nghệ Thông Tin … Thuộc tính và phương thức
Đại Học Bách khoa – Đại học Đà Nẵng CHƯƠNG … Thông điệp và truyền thông điệp

1 … Tính bao gói, tính kế thừa, tính đa hình

18/02/2009

Lập trình không có cấu trúc


Khái Niệm (non-
(non-structured programming)
„ Lập trình hướng đối tượng (OOP- Object-
Oriented Programming) „ Là phương pháp xuất hiện đầu tiên
… một cách tư duy mới, tiếp cận hướng đối tượng để … các ngôn ngữ như Assembly, Basic
giải quyết vấn đề bằng máy tính. … sử dụng các biến tổng thể
… một phương pháp thiết kế và phát triển phần mềm … lạm dụng lệnh GOTO
dựa trên kiến trúc lớp và đối tượng.
„ Các nhược điểm
„ Quá trình tiến hóa của OOP
… khó hiểu, khó bảo trì, hầu như không thể sử dụng lại
1. Lập trình tuyến tính
… chất lượng kém
2. Lập trình có cấu trúc
3. Sự trừu tượng hóa dữ liệu … chi phí cao

4. Lập trình hướng đối tượng … không thể phát triển các ứng dụng lớn

18/02/2009 18/02/2009

1
Lập trình không có cấu trúc Lập trì
trình có cấu trú
trúc/lập trì
trình thủ tục
(non-
(non-structured programming) (structured/procedural programming)
10 k=1 „ sử dụng các lệnh có cấu trúc: for, do while, if
20 gosub 100
30 if y > 120 goto 60 Lệnh nhảy đến vị trí bất then else...
kỳ trong chương trình
40 k=k+1 „ các ngôn ngữ: Pascal, C, ...
50 goto 20
60 print k, y „ chương trình là tập các hàm/thủ tục
70 stop
100 y = 3*k*k + 7*k - 3 „ Mã chương trình tập trung thể hiện thuật toán:
110 return
làm như thế nào.
„ Đoạn trình trên khó theo dõi, khó hiểu, dễ gây lỗi, „ Ưu điểm
khó sửa đổi. … chương trình được cục bộ hóa, do đó dễ hiểu, dễ bảo
trì hơn
… dễ dàng tạo ra các thư viện phần mềm
18/02/2009 18/02/2009

Lập trì
trình có cấu trú
trúc/lậ
c/lập trì
trình thủ
thủ tục
Ví dụ
int func(int j) „ Nhược điểm
{ … dữ liệu và mã xử lý là tách rời
return (3*j*j + 7*j-3); … dữ liệu thụ động, xử lý chủ động
} … khó đảm bảo tính đúng đắn của dữ liệu
int main() … không tự động khởi tạo hay giải phóng dữ liệu động
{ … không đảm bảo được tính nhất quán và các ràng
int k = 1 buộc của dữ liệu
while (func(k) < 120) … khó cấm mã ứng dụng sửa dữ liệu của thư viện
k++; … khó bảo trì code
printf("%d\t%d\n", k, func(k)); „ phần xử lý có thể nằm rải rác
return(0); „ người lập trình phải biết cấu trúc dữ liệu (vấn đề này
một thời gian dài được coi là hiển nhiên)
}
„ khi thay đổi cấu trúc dữ liệu thì mã xử lý (thuật toán)
phải thay đổi theo
18/02/2009 18/02/2009

2
Ví dụ Tại sao phả
phải thay đổi cấu trú
trúc dữ liệ
liệu?
struct Date
{ „ Cấu trúc dữ liệu là mô hình của bài toán cần giải
int day;
int month;
quyết
int year; … Do thiếu kiến thức về bài toán, về miền ứng dụng...,
}; không phải lúc nào cũng tạo được cấu trúc dữ liệu
void setDate(Date& date, int newDay, int newMonth, hoàn thiện ngay từ đầu.
int newYear) … Tạo ra một cấu trúc dữ liệu hợp lý luôn là vấn đề đau
{ Chuyện gì xảy ra nếu các đối số
đầu của người lập trình.
date.day = newDay; newDay, newMonth, newYear „ Bản thân bài toán cũng không bất biến
… tạo thành ngày tháng năm không hợp lệ?
… Cần phải thay đổi cấu trúc dữ liệu để phù hợp với các
}
… yêu cầu thay đổi.

18/02/2009 18/02/2009

Các vấn đề Ví dụ: MyDate


„ Thay đổi cấu trúc struct Date {
int year, month, day;
… dẫn đến việc sửa lại mã chương trình (thuật toán)
tương ứng và làm chi phí phát triển tăng cao. };
… không tái sử dụng được các mã xử lý ứng với cấu
trúc dữ liệu cũ. Date d;
d.day = 32; // invalid day
„ Đảm bảo tính đúng đắn của dữ liệu
d.day = 31; d.month = 2; // how to check
… một trong những nguyên nhân chính gây ra lỗi phần d.day = d.day + 1; //
mềm là gán các dữ liệu không hợp lệ
… cần phải kiểm tra tính đúng đắn của dữ liệu mỗi khi
thay đổi giá trị
18/02/2009 18/02/2009

3
Ví dụ: MyDate (2) Giải pháp
Thay đổi cấu trúc dữ liệu: „ Che dấu dữ liệu (che dấu cấu trúc)
„ Truy cập dữ liệu thông qua giao diện xác định

struct Date { class MyDate {


short year;
private int year, mon, day;
short mon_n_day;
}; public int getDay() {...}
public boolean setDay(int) {...}
...
};
18/02/2009 18/02/2009

Tại Sao
Sử dụng giao diện
Tiếp Cận Hướng Đối Tượng?
„ Loại bỏ những thiếu sót của tiếp cận theo thủ
tục
MyDate d;; „ Trong OOP
... … Dữ liệu được xem như một phần tử chính yếu và
d.day = 30; // compile error được bảo vệ
d.setDay(31); … Hàm gắn kế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)
d.setMonth(2); // should return False
Æ 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

18/02/2009 18/02/2009

4
Đặc Điểm Quan Trọng
Thuận Lợi
„ Nhấn mạnh trên dữ liệu hơn là thủ tục
„ So với các tiếp cận cổ điển thì OOP có
„ Các chương trình được chia thành các đối những thuận lợi sau:
tượng … OOP cung cấp một cấu trúc module rõ ràng
„ Dữ liệu được che giấu và không thể được Giao diện được định nghĩa tốt
„
truy xuất từ các hàm bên ngoài Những chi tiết cài đặt được ẩn
„

„ Các đối tượng có thể giao tiếp với nhau … 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
thông qua các hàm khác nhau nhỏ so với những đối tượng tồn tại).
„ Dữ liệu hay các hàm mới có thể được … OOP cung cấp một framework tốt với các thư viện mã
thêm vào khi cần mà các thành phần có thể được chọn và sửa đổi bởi
lập trình viên.
„ Theo tiếp cận từ dưới lên
18/02/2009 18/02/2009

Lịch sử OOP Lịch sử OOP


„ Một số hệ thống “hướng đối tượng” thời kỳ đầu không
„ Các ngôn ngữ lập trình hướng đối tượng không có các lớp
mới … chỉ có các “đối tượng” và các “thông điệp” (v.d. Hypertalk)
… Simula (1967) là ngôn ngữ đầu tiên, có lớp, thừa kế, „ Hiện giờ, đã có sự thống nhất rằng hướng đối tượng là:
liên kết động (hay còn gọi là hàm ảo) … lớp - class
„ Nhưng các ngôn ngữ hướng đối tượng chậm … thừa kế - inheritance và liên kết động - dynamic binding
„ Một số đặc tính của lập trình hướng đối tượng có thể
hơn các ngôn ngữ thời kỳ đầu được thực hiện bằng C hoặc các ngôn ngữ lập trình thủ
… nên chúng chỉ được dùng rộng rãi khi máy tính bắt tục khác.
đầu chạy nhanh (khoảng thời gian chiếc máy Pentium „ Điểm khác biệt sự hỗ trợ và ép buộc ba khái niệm trên
đầu tiên ra đời) được cài hẳn vào trong ngôn ngữ.
… Lưu ý rằng biên dịch các chương trình hướng đối „ Mức độ hướng đối tượng của các ngôn ngữ không
tượng cũng chậm giống nhau
… Eiffel (tuyệt đối), Java (rất cao), C++ (nửa nọ nửa kia)
18/02/2009 18/02/2009

5
Lịch sử ngôn ngữ lập trình Trừu Tượng Hóa
FORTRAN I FLOW-MATIC
(Abstraction)
ALGOL 58 COMTRAN 1957
FORTRAN II
COBOL LISP 1960
ALGOL 60

BASIC
FORTRAN IV CPL

1965
„ Trừu tượng hóa
SIMULA I
SIMULA 67 PL/1 BCPL … Phân biệt cần thiết với chi tiết
ALGOL 68 B
PROLOG
1970 „ Giao diện – Cài đặt
PASCAL C
„ Cái gì – Thế nào
1975
„ Phân tích – Thiết kế

ADA
MODULA 2 SMALLTALK 80 1980
„ Các kỹ thuật trừu tượng
OBERON MODULA 3 BETA C++ 1985 … Đóng gói (encapsulation)
… Ẩn thông tin (information hiding)
EIFFEL
1990

JAVA 1995
… Thừa kế (inheritance)
C# 2000 … Đa hình (polymorphism)
18/02/2009 18/02/2009

Đối Tượng (Object) Đối Tượng Thế Giới Thực


(Real Object)
„ Đối tượng là
chìa khóa để hiểu „ Một đối tượng thế giới thực là một thực
được kỹ thuật thể cụ thể mà thông thường bạn có thể sờ,
hướng đối tượng nhìn thấy hay cảm nhận được.
„ Trong hệ thống
hướng đối tượng, „ Tất cả có
mọi thứ đều là đối trạng thái
tượng (state) và
Viết một chương trình hướng đối tượng nghĩa là đang xây dựng
hành động
một mô hình của một vài bộ phận trong thế giới thực (behaviour)
18/02/2009 18/02/2009

6
Đối Tượng Phần Mềm
Đối Tượng
(Software Object)
„ Các đối tượng phần mềm có thể được
dùng để biểu diễn các đối tượng thế giới
thực.
„ Cũng có trạng thái và Đối tượng phần mềm Đối tượng phần mềm Xe Đạp
hành động
… Trạng thái: thuộc tính Đối tượng (object) là một Thuộc tính được xác định
thực thể phần mềm bao bởi giá trị cụ thể gọi là
(attribute; property) bọc các thuộc tính và thuộc tính thể hiện.
… Hành động: phương thức các phương thức liên Một đối tượng cụ thể
quan. được gọi là một thể hiện.
(method)
18/02/2009 18/02/2009

Lớp (Class) Lớp (Class)


„ Trong thế giới thực có nhiều đối tượng cùng loại. „ Một lớp là một thiết kế (blueprint) hay mẫu (prototype)
„ Chương trình hướng đối tượng có nhiều đối cho các đối tượng cùng kiểu
tượng cùng loại chia sẻ những đặc điểm chung. … Ví dụ: lớp XeDap là một thiết kế chung cho nhiều đối tượng xe
đạp được tạo ra
„ Ví dụ „ Lớp định nghĩa các thuộc tính và các phương thức chung
cho tất cả các đối tượng của cùng một loại nào đó
„ Một đối tượng là một thể hiện cụ thể của một lớp.
… Ví dụ: mỗi đối tượng xe đạp là một thể hiện của lớp XeDap
„ Mỗi thể hiện có thể có những thuộc tính thể hiện khác
nhau
… Ví dụ: một xe đạp có thể đang ở bánh răng thứ 5 trong khi một xe
khác có thể là đang ở bánh răng thứ 3.

18/02/2009 18/02/2009

7
Đối tượng (Object) Ví Dụ Lớp Xe Đạp
Khai báo cho lớp
„ Đối tượng có XeDap
… định danh
Đối tượng của lớp
… thuộc tính (dữ liệu)
XeDap
… hành vi (phương thức)
„ Mỗi đối tượng bất kể đang ở trạng thái nào đều có
định danh và được đối xử như một thực thể riêng
biệt.
… mỗi đối tượng có một handle (trong C++ là địa
chỉ)
… hai đối tượng có thể có giá trị giống nhau nhưng
handle khác nhau
18/02/2009 18/02/2009

Thuộc Tính Lớp Thuộc Tính Lớp


& Phương Thức Lớp & Phương Thức Lớp
… Thuộc tính lớp (class attribute) là một hạng mục dữ
liệu liên kết với một lớp cụ thể mà không liên kết với
các thể hiện của lớp. Nó được định nghĩa bên trong
định nghĩa lớp và được chia sẻ bởi tất cả các thể hiện
của lớp.
… Phương thức lớp (class method) là một phương
thức được triệu gọi mà không tham khảo tới bất kỳ
một đối tượng nào. Tất cả các phương thức lớp ảnh
hưởng đến toàn bộ lớp chứ không ảnh hưởng đến
một lớp riêng rẽ nào.

18/02/2009 18/02/2009

8
Thuộc Tính Thông Điệp
& Phương Thức & Truyền Thông Điệp
„ Thuộc tính (attribute) là dữ liệu trình bày „ Thông điệp (message) là một lời yêu cầu
các đặc điểm về một đối tượng. một hoạt động. Gồm có:
… Đốitượng nhận thông điệp
„ Phương thức (method) có liên quan tới
… Tên của phương thức thực hiện
những thứ mà đối tượng có thể làm. Một
… Các tham số mà phương thức cần
phương thức đáp ứng một chức năng tác
động lên dữ liệu của đối tượng (thuộc „ Truyền thông điệp: một đối tượng triệu
gọi một hay nhiều phương thức của đối
tính). tượng khác để yêu cầu thông tin.

18/02/2009 18/02/2009

Tính Bao Gói Ẩn Thông Tin


(Encapsulation) (Information Hiding)
„ Đóng gói Æ Thuộc tính được lưu trữ
„ Đóng gói (encapsulation) là tiến trình che
hay phương thức được cài đặt như thế
giấu việc thực thi chi tiết của một đối
nào Æ được che giấu đi từ các đối
tượng.
tượng khác

Việc che giấu những chi


tiết thiết kế và cài đặt từ
những đối tượng khác
được gọi là ẩn thông tin

18/02/2009 18/02/2009

9
Tính Thừa Kế Tính Thừa Kế
(Inheritance) (Inheritance)
„ Hệ thống hướng đối tượng cho phép các „ cho phép các phần
lớp được định nghĩa kế thừa từ các lớp mềm sử dụng quan hệ
khác “là”
… Ví dụ, lớp xe đạp leo núi và xe đạp đua là
những lớp con (subclass) của lớp xe đạp. „ giúp ta thiết kế các

„ Thừa kế nghĩa là các phương thức và các dịch vụ tổng quát rồi
thuộc tính được định nghĩa trong một lớp chuyên môn hóa
có thể được thừa kế hoặc được sử dụng chúng
lại bởi lớp khác.
18/02/2009 18/02/2009

Tính Đa Hình Tính Đa Hình


(Polymorphism) (Polymorphism)
„ Đa hình: “nhiều hình thức”, hành động „ Đa hình hàm - Functional polymorphism
cùng tên có thể được thực hiện khác nhau … cơ chế cho phép một tên thao tác hoặc thuộc tính có thể được
đối với các đối tượng/các lớp khác nhau. định nghĩa tại nhiều lớp và có thể có nhiều cài đặt khác nhau tại
mỗi lớp trong các lớp đó
„ Ngữ cảnh khác Æ kết quả khác „ v.d. lớp Date cài 2 phương thức setDate(),một nhận tham số là một
đối tượng Date, phương thức kia nhận 3 tham số day, month, year.
Điểm Đường Thẳng Hình Tròn Hình Vuông
„ Đa hình đối tượng - Object polymorphism
… các đối tượng thuộc các lớp khác nhau có khả năng hiểu cùng một
Vẽ 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 đối tượng
Rectangle và Triangle hiểu và thực hiện các thao tác khác nhau

18/02/2009 18/02/2009

10

You might also like