Bài giảng Mẫu thiết kế hướng đối tượng và ứng dụng: Các nguyên lý các nguyên lý lập trình hướng đối tượng trình bày các nội dung: Phần mềm hướng đối tượng, nguyên lý Open-Close, nguyên lý Nghịch đảo phụ thuộc... Mời các bạn cùng tham khảo.
Trang 1Cac nguyen ly
lập trình hướng đôi tượng Nguyên Minh Huy
Bộ môn Công nghệ Phân mêm
Trang 2Noi dung
=m Phân mêm hướng đôi tượng
m Nguyên lý Open-Close
m Nguyên lý Nghịch đảo phụ thuộc
= Nguyên lý Thay thê Liskov
m Nguyên lý Phân tách Interface
Trang 3Noi dung
> Phân mêm hướng đôi tượng
m Nguyên lý Open-Close
m Nguyên lý Nghịch đảo phụ thuộc
= Nguyên lý Thay thê Liskov
m Nguyên lý Phân tách Interface
Trang 4Phân mêm hướng đôi tượng
=m Phân mêm là gi?
> “A computer program, enable a computer to
perform a specific task’ (wikipedia)
Software is something that is soft!!
our thoughts The code Is only the representation
of the ideas, and the ideas are really the software”
(Hardware is from Mars; Software is from Venus,
Trang 5
Phan mém hu@ng doi tuong
=m Thê nào là phân mêm hướng đôi tượng?2 a
«2
Tuân thủ nguyên lý lập trình hướng đôi tượng thông qua lây??
Trang 6Phân mêm hướng đôi tượng
a Ba tin Nguyén ly Open-Close Ong
> Tí (The Open-Closed Principle)
>Ti- |
Nguyên ly Nghịch đảo phụ thuộc
TT (The Dependency Inversion Principle)
a Nguy oN C (The Liskov Substitution Principle) Nguyén ly Thay thé Liskov guyen ly Thay en tang ý
> La Nguyén ly Phan tach Interface nướng đôi
Trang 7Noi dung
=m Phân mêm hướng đôi tượng
> Nguyên lý Open-Close
m Nguyên lý Nghịch đảo phụ thuộc
= Nguyên lý Thay thê Liskov
m Nguyên lý Phân tách Interface
Trang 8Nguyen ly Open-Close
= Betrand Meyers dé cap lan dau
tién nam 1988 trong Object
Oriented Software Construction
m Phát biêu:
“Các thực thể phân mêm (hàm, đơn thê, đối tượng, .)
nên được xây dựng theo hướng mở cho việc mở rộng
Trang 10Nguyen ly Open-Close
m Ví dụ chương trình vẽ hình:
public enum ShapeType { LINE, RECTANGLE }
public abstract class Shape
Ẳ I
public class Line: Shape
Ẳ
public abstract ShapeType getT ype();
public override ShapeType getType();
public void drawLine();
I
public class Rectangle: Shape
{
public override ShapeType getType();
Trang 11Nguyen ly Open-Close public void draw(ArrayList shapeList) { Line line; Rectangle rectangle;
foreach (Shape s in shapeList)
Trang 14Nguyen public abstract class Shape Ẳ I public class Line: Shape Ẳ I public class Rectangle: Shape Ẳ I public class Circle: Shape Ẳ I
public abstract void draw();
public override void draw();
public override void draw();
public override void draw();
Trang 16Nguyen ly Open-Close
m Ghi chu:
> Nguyên lý cốt lõi của phân tích thiết kê hướng đồi
tượng
> Ưu tiên áp dụng nguyên lý cho các thực thê phan
mêm phải thường xuyên nâng cập, mở rộng
> Việc tuân thủ nguyên lý mang tính tương đôi, phụ
Trang 17Nguyen ly Open-Close
m Áp dụng:
> Thuộc tính của đôi tượng là private dé han ché sw
ket dinh khong can thiet (coupling)
Đối tượng nắm giữ thông tin va
chịu trách nhiệm trên thông tin mình nắm giữ'!!
> Hạn chê ép kiêu động (runtime type-casting)
Trang 18Noi dung
=m Phân mêm hướng đôi tượng
m Nguyên lý Open-Close
> Nguyên lý Nghịch đảo phụ thuộc
= Nguyên lý Thay thê Liskov
m Nguyên lý Phân tách Interface
Trang 19Nguyên lý Nghịch đảo phụ thuộc
m Phát biêu:
“Các thành phân trong phần mềm không nên phụ thuộc
vào những cái riêng, cụ thể (details) ma nguoc lại nên
phụ thuộc vào những cái chung, tổng quát
(abstractions) của những cái riêng, cụ thể đó
Những cái chung, tông quát không nên phụ vào những
cái riêng, cụ thê Sự phụ thuộc này nên được đảo ngược
Trang 21Nguyên ly Nghịch đảo phụ thuộc — Vi du Keyboard ƒƑ copy I Printer public void copy() Ẳ
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
char C;
while ((c = keyboard.read()) != ‘q’) printer.write(c);
Trang 22Nguyên ly Nghịch đảo phụ thuộc — Vi du Keyboard (| copy > Printer > File public void copy(OutputType type) Ẳ
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
Trang 24Nguyên lý Nghịch đảo phụ thuộc — Ghi chu
m Ghi chú:
> Có môi liên hệ mật thiết với nguyên lý Open-Close > “Chia đề trị” theo hướng lập trình câu trúc dễ vi
phạm nguyên ly
> Thực thê phân mềm vi phạm nguyên lý có tính tái
sử dụng không cao
> Allen Holub: “The more abstraction you add, the greater the flexibility In today’s business
Trang 25Nguyên lý Nghịch đảo phụ thuộc — Ap dung
m Áp dụng:
> Làm việc với lớp cơ sở thay vì lớp kê thừa cụ thê
Trang 26Noi dung
=m Phân mêm hướng đôi tượng
m Nguyên lý Open-Close
m Nguyên lý Nghịch đảo phụ thuộc
> Nguyên lý Thay thê Liskov
m Nguyên lý Phân tách Interface
Trang 27Nguyén ly Thay thé Liskov
= Barbara Liskov dé cap lan
dau tién tai OOPSLA 87
m Phát biêu:
“Lớp B chỉ nên kế thừa từ lớp A khi và chỉ khi với mọi
hàm F thao tác trên các đôi tượng của A, cách cư xử
(behaviors) của F không thay đổi khi ta thay thế
(substitute) các đối tượng của A bằng các đôi tượng
Trang 29Nguyén ly Thay thé Liskov
m Ví dụ về hậu quả kê thừa chỉ đề tái sử dụng code:
class Stack
Ẳ
private ArrayList data;
// Khai báo thêm dữ liệu của Stack
public virtual void push(int n); public virtual int pop();
I
class Queue: Stack
Ẳ
// Khai báo dữ liệu của Queue
public override void push(int n); public override int pop();
I
Trang 31Nguyén ly Thay thé Liskov
m Ghi chu:
> Có môi liên hệ mật thiết với nguyên lý Open-Close > Ưu tiên áp dụng nguyên lý cho các thực thê phân
mêm phải thường xuyên nâng câp, mở rộng
> Việc tuân thủ nguyên lý mang tính tương đôi, phụ
thuộc ngữ cảnh
When you inherit from one class,
you sign a contract with that class!!
Trang 34Noi dung
=m Phân mêm hướng đôi tượng
m Nguyên lý Open-Close
m Nguyên lý Nghịch đảo phụ thuộc
= Nguyên lý Thay thê Liskov
> Nguyén ly Phan tach Interface
Trang 35Nguyen ly Phan tach Interface
m Phát biêu:
“Không nên buộc các thực thê phân mêm phụ thuộc vào
Trang 36Nguyen ly Phan tach Interface
Trang 37Nguyen ly Phan tach Interface Circuit add(Circuit) remove(Circuit) calcResistance() A
Resistor Lamp SeriesCircuit ParallelCircuit
_resistance _resistance _ children _ children
add(Circuit) add(Circuit) add(Circuit) add(Circuit)
remove(Circuit) remove(Circuit) remove(Circuit) remove(Circuit)
calcResistance() calcResistance() calcResistance() calcResistance()
Trang 38
Nguyen ly Phan tach Interface
m Ghi chu:
Trang 41Noi dung
=m Phân mêm hướng đôi tượng
m Nguyên lý Open-Close
m Nguyên lý Nghịch đảo phụ thuộc
= Nguyên lý Thay thê Liskov
m Nguyên lý Phân tách Interface
Trang 42Tháo luận
Trang 43Tháo luận Hỗn độn và đây may rủi There is no Silver Bullet!! We are building hard software!! © O Từ đâu đến? ` Ngành gam kỹ thuật non trẻ me neni Di ve dau??? x a C) +- ` Mục tiêu Chất lượng Hiệu quả Phụ thuộc vào
ee chinh cac ban!
High Level Language `