Nội dung Phương pháp tiếp cận lập trình hướng đối tượng OOP Các đặc trưng của OOP Lịch sử ra đời của OOP Giới thiệu một số ngôn ngữ OOP Xu hướng phát triển của OOP... Nguyễn Thị
Trang 1Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 1
Chương 5
Lập trình hướng đối tượng
Trang 2Nội dung
Phương pháp tiếp cận lập trình hướng đối tượng (OOP)
Các đặc trưng của OOP
Lịch sử ra đời của OOP
Giới thiệu một số ngôn ngữ OOP
Xu hướng phát triển của OOP
Trang 3Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 3
5.1 Phương pháp tiếp cận OOP
– Lập trình tuyến tính: Lập trình tuyến tính là tư duy
theo lối tuần tự Chương trình được thực hiện các
lệnh tuần tự từ đầu đến lúc kết thúc chương trình
– Lập trình cấu trúc: Trong lập trình hướng cấu trúc,
chương trìnhh chính được chia nhỏ thành các
chương trình con và mỗi chương trình con thực hiện một công việc xác định Chương trình chính gọi đến chương trình con theo một giải thuật hoặc một cấu trúc xác định
Trang 4Lập trình tuyến tính
Ưu điểm: đơn giản, dễ hiểu, chỉ có một luồng công việc
duy nhất
Nhược điểm: không tái sử dụng được các đoạn mã lệnh,
mọi dữ liệu đều là dữ liệu toàn cục, khó khăn trong việc
viết các chương trình dài, phức tạp
Trang 5Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 5
Lập trình cấu trúc
Đặc trưng: Chương trình= Cấu trúc dữ liệu + Giải thuật
Vấn đề cơ bản của lập trình cấu trúc là phân chia chương trình
chính thành các chương trình con cho phù hợp với yêu cầu, theo chiến lược thiết kế chương trình top-down (làm mịn dần) Lập trình
có cấu trúc dựa trên nền tảng sự trừu tượng hóa chức năng
Ưu điểm: chương trình có bố cục sáng sủa, dễ viết, dễ hiểu, dễ
bảo dưỡng hơn các chương trình không có cấu trúc.
Nhược điểm:
– Giải thuật chương trình phù thuộc chặt chẽ vào cấu trúc dữ liệu
– Có thể ẩn chứa những xung đột trong truy cập dữ liệu toàn cục và trao
đổi dữ liệu
– Tư duy giải thuật chỉ phù hợp với những bài toán nhỏ
Trang 6Sự trừu tượng hóa về mặt dữ liệu
Sự trừu tượng hóa về mặt dữ liệu chính là việc định nghĩa các kiểu dữ liệu trừu tượng nhằm che dấu các thông tin về cấu trúc dữ liệu
Một kiểu dữ liệu trừu tượng là một mô hình toán học cùng với một tập hợp các phép toán trên nó Kiểu dữ liệu trừu tượng do người lập trình tự định nghĩa
Trang 7Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 7
Lập trình hướng đối tượng
Lập trình hướng đối tượng (OOP) được xây dựng từ nền tảng của khái niệm lập trình có cấu trúc và sự trừu tượng hóa dữ liệu
OOP lấy đối tượng làm nền tảng để xây dựng giải thuật và chương trình
Xây dựng chương trình theo hướng tiếp cận OOP là theo chiến lược bottom-up Cách tư duy: “với một số đối tượng
đã có phải làm gì để giải quyết được công việc đặt ra, hay làm được gì từ tập đối tượng đã có”
Trang 8Ưu điểm của OOP
Không còn nguy cơ dữ liệu bị thay đổi tự do trong chương trình Dữ liệu được đóng gói vào các đối tượng, nếu muốn truy nhập phải thông qua các phương thức cho phép của đối tượng
Khi thay đổi cấu trúc dữ liệu của một đối tượng, không cần thay đổi mã nguồn của các đối tượng khác, mà chỉ cần
thay đổi một số hàm thành phần của đối tượng bị thay đổi
Có thể sử dụng lại mã nguồn, tiết kiệm tài nguyên (chẳng hạn như tính chất kế thừa)
Trang 9Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 9
Trang 10Đối tượng trong OOP
Trong OOP, tất cả các thực thể trong hệ thống đều được coi là các đối tượng cụ thể Đối tượng là một thực thể hoạt động khi chương trình đang chạy VD: sinh viên, lớp, giáo viên, môn học, điểm,
Một đối tượng là một thực thể đang tồn tại trong hệ thống được xác định bằng ba yếu tố:
– Định danh đối tượng: id
– Trạng thái đối tượng: giá trị thuộc tính
– Hoạt động đối tượng: thao tác trên đối tượng
Trang 11Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 11
Trang 12Một lớp có thể có một trong các khả năng
sau:
Hoặc chỉ có thuộc tính, không có phương thức
Hoặc chỉ có phương thức, không có thuộc tính
Hoặc có cả thuộc tính và phương thức (phổ biến nhất)
Đặc biệt, không có cả phương thức lẫn thuộc tính gọi
là các lớp trừu tượng Các lớp này không có thể hiện đối tượng tương ứng
Trang 13Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 13
Dạng lưu trữ của một lớp đối tượng
Các thuộc tính Các phương thức
a1 a2
m1 m2 x
Giả sử x là một biến đối tượng thuộc lớp
A Dạng lưu trữ của một lớp đối tượng
bao gồm các ô nhớ cho các thuộc tính và
một chỉ điểm đến bảng địa chỉ của các
phương thức trong lớp đó.
Trang 15Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 15
Trừu tượng hóa
Trừu tượng hóa đối tượng theo chức năng: là quá
trình mô hình hóa phương thức của lớp dựa trên các hành động của các đối tượng
Trừu tượng hóa đối tượng theo dữ liệu: là quá trình
mô hình hóa các thuộc tính của lớp dựa trên các
thuộc tính của các đối tượng tương ứng.
Trang 16Tính đóng gói dữ liệu
Tính chất này không cho phép người sử dụng các đối
tượng thay đổi trạng thái nội tại của một đối tượng Chỉ có phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó
Việc cho phép môi trường bên ngoài tác động lên dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn phụ thuộc vào người lập trình thông qua các khai báo: public, private, protected Tính chất này đảm bảo sự toàn vẹn của đối tượng
Trang 17Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 17
Ưu điểm của tính đóng gói dữ liệu
Cho phép che dấu dữ liệu bên trong đối tượng
Hạn chế tối đa việc sửa lại mã chương trình
Cho phép che dấu sự cài đặt chi tiết bên trong phương
thức
Trang 18Tính kế thừa
Đặc tính này cho phép một đối tượng có thể có sẵn các
đặc tính mà đối tượng khác đã có thông qua kế thừa
Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại
Tuy nhiên không phải ngôn ngữ định hướng đối tượng nào cũng có tính chất này
Trang 19Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 19
m1_A m2_B m3_B x
Các thuộc tính Các phương thức
Dạng lưu trữ của một đối tượng x thuộc lớp B với
các thuộc tính và phương thức thừa hưởng từ lớp
A và số còn lại được định nghĩa chính trong lớp B
Trang 20Tính đa hình
Việc chỉ cần gọi cùng một phương thức, nhưng từ các đối tượng khác nhau, sẽ cho các kết quả khác nhau được gọi
là tính đa hình trong OOP
Tính đa hình cho phép các lớp được định nghĩa các
phương thức trùng nhau: cùng tên, cùng số lượng và kiểu tham số, cùng kiểu trả về
Khi các phương thức trùng tên, dựa vào đối tượng đang được gọi mà chương trình sẽ thực hiện phương thức của lớp tương ứng
Trang 21Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 21
Tính đa hình (tiếp)
Câu hỏi:
Phân biệt hiện tượng:nạp chồng (overloading) và ghi chồng (overriding)?
Trang 22Các mức độ che dấu thông tin
Để bảo vệ dữ liệu tránh truy nhập nhập tự do từ bên ngoài, OOP sử dụng các từ khóa qui định phạm vi truy nhập các thuộc tính và phương thức của lớp
Các mức truy nhập
– Private: truy nhập trong nội bộ lớp
– Protected: thành phần được bảo vệ, được hạn chế truy nhập
trong quan hệ thừa kế cha con
– Public: truy nhập tự do từ bên ngoài.
Trang 23Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 23
Thành phần public
Trong một lớp, thông thường các vùng sau sẽ được đặt
vào vùng chia sẻ public của lớp:
– Các phương thức nhập/xem (set/get) các thuộc tính dữ liệu
của lớp
– Các phương thức cung cấp chức năng, cách cư xử của đối
tượng với môi trường bên ngoài Các phương thức này thể hiện chức năng của các đối tượng lớp
Trang 24 Thành phần dữ liệu tĩnh có thể là private, public
Khai báo thành phần tĩnh được đặt trong định nghĩa lớp
Phần định nghĩa cho thành phần tĩnh thì lại được đặt ngoài phạm vi khai báo lớp một cách tường minh
Trang 25Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 25
không có đối tượng nào được tạo ra Cách gọi:
Tên lớp::tên hàm thành phần tĩnh (ds tham số)
Trang 26Con trỏ this
Con trỏ this ở bên trong khai báo lớp đại diện cho đối tượng của lớp đó đang được thực hiện trong bộ nhớ Nó là con trỏ luôn có giá trị là địa chỉ của đối tượng.
Con trỏ this là một tham số ẩn mà mọi phương thức của lớp có thể truy cập Nó trỏ tới đối tượng mà phương thức được gọi.
Có một số trường hợp, việc sử dụng con trỏ this là bắt buộc để cài đặt các chức năng trong phương thức của lớp.
Câu hỏi: Những trường hợp nào bắt buộc phải sử dụng con trỏ this? Lấy ví dụ
Trang 27Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 27
5.3 Lịch sử phát triển của các ngôn ngữ OOP
Xuất phát từ định hướng của ngôn ngữ Simula67, trung
tâm Palo Alto của hãng XEROR đã nghiên cứu và cho ra đời ngôn ngữ OOP đầu tiên là Smalltalk
Sau đó các ngôn ngữ OOP lần lượt ra đời như Eiffel, Clos, Loops, Flavors, Object Pascal, Object C, C++, Delphi,
Java,…
Lập trình hướng đối tượng đã phát triển như là phương
pháp lập trình chủ đạo từ giữa thập niên 1980 do việc ảnh hưởng đáng kể của C++ cùng với các tính năng GUI
Trang 28Lịch sử phát triển của các ngôn ngữ OOP
(tiếp)
Các chức năng định hướng đối tượng cũng đã và đang
được thêm vào nhiều ngôn ngữ trong suốt thời gian qua như: ADA, BASIC , Lisp, Fortran, Pascal,…
Việc thêm các chức năng không chủ định ngay từ thiết kế ban đầu đã dẫn tới sự khó khăn trong việc tương thích và bảo trì mã nguồn
Trong thời gian gần đây các ngôn ngữ OOP được ưa
chuộng đó là Java, Microsoft.NET
Gần đây, hai ngôn ngữ OOP mới xuất hiện với chức năng
Trang 29Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 29
Trang 30 Những đặc trưng hướng đối tượng của C++
– Cho phép định nghĩa lớp đối tượng
– Cho phép đóng gói dữ liệu vào các lớp đối tượng Cho phép
định nghĩa các từ khóa phạm vi truy nhập vào các thành phần của lớp
–
Trang 31Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 31
C++ (tiếp)
Những vi phạm hướng đối tượng của C++
– Cho phép định nghĩa và sử dụng các biến dữ liệu tự do
– Cho phép định nghĩa và sử dụng các hàm tự do
– Ngay cả khi dữ liệu được đóng gói vào lớp, dữ liệu vẫn có
thể truy nhập trực tiếp như dữ liệu tự do bởi các hàm bạn, lớp bạn (friend).
Tính hỗ trợ hướng đối tượng trong C++ còn thấp, không trong sáng, dễ gây nhầm lẫn
Trang 32ASP.NET và C#.NET
Các ngôn ngữ lập trình NET của Microsoft ra đời vào cuối những năm 1990 để cạnh tranh với ngôn ngữ lập trình
Java
Một số đặc điểm của ngôn ngữ NET
– Là một ngôn ngữ hoàn toàn hướng đối tượng
– Cung cấp giao diện lập trình đồ họa thân thiện và đẹp mắt
– Cho phép lập trình viên tạo ra các thư viện UserControl của
mình
Trang 33Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 33
Java
Java là một ngôn ngữ OOP được Sun Microsystems giới thiệu vào tháng 6 năm 1995 Java được xây dựng dựa trên nền tảng của C và C++: Java sử dụng cú pháp của C và đặc trưng hướng đối tượng của C++
Đặc điểm của Java
Ứng dụng viết bằng Java thường có tính ổn định, tin cậy cao, dễ bảo trì và nâng cấp
Trang 34 PHP là một ngôn ngữ lập trình kịch bản chủ yếu dùng để phát triển các ứng dụng viết cho máy chủ, mã nguồn mở, dùng cho mục đích tổng quát
PHP thích hợp cho việc viết các ứng dụng web nhúng vào các trang HTML
PHP có tốc độ nhanh, nhỏ gọn, cú pháp gần giống C và
Java, dễ học và thời gian xây dựng ứng dụng tương đối
ngắn hơn so với các ngôn ngữ khác nên PHP nhanh chóng trở thành ngôn ngữ lập trình web phổ biến nhất thế giới
Trang 35Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 35
– PHP 4 (2000): cải thiện tốc độ xử lý, hỗ trợ nhiều máy chủ web hơn, hỗ trợ phiên làm việc http, tạo bộ đệm thông tin đầu ra,… – PHP 5 (2004): cải tiến khả năng hỗ trợ OOP, xử lý XML, nhất quán trong truy cập CSDL (MySQL)
– PHP 6(hiện tại)
Trang 36Câu hỏi?
So sánh sức mạnh của các ngôn ngữ C++, NET, Java, PHP?
Trang 37Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 37
5.5 Xu hướng phát triển của OOP
Lập trình hướng thành phần (component-oriented
programming) Ý tưởng:
– Xây dựng một thư viện các thành phần, mỗi thành
phần thực hiện một công việc xác định
– Khi cần phát triển một phần mềm cụ thể chỉ cần chọn
các thành phần có sẵn ghép lại với nhau.
– Người lập trình có thể phát triển thêm các thành phần
chưa có trong thư viện
Trang 38Xu hướng phát triển của OOP (tiếp)
Lập trình hướng agent: được xem là một mức trừu
tượng cao hơn của lập trình hướng thành phần Đặc điểm:
– Các agent có khả năng làm việc độc lập, tự chủ để hoàn
thành công việc của mình.
– Các agent có khả năng chủ động liên lạc với các agent khác
để có thể phối hợp, cộng tác hay cạnh tranh nhau nhằm hoàn thành nhiệm vụ.
Trang 39Nguyễn Thị Hạnh – Bộ môn CNPM - Khoa CNTT - ĐH SPHN 39
Xu hướng phát triển của OOP (tiếp)
Lập trình hướng aspect: là một xu hướng của lập trình hướng thành phần Đặc điểm:
– Tính đóng gói theo luồng công việc, hoặc đóng gói theo khía
cạnh vấn đề
– Tính đơn điệu theo luồng, trong một luồng công việc , các
nhiệm vụ được thực hiện liên tiếp nhau, tuần tự như trong lập trình tuyến tính.
Trang 40Phương pháp phân tích thiết kế hệ thống hướng
đối tượng
Cách tiếp cận phân tích và thiết kế hệ thống hướng đối
tượng
Cơ sở dữ liệu hướng đối tượng
Lập trình hướng đối tượng