LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGBộ môn Công nghệ phần mềm Khoa Công Nghệ Thông Tin Đại Học Bách khoa – Đại học Đà Nẵng CHƯƠNG 1 18/02/2009 Lập Trình Hướng Đối Tượng Object-oriented Programming
Trang 1LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bộ môn Công nghệ phần mềm
Khoa Công Nghệ Thông Tin
Đại Học Bách khoa – Đại học Đà Nẵng CHƯƠNG
1
18/02/2009
Lập Trình Hướng Đối Tượng (Object-oriented Programming)
Mục tiêu 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
Thuộc tính và phương thức
Thông điệp và truyền thông điệp
Tính bao gói, tính kế thừa, tính đa hình
18/02/2009
Khái Niệm
Lập trình hướng đối tượng (OOP-
Object-Oriented Programming)
một cách tư duy mới, tiếp cận hướng đối tượng để
giải quyết vấn đề bằng máy tính
một phương pháp thiết kế và phát triển phần mềm
dựa trên kiến trúc lớp và đối tượng
Quá trình tiến hóa của OOP
1. Lập trình tuyến tính
2. Lập trình có cấu trúc
3. Sự trừu tượng hóa dữ liệu
4. Lập trình hướng đối tượng
18/02/2009
Lập trình không có cấu trúc (non-structured programming)
Là phương pháp xuất hiện đầu tiên
các ngôn ngữ như Assembly, Basic
sử dụng các biến tổng thể lạm dụng lệnh GOTO
Các nhược điểm
khó hiểu, khó bảo trì, hầu như không thể sử dụng lại chất lượng kém
chi phí cao không thể phát triển các ứng dụng lớn
Trang 2Lập trình không có cấu trúc
(non-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 đến vị trí bất
kỳ trong chương trình
18/02/2009
L ậ p trình có c ấ u trúc/l ậ p trình th ủ t ụ c
(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ện thuật toán:
làm như thế nào.
Ưu điểm
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
Ví 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ập trình có cấu trúc/lập trình thủ tục
Nhược điểm
dữ liệu và mã xử lý là tách rời
dữ liệu thụ động, xử lý chủ động khó đảm bảo tính đúng đắn của dữ liệu 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 buộc của dữ liệu
khó cấm mã ứng dụng sửa dữ liệu của thư viện khó bảo trì code
phần xử lý có thể nằm rải rác
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
Trang 3Ví dụ
struct Date
{
int day;
int month;
int year;
};
void setDate(Date& date, int newDay, int newMonth,
int newYear) {
date.day = newDay;
…
}
…
Chuyện gì xảy ra nếu các đối số
newDay, newMonth, newYear
tạo thành ngày tháng năm không hợp lệ?
18/02/2009
Tại sao phải thay đổi cấu trúc dữ liệu?
Cấu trúc dữ liệu là mô hình của bài toán cần giải quyết
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 hoàn thiện ngay từ đầu
Tạo ra một cấu trúc dữ liệu hợp lý luôn là vấn đề đau đầu của người lập trình
Bản thân bài toán cũng không bất biến
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
Các vấn đề
Thay đổi cấu trúc
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ũ
Đảm bảo tính đúng đắn của dữ liệu
một trong những nguyên nhân chính gây ra lỗi phần
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
Ví dụ: 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; //
Trang 4Ví dụ: MyDate (2)
Thay đổi cấu trúc dữ liệu:
struct Date {
short year;
short mon_n_day;
};
18/02/2009
Giải pháp
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
class MyDate { private int year, mon, day;
public int getDay() { }
public boolean setDay(int) { }
};
18/02/2009
Sử dụng giao diện
MyDate d;;
d.day = 30; // compile error
d.setDay(31);
d.setMonth(2); // should return False
18/02/2009
Tại Sao 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
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ắ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)
Æ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
Trang 5Đặc Điểm Quan Trọ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ận Lợ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ịch sử OOP
Các ngôn ngữ lập trình hướng đối tượng không
mới
Simula (1967) là ngôn ngữ đầu tiên, có lớp, thừa kế,
liên kết động (hay còn gọi là hàm ảo)
Nhưng các ngôn ngữ hướng đối tượng chậm
hơn các ngôn ngữ thời kỳ đầu
nên chúng chỉ được dùng rộng rãi khi máy tính bắt
đầu chạy nhanh (khoảng thời gian chiếc máy Pentium
đầu tiên ra đờ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ịch sử OOP
Một số hệ thống “hướng đối tượng” thời kỳ đầu không
có các lớp
chỉ có các “đối tượng” và các “thông điệp” (v.d Hypertalk)
Hiện giờ, đã có sự thống nhất rằng hướng đối tượng là:
lớp - class
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ể được thực hiện bằng C hoặc các ngôn ngữ lập trình thủ tục khác
Điểm khác biệt sự hỗ trợ và ép buộc ba khái niệm trên được cài hẳn vào trong ngôn ngữ
Mức độ hướng đối tượng của các ngôn ngữ không giống nhau
Eiffel (tuyệt đối), Java (rất cao), C++ (nửa nọ nửa kia)
Trang 6Lịch sử ngôn ngữ lập trì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 3
OBERON
18/02/2009
Trừu Tượng Hóa (Abstraction)
Trừu tượng hóa Phân biệt cần thiết với chi tiết
Giao diện – Cài đặt
Cái gì – Thế nào
Phân tích – Thiết kế
Các kỹ thuật trừu tượng Đóng gói (encapsulation)
Ẩn thông tin (information hiding)
Thừa kế (inheritance)
Đa hình (polymorphism)
18/02/2009
Đối Tượng (Object)
Đối tượng là
chìa khóa để hiểu
được kỹ thuật
hướng đối tượng
Trong hệ thống
hướng đối tượng,
mọi thứ đều là đối
tượng
Viết một chương trình hướng đối tượng nghĩa là đang xây dựng
một mô hình của một vài bộ phận trong thế giới thực
18/02/2009
Đối Tượng Thế Giới Thực
(Real Object)
Một đối tượng thế giới thực là một thực thể cụ thể mà thông thường bạn có thể sờ ,
Tất cả có trạng thái (state) và hành động (behaviour)
Trang 7Đối Tượng Phần Mềm
(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à
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 tượng (object) là một thực thể phần mềm bao bọc cácthuộc tínhvà cácphương thứcliên quan
Đối tượng phần mềm Đối tượng phần mềmXe Đạp
Thuộc tính được xác định bởi giá trị cụ thể gọi là
thuộc tính thể hiện Một đối tượng cụ thể được gọi là mộtthể hiện
18/02/2009
Lớp (Class)
Trong thế giới thực có nhiều đối tượng cùng loại.
Chương trình hướng đối tượng có nhiều đối
tượng cùng loại chia sẻ những đặc điểm chung.
Ví dụ
18/02/2009
Lớp (Class)
Mộtlớplà một thiết kế (blueprint) hay mẫu (prototype) cho các đối tượng cùng kiểu
Ví dụ: lớp XeDap là một thiết kế chung cho nhiều đối tượng xe đạp được tạo ra
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ộtthể hiệncụ 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
Trang 8Đối tượng (Object)
Đối tượng có
định danh
thuộc tính (dữ liệu)
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 danhvà đượ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
Ví Dụ Lớp Xe Đạp
Khai báo cho lớp XeDap
Đối tượng của lớp XeDap
18/02/2009
Thuộc Tính Lớp
& Phương Thức Lớp
18/02/2009
Thuộc Tính 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
Trang 9Thuộc Tính
& Phương Thức
Thuộc tính (attribute) là dữ liệu trình bày
các đặc điểm về một đối tượng
Phương thức (method) có liên quan tới
những thứ mà đối tượng có thể làm Một
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
tính).
18/02/2009
Thông Điệp
& Truyền Thông Điệp
Thông điệp (message) là một lời yêu cầu một hoạt động Gồm có:
Đối tượng nhận thông điệp
Tên của phương thức thực hiện
Các tham số mà phương thức cần
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ượng khác để yêu cầu thông tin.
18/02/2009
Tính Bao Gói (Encapsulation)
Đóng gói (encapsulation) là tiến trình che
giấu việc thực thi chi tiết của một đối
tượng
18/02/2009
Ẩn Thông Tin (Information Hiding)
hay phương thức được cài đặt như thế nào Æ được che giấu đi từ các đối 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
Trang 10Tính Thừa Kế (Inheritance)
Hệ thống hướng đối tượng cho phép các
lớp được định nghĩa kế thừa từ các lớp
khác
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
Thừa kế nghĩa là các phương thức và các
thuộc tính được định nghĩa trong một lớp
có thể được thừa kế hoặc được sử dụng
lại bởi lớp khác.
18/02/2009
Tính Thừa Kế (Inheritance)
cho phép các phần mềm sử dụng quan hệ
“là”
giúp ta thiết kế các dịch vụ tổng quát rồi chuyên môn hóa chúng
18/02/2009
Tính Đa Hình (Polymorphism)
cùng tên có thể được thực hiện khác nhau
đối với các đối tượng/các lớp khác nhau
Ngữ cảnh khác Æ kết quả khác
Đường Thẳng Hình Tròn
Vẽ
18/02/2009
Tính Đa Hình (Polymorphism)
Đa hình hàm - Functional polymorphism
cơ chế cho phép một tên thao tác hoặc thuộc tính có thể được đị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 đó
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.
Đ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 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