Giảng viên: Vũ Duy Linh Email: vdlinh@ctu.edu.vn
46
© Vũ Duy Linh Các mẫu hình lập trình
Mẫu hình lập trình tuần tự (Imperative paradigm)
Mẫu hình lập trình mô tả (Declarative paradigm)
Lập trình hàm (Functional programming)
Lập trình logic (Logic programming )
Mẫu hình lập trình hướng đối tượng (Object-oriented paradigm)
Mẫu hình lập trình hướng định dạng/khía cạnh (Aspect-oriented paradigm)
47
© Vũ Duy Linh Mô hình lập trình tuần tự
Phục vụ cho thời kỳ đầu máy tính và ngôn ngữ asembler
Cách làm tuần tự từng bước (step- by-step) để cụ thể hóa bài toán được làm như thế nào (how to get sth)
Các biến được đại diện trong bộ nhớ
Sử dụng lệnh gán để thay đổi trị biến
Các ngôn ngữ tiêu biểu: Algol, Pascal, C, Ada
procedure Fibo(n: integer);
var a, b, kq: integer;
begin
a := 0; b:=1;kq:=0;
while (kq < n) do begin
kq := q + b; write(kq:4);
a = b; b = kq;
end;
end;
48
© Vũ Duy Linh
Declarative programming: Để miêu tả bài toán cần giải quyết được định nghĩa như thế nào.
Nó dựa trên cách lập trình định nghĩa hàm (definition-based functional programming):
Lập trình hàm (Functional programing)
Lập trình logic (Logic programing)
Lập trình hàm:
Ước lượng các hàm toán học
Không làm thay đổi dữ liệu
Chương trình chính là một tập các hàm
Các ngôn ngữ tiêu biểu: Lisp, Refal, Perl, Planer,…
Lập trình logic:
Xác định kết suy diễn của bài toán là thành công hay thất bại
Dựa vào một tập các phép logic được định nghĩa: các sự kiện/tiên đề, các luật logic
Các nguyên lý hợp nhất (Unification), nguyên lý giải (Resolution)
Ngôn ngữ tiêu biểu: Prolog
(+ x y) x + y
Mô hình lập trình mô tả
49
© Vũ Duy Linh Mô hình lập trình mô tả (2)
Ngôn ngữ LISP
(max 3 10 -10 15 7) 15
(defun factorial (N)
"Compute the factorial of N."
(if (<= N 1) 1
(* N (factorial (- N 1)))))
Bài toán n! được định nghĩa là:
“bằng 1 nếu n <=1 ngược lại bằng n*(n-1)!
Bài toán n! được định nghĩa theo cú pháp Prolog.
Ngôn ngữ Prolog
mortal(X) :- human(X).
human(socrate).
?- mortal(socrate).
Yes, Sorate is mortal.
fac(0,1).
fac(N,F) :- N>0, M is N-1, fac(M, Fm), F is N * Fm.
50
© Vũ Duy Linh Mô hình lập trình hướng đối tượng
Dựa trên nền tảng đối tượng (Object)
Chương trình bao gồm nhiều tập quần thể đối
tượng khác nhau, mỗi quần thể đối tượng thuộc vào một loài/ loại/ lớp (Class) riêng biệt.
Sự thực thi chương trình là sự trao đổi thông điệp
(messages) giữa các đối tượng với nhau.
thuần OOP: Mọi thứ là đối tượng ngay cả các kiểu nguyên thủy (primitives)
Ngôn ngữ thuần OOP:
Smalltalk, Eiffel.
1 lớp Xe
4 chiếc xe 4 đối tượng thuộc lớp Xe
51
© Vũ Duy Linh Kết hợp các mô hình
Ngôn ngữ lập trình hiện đại thường có sự kết hợp giữa các mô hình:
Imperative + OO Paradigms: C++, Java, Object Pascal, Ada
Fuctional + OO Paradigms: Clos (Common Lisp Object System)
Logic + OO Paradigms: Object Prolog
52
© Vũ Duy Linh Quá trình phát triển chương trình HĐT
1. Đặc tả bài toán 2. Phân rã bài toán 3. Phân tích các thực thể tồn tại trong bài toán (Trừu tượng hoá) 4. Viết mã lệnh Java 5. Kiểm thử
6. Chỉnh sửa lại.
1
2
3
4
5
6
53
© Vũ Duy Linh Sự ánh xạ thế giới thực vào OOP
- Được hực hiện thông qua sự trừu tượng hóa.
- Sự trừu tượng hóa: là quá trình xác định các thuộc tính và các hành động liên quan đến mỗi thực thể trong môi trường ứng dụng đang được phát triển (có nhiều đối tượng thuộc các loại khác nhau).
54
© Vũ Duy Linh Sự trừu tượng hóa - Abstraction
Trừu tượng dữ liệu ( Data abstraction): là các đặc tính (properties) của kiểu dữ liệu và sự cài đặt cụ thể nó Định nghĩa kiểu dữ liệu (thực thể) ở mức trừu tượng interface và cài đặt nó ở mức cụ thể.
Phép tính a = (1+2) * 5 được thức hiện như thế nào trên máy tính, dễ hay khó?
Abstract properties
Sự trừu tượng hoá điều khiển ( Control abstraction): Là sự trừu tượng các thao tác/
phép toán ở mức thấp. Các ngôn ngữ lập trình đã làm sẵn việc này, giúp giảm bớt công sức của lập trình viên.
Rất đơn giản nếu sử dụng NNLT bậc cao, “mệt” nếu sử dụng ngôn ngữ máy (Machine language)
Tính toán, xử lý ntn để có kết quả a = 15?
55
© Vũ Duy Linh Sự trừu tượng hóa - Abstraction
Class (kiểu dữ liệu thực thể): Là sự kết hợp của data abstraction + Control abstraction
56
© Vũ Duy Linh Các đặc tính Java hướng đối tượng
Java OOP
Paradigm
Encapsulation
Multiple Inheritance
Delegation Concurrency Polymorphism Single Inheritance
Abstraction
Persistence
Genericity
57
© Vũ Duy Linh Sự đóng gói - Encapsulation
Sự đóng gói: Là việc cài đặt mã lệnh cho các phương thức nội tại và cách thức truy xuất các thuộc tính của lớp thành một đơn vị duy nhất Cung cấp một cơ chế bảo vệ dữ liệu (đối tượng): che dấu và bảo vệ dữ liệu khỏi người dùng (can thiệp hoặc thao tác sai mục đích).
Outside code: Phần nhìn thấy cho người dùng Inside code: Phần che
khuất khỏi người dùng
58
© Vũ Duy Linh Sự trừu tượng - Abstraction
OOP sử dụng cả data và control abstraction.
Abstraction Class: tập các thuộc tính và thao tác (phương thức).
Lớp GiangVien: có 3 thuộc tính và 2 phương thức.
3 Attributes
2 Operations
V V
59
© Vũ Duy Linh Thừa kế- Inheritance
Thừa kế (Inheritance): Là một cơ chế cho phép lập trình viên định nghĩa một lớp con mới (Child/ sub/ derived class) bằng cách mở rộng từ (các) lớp cha (Parent/ super/
base class) đã tồn tại. Đây là đặc tính nổ bật nhất của OOP và là một cuộc cách mạng của lĩnh vực công nghệ phần mềm.
Lớp con thừa hưởng các đặc điểm
(properties = attribute + operations) từ lớp cha trong phạm vi truy xuất được phép.
Quá trình phân tích tìm các lớp con dẫn
xuất từ lớp cha được gọi là chuyên biệt hoá (Specialization).
Parent
Child
Phần chung:
- Được kế thừa - Có thể reused vì không cài đặt lại
60
© Vũ Duy Linh Thừa kế
Chuyên biệt hoá là quá trình phân lớp quần thể các đối tượng chung của lớp cha ra thành những lớp quần thể con nhỏ hơn (có chung đặc tính) của các lớp con khác nhau phương pháp lập trình top-down.
Mối liên kết giữa lớp con và lớp cha là mối liên kết Là-Một (Is-A) của lớp cha.
c à n g
tổng quát (trừu tượng)
chuyên biệt (cụ thể)
Ex: Nguoi Is-A DongVatCoVu: “Người là một loài động vật có vú”,…
61
© Vũ Duy Linh Các loại thừa kế lớp trong Java
Các dạng thừa kế trong lập trình hướng đối tượng Java là:
Thừa kế đơn (Single inheritance): Một con một cha
Thừa kế phân cấp (Hierarchical inheritance): Nhiều con một cha
Thừa kế đa cấp (Multi-level inheritance): Là dạng Thừa kế
Hierarchical nhưng cho phép nhiều cấp (như: chắtkj cháuji coni cha)
Hierarchical inheritance
Single
inheritance Multi-level
inheritance
62
© Vũ Duy Linh Các loại thừa kế lớp ngoài Java
Thừa kế bội (Multiple inheritance): Một con thừa kế từ nhiều cha. VD: C++
Thừa kế lai (Hybrid inheritance): Là sự kết hợp 2 trong 4 cách trên
Thừa kế đa lối (Multi-path inheritance): Giống như dạng Hybird nhưng được dẫn xuất cùng một lớp cha (base class).
Q & A
63
© Vũ Duy Linh Tính đa hình
Đa hình (Polymorphism): Là khả năng đảm nhận nhiều dạng - Một hoạt động (thông qua phương thức) được đối tượng thực hiện bằng nhiều cách khác nhau, và các đối tượng khác loại cùng thực hiện chung một ứng xử theo cách riêng của mình.
Giúp cho chương trình trở nên tổng quát hơn chứ không đơn điệu cá biệt
Có 2 hình thức đa hình:
1. Đa hình tĩnh (Static polymorphism):
được thực hiện thông qua phương pháp nạp chồng (overloading) ở thời điểm biên dịch chương trình (early binding) Đa hình phương thức.
Biên dịch thành byte-code vì biết rõ phương thức nào sẽ được thực thi
2. Đa hình động (Dynamic polymorphism):
được thực hiện thông qua phương pháp ghi chồng (overriding) ở thời điểm thực thi chương trình (late binding) Đa hình đối tượng.
Chỉ xác định được phương thức nào được thực hiện ở thời điểm thực thi
64
© Vũ Duy Linh Tính bền vững
Tính bền vững (Persistence): Mục đích lưu giữ sự tồn tại của đối tượng lâu hơn sự thực thi của chương trình.
Với Native Java persistence bằng tuần tự hoá:
Bằng cách ghi đối tượng vào nơi an toàn (không bị xung đột) rồi sau đó đọc ra để sử dụng lại các thư viện hỗ trợ:
java.io.FileInputStream; java.io.FileOutputStream;
java.io.ObjectInputStream; java.io.ObjectOutputStream;
Cơ chế để đảm bảo sự bền vững là sự tuần tự hóa (serialization) -
java.io.Serializable;: Nó chuyển đổi dữ liệu (đối tượng) vào luồng (byte stream) và ghi nó vào tập tin (CSDL, bộ nhớ) để lưu trữ - sử dụng phương thức writeObject(). Chương trình sẽ được java bean khôi phục lại bằng cơ chế deserialization để có được trạng thái ban đầu của đối tượng - sử dụng phương thức readObject().
65
© Vũ Duy Linh Tính bền vững CSDL trong Java - Persistence database
Với các framework hỗ trợ persistence: JPO/OpenJPA, TopLink, EclipseLink, Hibernate,…
và với JPA trong Java EE, và Java Data
Objects (JDO API) của Cộng đồng Java (Java Community Process):
66
© Vũ Duy Linh Đồng bộ hóa, sự ủy quyền
Đồng bộ hóa (Concurrency): Là cơ chế cho phép thực hiện nhiều chức năng/công việc tại một thời điểm. VD như hệ điều hành đa nhiệm - Java thực hiện thông qua cơ chế tiến trình (processes) và tuyến đoạn (threads) và tuần tự hoá
(synchronization). Java API là gói java.util.concurrent;
Sự ủy quyền (Delegation): Cho phép một phương thức
method_A của lớp A thực hiện một nhiệm vụ thông qua một phương thức method_B ở lớp B.
Point xCoord yCoord getXCoord() getYCoord() Circle
centre
getCentreX() getCentreY()
Phương thức getCenterX() của đối tượng lớp Circle thực hiện tính xCord của tâm hình tròn thông qua phương thức getXCoord thuộc đối tượng lớp Point
67
© Vũ Duy Linh Kỹ thuật tổng quát
Kỹ thuật Generic: Cho phép sự trừu tượng hóa các phần tử dữ liệu mà không cụ thể chính xác kiểu của chúng. Các kiểu tổng quát
(chưa biết) này chỉ được xác định ở thời điểm sử dụng chúng.
E là tham số hình thức có kiểu tổng quát ở thời điểm định nghĩa.
Khi sử dụng List<Integer> thì E được thay thế bằng kiểu của đối số thực (là Integer)
68
© Vũ Duy Linh Lợi ích của OOP
Sự tin cậy cao hơn: Phân các dự án phần mềm phức tạp thành các mô đun các đối tượng nhỏ hơn (Package)
Khả năng bảo trì phần mềm: Với các gói nhỏ (mô-đun) sẽ giúp dễ phát hiện lỗi và sửa lỗi hơn
Năng suất cao hơn thông qua tính sử dụng lại (Reused)
Inheritance: Làm giảm bớt sự dư thừa mã lệnh, mở rộng việc sử dụng các class đang tồn tại
Encapsulation: Giúp cho xây dựng chương trình an toàn hơn.
OOP dễ dàng ánh xạ các đối tượng trong miền xác định của bài toán tới các đối tượng trong chương trình
Những hệ thống hướng đối tượng có thể được nâng cấp từ hệ thống nhỏ sang lớn dễ dàng.