Recent Posts

banner-top-it-job-right.gif

Archive

Tags

Related Posts

Nguyên lý SOLID-Nguyên lý nhà phát triển đều nên biết

Kiểu lập trình hướng đối tượng là một kiểu thiết kế mới cho nhà phát triển phần mềm. Tuy vậy, kiểu lập trình này không làm giảm bớt sự khó hiểu và nhầm lẫn của các chương trình. Nguyên lý SOLID, bao gồm năm nguyên tắc được phát triển bởi Robert C.Martin ra đời nhằm khắc phục điều này, giúp chương trình trở nên dễ đọc và dễ dàng duy trì hơn.

Nguyên lý SOLID

Năm nguyên tắc đó bao gồm:

S: Single Responsibility Principle (Nguyên tắc đơn nhiệm)

O: Open-Closed Principle (Nguyên tắc đóng-mở)

L: Liskov Substitution Principle (Nguyên tắc thay thế)

I: Interface Segregation Principle (Nguyên tắc phân chia giao diện)

D: Dependency Inversion Principle (Nguyên tắc đảo ngược phụ thuộc)

Ngay sau đây, chúng ta hãy đi vào làm rõ những nguyên tắc ở trên.


S: Nguyên tắc đơn nhiệm (SRP)

Một lớp (class) nên chịu một trách nhiệm duy nhất. Nếu một lớp có nhiều hơn một trách nhiệm, chúng sẽ trở thành một kết hợp.

Lưu ý: Nguyên tắc này không chỉ áp dụng cho các lớp mà còn áp dụng cho các thành phần phần mềm và dịch vụ siêu nhỏ khác.

Ví dụ:

đoạn mã ví dụ

Ở ví dụ này, lớp Animal (class Animal) vi phạm nguyên lý đơn nhiệm (SRP).

Theo ví dụ chúng ta có thể rút ra hai trách nhiệm: Hàm tạo và getAnimalName quản lý thuộc tính Animal, trong khi saveAnimal quản lý bộ lưu trữ Animal trên cơ sở dữ liệu (tuy vậy theo SRP tuyên bố rằng mỗi lớp nên có một trách nhiệm).

Do đó, chúng ta nên tạo ra một lớp chịu trách nhiệm duy nhất là lưu trữ cơ sở dữ liệu động vật.

class animalDB

O: Nguyên tắc đóng mở (OCP)

Nguyên tắc O trong nguyên lý SOLID này phát biểu rằng: các thực thể phần mềm (lớp (class), mô-đun (modules), hàm (functions)) phải được mở để mở rộng chứ không phải để sửa đổi.

Tiếp tục với ví dụ class Animal ở trên.

O: Nguyên tắc đóng mở (OCP)

Chúng ta hãy tạo một danh sách các động vật và thêm âm thanh của chúng vào.

O: Nguyên tắc đóng mở (OCP)

Hàm AnimalSound không tuân theo nguyên tắc đóng-mở vì không thể “đóng” mỗi khi thêm các loại động vật mới vào.

Ví dụ ta thêm một động vật mới là Rắn (Snake) vào

Chúng ta phải sửa đổi hàm AnimalSound như sau:

sửa đổi hàm AnimalSound

Bạn thấy đó, cứ mỗi khi có một loại động vật được thêm vào, các câu lệnh if lại được lặp lại, và nếu ứng dụng của bạn trở nên phức tạp thì điều này thực sự không tốt chút nào.

Vậy làm cách nào để làm AnimalSound phù hợp với OCP?

làm AnimalSound phù hợp với OCP

Animal bây giờ có một phương thức ảo makeSound. Bằng cách sử dụng phương thức này, mỗi khi một động vật mới được thêm vào, AnimalSound không cần phải thay đổi.

Apply now

L: Nguyên tắc thay thế (LSP)

Một lớp con (sub-class) phải được thay thế cho siêu hạng của nó (super-class).


Mục đích của nguyên lý SOLID này là để xác định rằng một lớp sub-class có thể đảm nhận vị trí của một super-class mà không có lỗi.


Hãy cùng đi đến ví dụ động vật (Animal) của chúng ta.

Ví dụ này vi phạm nguyên tắc LSP và cả OCP. Chương trình vừa phải biết mọi loại động vật và đếm chân của chúng. Mỗi khi muốn thay đổi, chức năng phải sửa đổi để có thể thêm động vật mới.