OOP
4 Tính chất của OOP
-
Tính đóng gói(Encapsulation): là tính năngche giấuthông tincủa 1 đối tượng. Các đối tượng bên ngoài muốntruy cậphoặcchỉnh sửathông tin thì phải thông qua cácphương thức công khai. -
Tính kế thừa(Inheritance): các lớp con kế thừa thì sẽ thừa hưởng cácthuộc tínhvàphương thứccủa lớp cha. Các lớp con có thểmở rộnghoặcthay đổi hành vimà không cần viết lại toàn bộ mã. -
Tính đa hình: Cácđối tượng khác nhaucó thể thực thi 1hàm giống nhauvới cáccài đặt khác nhau.- Đa hình được triển khai thông qua
nạp chồng phương thức(overloading) hoặcghi đè phương thức(overriding)
- Đa hình được triển khai thông qua
-
Tính trừu tượng(Abstraction): Thường được thực hiện thông qualớp trừu tượng(Abstract Class) hoặcgiao diện(Interface). Nó giống như 1bản thiết kế,chỉ địnhcác phương thức cho lớp con, nhưng chi tiết cài đặt sẽ dolớp con triển khai.
SOLID là gì
-
S(SingleResponsibility Principle): mỗi lớp chỉ nên đảm nhậnmộtnhiệm vụcụ thể nào đó. -
O(Open/Closed Principle):Không được sửa đổi1 class có sẵn, nhưng có thểmở rộngbằng kế thừa. -
L(LiskovSubstituition Priciple): Thiết kế để các đối tượnglớp concó thể thay thế đối tượnglớp chamà không gây ra lỗi.
- Ở trường hợp trên
CleanerStaffkế thừaEmployeenhưng lại không được dùng methodcheckAttendance()do quy tắc thiết kế =>lỗi - Có thể tách method
checkAttendance()qua 1 class riêng.
-
I(InterfaceSegregation Principle): Nênchia nhỏthành nhiều interface thay vì thiết kế một interface lớn. -
D(DependencyInversion Principle):- Các module cấp cao không nên phụ thuộc vào các module cấp thấp mà
cả hainên phụ thuộc vàoabstraction. - Các class giao tiếp với nhau thông qua
interface, không phảiimplementation
- Những cái trừu tượng (abstraction) là những cái ít biến động, tập hợp những đặc điểm chung nhất của những cái cụ thể. Việc phụ thuộc vào cái trừu tượng sẽ giúp chương trình linh động và thích ứng tốt với các sự thay đổi diễn ra liên tục.
Điểm khác biệtgiữa phụ thuộc vàointerfacevà phụ thuộctrực tiếplà interface giúp chỉ cần quan tâm đếnhành vi chung,khôngcần quan tâm đếnchi tiếtthực thi của dịch vụ. Như vậy việc sửa đổi mã nguồn sẽ độc lập và dễ bảo trì hơn.
- Ví dụ có 1 module cấp cao là
OrderProcessorvà module cấp thấp làEmailService Vi phạm nguyên tắc: Implement thẳng EmailService vào OrderProcessor.Tuân theo nguyên tắc:- Tạo 1 interface
INotificationServicevàEmailServicesẽ kế thừa interface này.OrderProcessorchỉ việc inject interface này vào và sử dụngEmailService. - Như vậy khi ta muốn thêm 1 service nào mới (như
SmsService) thì ta chỉ việc kế thừa từINotificationService, hạn chế thay đổi mã nguồn nhiều nơi.
- Tạo 1 interface
- Các module cấp cao không nên phụ thuộc vào các module cấp thấp mà