Nếu bạn là một nhà lập trình viên hoặc bạn đang công tác trong ngành lập trình thì hẳn sẽ có ít nhất một lần nghe đến cụm từ nguyên lý SOLID. Lập trình cũng như bất kỳ công việc nào khác, cũng sẽ có các nguyên tắc thực hiện để tối ưu hóa hiệu hiệu suất và giảm thiểu rủi ro ở mức cao nhất. Và SOLID chính là nguyên lý được nhiều nhà lập trình viên áp dụng vào trong công việc của mình. Vậy SOLID đại diện cho điều gì? Hãy cùng Teky khám phá trong bài viết sau đây.
Nguồn gốc của nguyên lý SOLID là gì?
Lập trình hướng đối tượng còn được gọi là Object Oriented Programming (OOP). OOP là phương thức lập trình cho phép lập trình viên sử dụng các code để trừu tượng hóa một đối tượng bất kỳ. Quá trình này sẽ giúp tạo ra các đối tượng nhất định. Đây là một trong những phương thức lập trình được sử dụng phổ biến nhất hiện nay. Nó phù hợp với hầu hết các loại ngôn ngữ lập trình khác nhau.
Hiệu năng của OOP được quyết định dựa trên 4 yếu tố khác nhau:
- Tính trừu tượng (abstraction): Bằng việc sử dụng các lớp trừu tượng, người dùng sẽ tạo nên mô hình của các đối tượng trong thế giới thực.
- Tính đóng gói (Encapsulation): Yếu tố này là để chỉ trường hợp các thực thể của lớp trừu tượng sở hữu những giá trị thuộc tính độc lập.
- Tính kế thừa (Inheritance): Yếu tố này cho phép các đối tượng được phép kế thừa và mở rộng lẫn nhau.
- Tính đa hình (Polymorphism): Tùy theo từng loại đối tượng khác nhau, ta có thể thực hiện một quy trình bằng nhiều cách riêng biệt.
Vậy là ta đã nắm được 4 yếu tố cần thiết để một lập trình OOP có thể phát huy hết tác dụng vốn có của nó. Vậy SOLID thì liên quan gì đến OOP? Nguyên tắc SOLID được hiểu như một cẩm nang hướng dẫn bạn sử dụng OOP thật hiệu quả. Tuân thủ theo các nguyên tắc SOLID giúp người dùng phối hợp được 4 tính năng của OOP với nhau thật nhuần nguyễn.
Khái niệm của nguyên lý SOLID
Nguyên lý SOLID nghĩa là gì? SOLID trong lập trình vốn là bộ 5 nguyên tắc được phát triển bởi 2 tác giả Bob Martin và Michael Feathers. Những hướng dẫn này sẽ giúp lập trình viên tạo ra được những đoạn code dễ đọc, dễ hiểu, dễ maintain. SOLID là viết tắt của 5 cụm từ sau:
- Single Responsibility Principle (SRP)
- Open/Closed Principle (OCP)
- Liskov Substitution Principle (LSP)
- Interface Segregation Principle (ISP)
- Dependency Inversion Principle (DIP)
Nguyên tắc trách nhiệm đơn lẻ (Single Responsibility Principle)
Nguyên lý SOLID này cho rằng, mỗi class chỉ nên thực hiện một trách nhiệm duy nhất. Người dùng không nên cho một class kiêm nhiệm nhiều hoạt động cùng lúc. Thứ nhất, việc phải chia thời gian và công sức cho nhiều công việc sẽ làm giảm hiệu suất hoạt động. Hơn nữa nó còn mất thời gian khi phải chuyển dịch từ công việc này sang công việc khác. Ngoài ra, việc chạy đồng thời nhiều quy trình một lúc cũng rất dễ xảy ra lỗi.
Ví dụ, bạn có một lớp A. Bạn cho lớp A chạy cả công việc X và công việc Y. Có thể thời gian đầu bạn sẽ thấy cách làm này tiết kiệm thời gian tạo các lớp và gán đối tượng hơn. Tuy nhiên, khi số lượng công việc tăng lên, liệu rằng bạn có tiếp tục cho lớp A chạy thêm công việc Z, W, J… xuất hiện phía sau hay không? Mỗi lần có thêm một công việc, lập trình viên sẽ phải vào lại lớp A và chỉnh sửa toàn bộ hệ thống. Như vậy rất mất thời gian và còn dễ xảy ra sai sót trong quá trình sửa chữa. Chưa kể đến việc khi một trong các công việc cần tạm dừng, người dùng cũng phải lật lại toàn bộ hệ thống của A để làm lại.
Vậy nên, các tốt nhất để hạn chế toàn bộ những rủi ro như vậy là cho mỗi lớp một chức năng riêng biệt. Không nên gộp nhiều hoạt động vào cùng một lớp.
Nguyên tắc đóng mở (The Open-Closed Principle)
Nguyên tắc đóng mở được dùng để mô tả hoạt động kế thừa của các lớp. Ví dụ, với một nhân viên công tác tại công ty, anh ta đang làm việc rất tốt, vì thế ngoài lương cứng anh ta sẽ có thêm một khoản tiền thưởng. Với trường hợp như vậy, lựa chọn của bạn là lập thêm một lớp mới cho khoản thưởng (dựa trên nguyên tắc đơn lẻ phía trên) đúng hay không? Điều này khả thi nhưng không hiệu quả. Nếu như anh ta có thêm một khoản thưởng nữa thì sao, khi ấy chúng ta lại phải quay lại và sửa lớp đại diện cho tiền thưởng ư? Chắc chắn là không nên làm như vậy. Lập trình hạn chế nhất là chỉnh sửa bởi nó đem lại rủi ro về sai phạm là rất cao.
Vậy nên trong trường hợp này, bạn nên sử dụng một lớp kế thừa. Nguyên lý SOLID này cho phép đóng lớp tiền lương và mở lớp tiền thường. Tức là lớp chính tiền lương cố định sẽ không bị chịu bất kỳ ảnh hưởng nào cả. Còn lớp thưởng sẽ nhận được sự kế thừa của lớp lương để bổ sung các thông tin cần thiết. Quy trình này kéo dài đến vô hạn các lớp sau. Đây là phương án rất an toàn và thiện thiện, vừa giúp phát triển code mới mà lại không lo làm hỏng code cũ.
Nguyên tắc phân vùng Liskov (The Liskov Substitution Principle)
Phân vùng Liskov là một trong những phần quan trọng của nguyên lý SOLID. Nguyên tắc này giúp giải quyết các lỗi thường xảy ra trong lập trình.
Ví dụ: Có một đoạn mã mô tả những loài chim biết bay. Khi gặp một loài chim không biết bay như chim cánh cụt, nó sẽ được gắn với NoFlyException. Tuy nhiên, nếu chim cánh cụt lại tiếp tục xuất hiện ở vòng lặp main, chương trình sẽ tự động quăng Exception. Đó chính là bản chất của nguyên tắc phân vùng.
Để giải quyết điều này, ta cần phải tách lớp chim cánh cụt ra một interface riêng. Nguyên tắc này xuất hiện là để nhắc nhở lập trình viên chú ý đến tính sai phạm của nội dung các đoạn mã lập trình. Nếu không khi để đến lúc hoàn thành mới phát hiện ra lỗi thì sửa lại rất khó khăn và mất thời gian.
Nguyên tắc phân tách giao diện (Interface Segregation Principle)
Trường hợp thực tế của nguyên tắc này như sau: Bạn sở hữu một trung tâm cung cấp các gói du lịch bao gồm những sản phẩm như: gói 1, gói 2, gói 3… Các khách hàng cùng sử dụng một gói sẽ được cho vào một interface chung. Thời gian ban đầu, bạn thấy cách quản lý này rất hợp lý rồi. Tuy nhiên, bỗng có những khách hàng muốn sử dụng một gói bao gồm một vài dịch vụ trong gói 1 cùng một số dịch vụ khác trong gói 2. Thế là bỗng dưng có những gói mới được phát sinh. Càng ngày có càng nhiều khách hàng yêu cầu gói riêng như vậy. Nếu ta cứ viết chung vào trong interface gói du lịch như vậy thì sẽ phải implement nhiều hàm không cần thiết.
Ta sẽ giải quyết trường hợp này bằng nguyên tắc phân tách giao diện. Hãy tách các dịch vụ thành các interface cụ thể khác nhau. Khi đó, khách hàng yêu cầu dịch vụ nào, ta gộp dịch vụ đó thành một gói mới cho khách. Nguyên lý SOLID này giúp bạn dễ dàng mở rộng quy mô một cách đơn giản.
Nguyên tắc đảo ngược phụ thuộc (Dependency Inversion Principle)
Nội dung của nguyên lý SOLID này nói về việc các thành phần cụ thể nên phụ thuộc vào các thành phần trừu tượng. Lý do là vì những thành phần trừu tượng thường ít bị thay đổi. Ngược lại, các thành phần cụ thể tuy khác nhau nhưng luôn mang một đặc tính chung để cấu thành thành phần trừu tượng. Việc giữ tính phụ thuộc này giúp chương trình thích ứng tốt với các biến đổi liên tục.
Kết luận về nguyên lý SOLID
Với bài giải thích vừa rồi của Teky, hẳn bạn đọc đã hiểu rõ 5 nguyên lý SOLID dành cho OOP. Tuy nhiên hiểu là một chuyện mà vận dụng nhuần nhuyễn được lại là chuyện khác. Lời khuyên của chúng tôi là hãy ghi nhớ thật rõ ràng và thường xuyên áp dụng các nguyên tắc này vào trong công việc của bạn. Chúc bạn sớm ngày chinh phục được những nguyên lý SOLID!
Tham khảo thêm: Windows Terminal là gì? Hướng dẫn cách cài đặt nhanh chóng nhất
The post Nguyên lý SOLID là gì? Cách giải trình SOLID đơn giản và dễ hiểu nhất appeared first on TEKY - Học viện sáng tạo công nghệ.
source https://teky.edu.vn/blog/nguyen-ly-solid/
Không có nhận xét nào:
Đăng nhận xét