development:software-architecture:solid
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
development:software-architecture:solid [2024/08/06 06:59] – created - external edit 127.0.0.1 | development:software-architecture:solid [2024/08/21 05:14] (current) – [5. D - Dependency Inversion Principle (Nguyên tắc đảo ngược sự phụ thuộc)] tungnt | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
+ | |||
+ | **Định nghĩa:** Một class chỉ nên có một lý do để thay đổi, tức là một class chỉ nên có một trách nhiệm hoặc chức năng duy nhất. | ||
+ | |||
+ | **Ví dụ:** | ||
+ | |||
+ | <file php> | ||
+ | // Sai cách: Lớp User có quá nhiều trách nhiệm | ||
+ | class User { | ||
+ | public function getName() { | ||
+ | // logic lấy tên | ||
+ | } | ||
+ | |||
+ | public function saveToDatabase() { | ||
+ | // logic lưu trữ thông tin vào cơ sở dữ liệu | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Đúng cách: Tách biệt các trách nhiệm | ||
+ | class User { | ||
+ | public function getName() { | ||
+ | // logic lấy tên | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class UserRepository { | ||
+ | public function save(User $user) { | ||
+ | // logic lưu trữ thông tin vào cơ sở dữ liệu | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== 2. O - Open/Closed Principle (Nguyên tắc mở/ | ||
+ | |||
+ | **Định nghĩa:** Một class nên được mở để mở rộng nhưng đóng để chỉnh sửa. | ||
+ | |||
+ | **Ví dụ:** | ||
+ | |||
+ | <file php> | ||
+ | // Sai cách: Thay đổi trực tiếp vào class | ||
+ | class Rectangle { | ||
+ | public function area($width, | ||
+ | return $width * $height; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Circle { | ||
+ | public function area($radius) { | ||
+ | return pi() * $radius * $radius; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class AreaCalculator { | ||
+ | public function calculate($shapes) { | ||
+ | $area = 0; | ||
+ | foreach ($shapes as $shape) { | ||
+ | if ($shape instanceof Rectangle) { | ||
+ | $area += $shape-> | ||
+ | } else if ($shape instanceof Circle) { | ||
+ | $area += $shape-> | ||
+ | } | ||
+ | } | ||
+ | return $area; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Đúng cách: Sử dụng interface để mở rộng chức năng | ||
+ | interface Shape { | ||
+ | public function area(); | ||
+ | } | ||
+ | |||
+ | class Rectangle implements Shape { | ||
+ | private $width; | ||
+ | private $height; | ||
+ | |||
+ | public function __construct($width, | ||
+ | $this-> | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function area() { | ||
+ | return $this-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Circle implements Shape { | ||
+ | private $radius; | ||
+ | |||
+ | public function __construct($radius) { | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function area() { | ||
+ | return pi() * $this-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class AreaCalculator { | ||
+ | public function calculate($shapes) { | ||
+ | $area = 0; | ||
+ | foreach ($shapes as $shape) { | ||
+ | $area += $shape-> | ||
+ | } | ||
+ | return $area; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== 3. L - Liskov Substitution Principle (Nguyên tắc thay thế của Liskov) ====== | ||
+ | |||
+ | **Định nghĩa:** Các đối tượng của lớp con nên có thể thay thế các đối tượng của lớp cha mà không làm thay đổi tính đúng đắn của chương trình. | ||
+ | |||
+ | **Ví dụ:** | ||
+ | |||
+ | <file php> | ||
+ | // Sai cách: Lớp con không hoàn toàn tuân thủ hành vi của lớp cha | ||
+ | class Bird { | ||
+ | public function fly() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Penguin extends Bird { | ||
+ | public function fly() { | ||
+ | throw new Exception(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Đúng cách: Tạo các lớp con tuân thủ hành vi của lớp cha hoặc tạo một hierarchy khác | ||
+ | class Bird { | ||
+ | public function move() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class FlyingBird extends Bird { | ||
+ | public function fly() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Penguin extends Bird { | ||
+ | public function swim() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== 4. I - Interface Segregation Principle (Nguyên tắc phân chia interface) ====== | ||
+ | |||
+ | **Định nghĩa:** Các client không nên bị buộc phải phụ thuộc vào các interface mà họ không sử dụng. | ||
+ | |||
+ | **Ví dụ:** | ||
+ | |||
+ | <file php> | ||
+ | // Sai cách: Interface quá lớn chứa nhiều phương thức không liên quan | ||
+ | interface WorkerInterface { | ||
+ | public function work(); | ||
+ | public function eat(); | ||
+ | } | ||
+ | |||
+ | class HumanWorker implements WorkerInterface { | ||
+ | public function work() { | ||
+ | // logic làm việc | ||
+ | } | ||
+ | |||
+ | public function eat() { | ||
+ | // logic ăn uống | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class RobotWorker implements WorkerInterface { | ||
+ | public function work() { | ||
+ | // logic làm việc | ||
+ | } | ||
+ | |||
+ | public function eat() { | ||
+ | // Robots không cần ăn, nhưng vẫn phải implement phương thức này | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Đúng cách: Chia nhỏ interface | ||
+ | interface WorkableInterface { | ||
+ | public function work(); | ||
+ | } | ||
+ | |||
+ | interface EatableInterface { | ||
+ | public function eat(); | ||
+ | } | ||
+ | |||
+ | class HumanWorker implements WorkableInterface, | ||
+ | public function work() { | ||
+ | // logic làm việc | ||
+ | } | ||
+ | |||
+ | public function eat() { | ||
+ | // logic ăn uống | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class RobotWorker implements WorkableInterface { | ||
+ | public function work() { | ||
+ | // logic làm việc | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== 5. D - Dependency Inversion Principle (Nguyên tắc đảo ngược sự phụ thuộc) ====== | ||
+ | |||
+ | **Định nghĩa:** Các module cấp cao không nên phụ thuộc vào các module cấp thấp; cả hai nên phụ thuộc vào abstraction. | ||
+ | |||
+ | **Ví dụ:** | ||
+ | |||
+ | <file php> | ||
+ | // Sai cách: Module cấp cao phụ thuộc trực tiếp vào module cấp thấp | ||
+ | class MySQLConnection { | ||
+ | public function connect() { | ||
+ | // logic kết nối MySQL | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class PasswordReminder { | ||
+ | private $dbConnection; | ||
+ | |||
+ | public function __construct(MySQLConnection $dbConnection) { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Đúng cách: Sử dụng abstraction để giảm sự phụ thuộc | ||
+ | interface DBConnectionInterface { | ||
+ | public function connect(); | ||
+ | } | ||
+ | |||
+ | class MySQLConnection implements DBConnectionInterface { | ||
+ | public function connect() { | ||
+ | // logic kết nối MySQL | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class SQLiteConnection implements DBConnectionInterface { | ||
+ | public function connect() { | ||
+ | // logic kết nối SQLite | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class PasswordReminder { | ||
+ | private $dbConnection; | ||
+ | |||
+ | public function __construct(DBConnectionInterface $dbConnection) { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | **Tham khảo:** | ||
+ | * https:// | ||
development/software-architecture/solid.1722927590.txt.gz · Last modified: 2024/08/06 06:59 by 127.0.0.1