Các nguyên lý của lập trình hướng đối tượng
1. Nguyên lý SOLID
"Uncle Bod" tổng hợp
"Kim chỉ nam " hoạt động thiết kế
5 Nguyên lý SOLID
Nguyên lý là gợi ý cho lời giải, design pattern là lời giải cụ thể
1.1 Nguyên lý đóng mở
Đóng với chỉnh sửa và mở với việc thêm mới

Khi thay đổi chương trình:
Giải pháp 1: chỉnh sửa mã nguồn --> rủi ro : hiệu ứng domino
vì khi viết code: A--> B, A ---> C, C--> D , C --> E, nếu một dòng bị hỏng --> hỏng hết

Giải pháp 2: thay thế, lắp ghép, dễ mở rộng . Tính đến việc thay đổi đến sau này (update).
Để đáp ứng hướng mở rộng
Xây dựng interface hỗ trợ thay thế mở rộng. Sử dụng mối nối để dễ thay đổi.

Hạn chế điều kiện rẽ nhánh lựa chọn mở rộng
1.2 Nguyên lý đơn nhiệm
Mỗi lớp, đối tượng chỉ đảm nhiệm MỘT nhiệm vụ
hoặc
mỗi lớp chỉ nên có một hướng mở rộng.
Đa năng không hẳn là tốt.

Ví dụ:


Chúng ta cần sửa lại


1.3 Nguyên lý Đảo ngược phụ thuộc


Chữa bài tập

Trong trường hợp keyboard không thay đổi được. thì chúng ta cần adapter để tương thích với reader

Bài tập sửa lại nguyên lý đóng mở.
Yêu cầu :

Hướng mở rộng: Extensibility

Hướng mở rộng khác: vẽ theo thứ tự + dạng hình

Lời giải :
Chúng ta có listShape và SortShape.
Phải delegation cho một class Drawer.
Hoặc là hướng suy nghĩ khác:
Client: vẽ
SortShape: sắp xếp
Cải tiến thêm : sử dụng template method.

Cải tiến thêm loại :

void Compare_v1(Shape s1, Shape s2){
ValueShape valueShape = new ValueShape();
int t1 = valueShape.getValue(s1);
int t2 = valueShape.getValue(s2);
return t1 < t2;
}
void Compare_v2(Shape s1, Shape s2){
return s1.getValue() < s2.getValue();
}
class ValueShape{
int getValue(Shape s){
if(s instance of Line) return 1;
if(s instance of Circle) return 2;
if(s instance of Rect) return 3;
// if(s instance of Eclipse) return 4;
}
}
1.4 Nguyên lý Thay thế Liskov
Đối tượng CON phải THAY THẾ được Cha trong mọi hoàn cảnh mà không ảnh hưởng đến tính đúng đắn của chương trình.
Không biết tất cả điều khoản hợp đồng mà lớp cha đã hứa hẹn.
Chim: bay --> chim cách cụt: không bay : thái hóa.
Bài toán kinh điển : Square và Rectangle.

Các cách giải quyết:
Prefer Inheritance over composition
class Square{
Retangle r;
void setWidth(int a){
r.setWidth(a);
r.setHeight(a);
}
int calArea(){
return r.calArea();
}
}
Subtype (inheritance from Interface) : java 1995, C# 2001 . Should not Subclass, Subtype.
C++ cải tiến.

Điều kiện kế thừa:
Toàn vẹn về cú pháp :
Toàn vẹn về sự xử lý logic :
Lớp cha :
- withdraw(int n)
Lớp con:
- withdraw(int n)
bool withdraw(int n ){
if(n > 10000)
throw IOException("So tien nhap khong hop le.");
if(money > n){
money = money - n;return true;
}else
return false;
}
//
int caculate(int n ){
if(n > 0)
return result;
}
int caculate(int n){
if(n > 10)
return result;
}
DESIGN BY CONTRACT

Note
// Dự đoán sự mở rộng + Hướng mở rộng (phương thức (methods), loại (attributes))
// + Sửa (thay đổi thứ tự vẽ)
// + Thêm bớt (thêm hình mới, Circle, elipse, ...)




Ban đầu ta có cái shape :

Matching để mở rộng:

Với mỗi loại thì mở rộng theo interface

Gom nhóm hướng mở rộng cùng hướng.

Convert về chung dạng

Last updated
Was this helpful?