SOLID là gì và vày sao việc vâng lệnh SOLID để giúp đỡ bạn trở ra đời trình viên giỏi? 5 SOLID principles của lập trình hướng đối tượng người dùng giúp các xây cất hướng đối tượng trở cần dễ hiểu, linh hoạt với dễ bảo trì hơn – điều mà phần nhiều developer đều mong khi viết code.

Bạn đang xem: Solid content là gì

Đọc bài viết này để hiểu rõ:

SOLID là gì?5 SOLID principles (nguyên tắc SOLID) đề nghị thuộc ở lòng
Cách vận dụng đúng với sai của từng cách thức SOLID với ví dụ code dễ hiểu

bắt đầu ra đời của SOLID

Các SOLID principles được Robert C. Martin giới thiệu trong cuốn sách “Design Principles & Design Patterns” xuất phiên bản năm 2000. Bộ lý lẽ nguyên phiên bản trong cuốn sách sau đó được Michael Feathers bắt lược lại bởi cụm trường đoản cú viết tắt SOLID – các từ mà họ thường sử dụng ngày nay.

Và vào hơn hai mươi năm qua kể từ lúc ra mắt, gần như SOLID principles này đã giải pháp mạng hóa thế giới lập trình hướng đối tượng người dùng (OOP) và đổi khác cách họ viết phần mềm.

vì chưng sao SOLID góp lập trình viên viết code xuất sắc hơn?

SOLID ship hàng cho mục đích:

“Tạo ra phần lớn dòng code giúp những developer dễ dàng đọc, dễ nắm bắt và dễ soát sổ khi hợp tác ký kết cùng nhau.”

Các SOLID principles rất có thể được thực hiện để phát triển ứng dụng với mục tiêu dễ bảo trì và mở rộng khi dự án công trình phát triển. Việc vận dụng các cách thức này cũng sẽ góp phần tái cấu tạo codebase lịch sự trạng thái dễ bảo trì hơn hoặc thậm chí vận dụng các phương pháp Agile!

Nói một cách đối chọi giản, các nguyên tắc xây dựng của Martin và Feathers khích lệ lập trình viên tạo ra những phần mềm dễ bảo trì, dễ dàng nắm bắt và linh động hơn. Toàn bộ những ai đã từng lập trình cũng mọi biết rằng bảo trì code (như là thêm chức năng, sửa lỗi,…) new là phần tốn nhiều thời hạn nhất trong quy trình phát triển.

Nhờ tất cả SOLID, khi các ứng dụng cách tân và phát triển quy mô, bạn cũng có thể giảm độ phức tạp và hạn chế những vấn đề rủi ro trong tương lai.

Việc làm Developer TP. HCM

Việc làm Developer Hà Nội

5 cách thức SOLID là gì?

Vậy thì SOLID principles là gì? SOLID principles là năm nguyên tắc xây cất hướng đối tượng. Chúng là 1 trong bộ quy tắc và các phương thức đã được kiểm hội chứng và đúc kết bởi các lập trình viên cần tuân theo khi thiết kế cấu trúc class.

Ngoài ra, bạn cũng có thể ghi lưu giữ thêm một vài design Pattern thông dụng trong lập trình sẵn hướng đối tượng người tiêu dùng OOP vị ITviec tổng hợp.

SOLID là viết tắt từ năm chữ loại đầu của năm qui định sau:

S
ingle ResponsibilityOpen/ClosedLiskov SubstitutionInterface SegregationDependency Inversion

Mặc dù phần lớn khái niệm này thoạt nghe dường như khó hiểu và cạnh tranh áp dụng, nhưng mà sau bài viết này đương nhiên ví dụ code đối kháng giản, chúng ta có thể hiểu SOLID là gì và áp dụng được ngay. Trong phần tiếp theo sau của bài bác viết, bọn họ sẽ đi sâu vào 5 SOLID principles này, kèm lấy một ví dụ minh họa cực kì dễ hiểu mang lại từng nguyên tắc.

Single responsibility Principle – nguyên tắc Đơn nhiệm

Nội dung hiệ tượng Đơn nhiệm như sau:

Một class nên làm có một nhiệm vụ. Rộng nữa, mỗi class nên làm có một vì sao để thế đổi.

Vì sao nguyên tắc Đơn nhiệm lại đặc trưng như vậy?

Trước hết, do nhiều team khác nhau có thể làm câu hỏi trong cùng một dự án nên nếu như một class có tương đối nhiều hơn một trách nhiệm, thì những team kia phải thao tác làm việc trên và một class và chỉnh sửa cùng một class bởi những vì sao khác nhau, điều này hoàn toàn có thể dẫn đến những module không tương thích.

Lý vì thứ hai, hiệ tượng Đơn nhiệm giúp cho việc điều hành và kiểm soát phiên bạn dạng trở nên thuận tiện hơn. Ví dụ: trả sử ta có một persistence class dùng làm xử lý các hoạt động của cơ sở dữ liệu và họ nhận thấy tất cả một biến hóa trong tệp đó ở Git
Hub commit. Bằng cách làm theo nguyên tắc Đơn nhiệm, bọn họ sẽ thuận tiện biết rằng biến đổi đó liên quan đến lưu trữ hay liên quan đến cửa hàng dữ liệu.

Ví dụ: Ta hãy nhìn vào một trong những class đại diện thay mặt cho một cuốn sách đối chọi giản:

public class Book private String name; private String author; private String text; //constructor, getters với settersTrong đoạn code này, họ lưu trữ tên, người sáng tác và văn bạn dạng được link với một phiên bạn dạng của Book.

Bây giờ bọn họ hãy thêm một vài cách tiến hành để truy tìm vấn văn bản:

public class Book private String name; private String author; private String text; //constructor, getters cùng setters //các phương thức liên quan trực tiếp đến thuộc tính Book public String replace
Word
In
Text(String word, String replacement
Word) return text.replace
All(word, replacement
Word); public boolean is
Word
In
Text(String word) return text.contains(word); Để tương khắc phục chứng trạng “thiếu trơ trẽn tự” trên, họ nên tiến hành một class riêng rẽ chỉ xử lý việc in văn bản:

public class Book
Printer //phương thức mang đến văn bạn dạng đầu ra void print
Text
To
Console(String text) //code dùng để định dạng và in văn phiên bản void print
Text
To
Another
Medium(String text) //code dùng để viết cho những phương tiện khác Chúng ta không những phát triển một class giúp giảm bớt nhiệm vụ in Book mà họ còn hoàn toàn có thể tận dụng class Book
Printer để gửi văn phiên bản tới những phương một thể khác. Dù đó là email, nhật ký kết hoạt động, hay ngẫu nhiên phương nhân tiện gì, bọn họ đang có một class riêng dành riêng cho nhiệm vụ này.

Open/closed principle – bề ngoài Mở/đóng

Nội dung hiệ tượng Mở/đóng như sau:

Các đối tượng người sử dụng hoặc thực thể cần “mở cửa” với mở rộng nhưng “đóng cửa” với sửa đổi.

Trong đó:

Mở rộng tức là thêm chức năng mới vào class hiện nay có.Sửa đổi tất cả nghĩa là biến đổi code của một class hiện có.

Vì vậy, nội dung chế độ Mở/đóng bao gồm nghĩa là: chúng ta có thể thêm chức năng mới nhưng mà không đề xuất đụng vào code hiện gồm của class.

Nguyên nhân là do bất cứ lúc nào ta sửa thay đổi code hiện nay có, luôn luôn sẽ có nguy hại tạo ra những lỗi tiềm ẩn. Do vậy, nếu bao gồm thể, bọn họ nên tránh va vào code sẽ được khám nghiệm và đang hoạt động ổn.

Vậy thì làm rứa nào để chúng ta thêm tính năng mới mà không phải đụng vào class đó? họ chỉ cần kế thừa hoặc thiết lập class đó. Hãy cho với ví dụ như sau:

Hãy test tưởng tượng bọn họ đang xúc tiến một class Guitar. Đây là một chiếc guitar hoàn hảo và có cả nút chỉnh âm lượng:

public class Guitar private String make; private String model; private int volume; //constructors, getters và settersSau một vài ba tháng, chúng ta thấy rằng Guitar chú ý hơi chán và ta ao ước thêm kiểu thiết kế hình ngọn lửa để gia công cho dòng guitar này trông “chất” hơn.

Lúc này đây, sẽ sở hữu một vài bạn muốn mở class Guitar ra và thêm ngay hoa văn ngọn lửa vào đó tuy nhiên ai hiểu rằng những lỗi nào có thể xuất hiện nay trong ứng dụng nếu họ làm như vậy.

Thay vào đó, hãy tuân theo phép tắc Mở/đóng và chỉ cần mở rộng lớn class Guitar:

public class Super
Cool
Guitar
With
Flames extends Guitar private String flame
Color; //constructor, getters và settersBằng cách mở rộng class Guitar, ta tất cả thể chắc hẳn rằng rằng áp dụng hiện có sẽ không còn bị tác động gì cả.

Liskov Substitution principle – Nguyên tắc sửa chữa Liskov

Nội dung Nguyên tắc sửa chữa thay thế Liskov như sau:

Giả sử Φ(x) là 1 trong những thuộc tính tất cả thể chứng tỏ được đối với các đối tượng x thuộc một số loại T. Lúc đó, Φ(y) phải bao gồm thể chứng minh được so với các đối tượng người tiêu dùng y thuộc các loại S mà trong các số ấy S là một trong những class con của T.

Nguyên tắc này tức là mọi class bé (subclass) hoặc class dẫn xuất phải có chức năng thay cố gắng cho class đại lý hoặc class thân phụ (superclass) của chúng mà ko làm tác động đến ứng dụng.

Trong 5 SOLID principles, nguyên tắc thay thế sửa chữa Liskov là hiệ tượng trừu tượng và nặng nề hiểu nhất. Chính vì thế, cố gắng vì phân tích và lý giải thêm, chúng ta cũng có thể hiểu nhanh bởi ví dụ sau:

Giả sử chúng ta có một class hình chữ nhật để tính diện tích s của một hình chữ nhật và tiến hành các hoạt động khác như khẳng định màu sắc:

class Rectangle set
Width(width) this.width = width; set
Height(height) this.height = height; set
Color(color) // ... get
Area() return this.width * this.height; Chúng ta gần như biết rằng tất cả các hình vuông là hình chữ nhật nên bạn có thể kế thừa những thuộc tính của hình chữ nhật. Bởi chiều rộng và chiều cao phải tương tự nhau, nên chúng ta cũng có thể điều chỉnh code như sau:

class Square extends Rectangle set
Width(width) this.width = width; this.height = width; set
Height(height) this.width = height; this.height = height; Nhìn vào ví dụ này, code nên chuyển động bình thường:

let rectangle = new Rectangle();rectangle.set
Width(10);rectangle.set
Height(5);console.log(rectangle.get
Area()); // 50Ở đoạn code trên, các bạn sẽ nhận thấy rằng một hình chữ nhật đã được tạo, và chiều rộng lớn và độ cao đã được xác định. Sau đó, bạn cũng có thể tính toán diện tích chính xác.

Tuy nhiên, theo nguyên tắc sửa chữa thay thế Liskov, các đối tượng người dùng của class nhỏ cần vận động giống như các đối tượng người tiêu dùng của class cha. Tức là nếu bạn thay thế sửa chữa hình chữ nhật bằng hình vuông, code vẫn nên vận động bình thường:

let square = new Square();square.set
Width(10);square.set
Height(5);Kết quả đáng lẽ ra bắt buộc là 100, cũng chính vì set
Width(10) yêu cầu cả độ cao và chiều rộng gần như là 10. Mặc dù nhiên, chính vì set
Height(5), nên kết quả sẽ là 25.

let square = new Square();square.set
Width(10);square.set
Height(5);console.log(square.get
Area()); // 25Tuy nhiên, vậy nên sẽ phá vỡ nguyên tắc thay thế Liskov. Để khắc chế lỗi này, chúng ta cần gồm một class tầm thường cho tất cả các kiểu dáng mà vẫn chứa tất cả các phương thức thông thường mà bạn có nhu cầu các đối tượng người tiêu dùng thuộc các class con truy vấn được. Sau đó, so với các cách thức riêng lẻ, chúng ta tạo một class riêng cho hình chữ nhật và hình vuông.

class Shape set
Color(color) this.color = color; get
Color() return this.color; class Rectangle extends Shape set
Width(width) this.width = width; set
Height(height) this.height = height; get
Area() return this.width * this.height; class Square extends Shape set
Side(side) this.side = side; get
Area() return this.side * this.side; Bằng bí quyết này, bạn cũng có thể đặt màu cùng lấy màu sắc bằng các class thân phụ hoặc class con:

// superclasslet shape = new Shape();shape.set
Color("red");console.log(shape.get
Color()); // đỏ// subclasslet rectangle = new Rectangle();rectangle.set
Color("red");console.log(rectangle.get
Color()); // đỏ// subclasslet square = new Square();square.set
Color("red");console.log(square.get
Color()); // đỏ

Interface Segregation principle – nguyên lý Phân bóc tách Interface

Nội dung cơ chế Phân tách Interface như sau:

Một quý khách hàng không yêu cầu bị buộc phải thực hiện một giao diện mà người ta không sử dụng, hoặc phụ thuộc vào các phương pháp họ ko sử dụng.

Trong lấy một ví dụ này, bọn họ sẽ test “hóa thân” thành các người làm việc trong sở thú, ví dụ là vị trí quan tâm hổ.

Trước hết, hãy bước đầu với một interface dùng để làm liệt kê đông đảo đầu câu hỏi của một người âu yếm hổ.

public interface Tiger
Keeper void wash
The
Tiger(); void feed
The
Tiger(); void pet
The
Tiger();Là một người âu yếm thú năng nổ, họ sẵn sàng rửa mặt rửa và cho hổ ăn. Tuy nhiên, không phải ai cũng có đủ tài năng và lòng dũng cảm để “nựng” một chú hổ to đùng cả. Nhưng do interface của họ quá rộng, bắt buộc ta đề xuất phải tiến hành code nhằm “nựng” chú hổ ấy.

Chúng ta có thể sửa lỗi này bằng cách chia interface lớn thành tía interface riêng biệt:

public interface Tiger
Cleaner void wash
The
Tiger();public interface Tiger
Feeder void feed
The
Tiger();public interface Tiger
Petter void pet
The
Tiger();Giờ đây, nhờ tất cả sự phân bóc tách interface, ta có thể tự do thực thi chỉ các phương thức quan trọng đối với bọn chúng ta:

public class Tiger
Carer implements Tiger
Cleaner, Tiger
Feeder public void wash
The
Tiger() //Tắm rửa mà còn dơ! public void feed
The
Tiger() //Thứ 3 nạp năng lượng cá ngừ Và cuối cùng, chúng ta có thể nhường trọng trách “nựng” cho phần đông ai đầy đủ kỹ năng:

public class Skilled
Person implements Tiger
Petter public void pet
The
Tiger() //Cẩn thận các bạn nhé!

Dependency Inversion principle – phép tắc Đảo ngược Phụ thuộc

Nội dung nguyên tắc Đảo ngược phụ thuộc như sau:

Các thực thể phải phụ thuộc vào abstraction, không phải class rõ ràng hay tính năng cụ thể.

Module v.i.p không được dựa vào vào module cung cấp thấp, nhưng lại chúng đều phải dựa vào vào abstraction.

Nói một cách đối chọi giản, hình thức Đảo ngược phụ thuộc nói rằng những class nên phụ thuộc vào interface hoặc abstraction cầm vì các class và tính năng cụ thể. Điều này làm cho các class mở rộng, tuân theo qui định Mở/đóng.

Xem thêm: Cách làm content facebook “cưa đổ” khách hàng, học 7 cách viết content facebook thu hút

Để lấy ví dụ cách vận dụng của chính sách này, hãy thuộc “hoài niệm” cùng với Windows 98:

public class Windows98Machine Nhưng làm sao một chiếc máy tính xách tay lại có thể không có screen và keyboard được? Hãy thêm nó vào constructor để phần đông Windows98Machine mà bọn họ khởi tạo đều có sẵn Monitor với một Standard
Keyboard:

public class Windows98Machine private final Standard
Keyboard keyboard; private final Monitor monitor; public Windows98Machine() monitor = new Monitor(); keyboard = new Standard
Keyboard(); Với code này, chúng ta có thể sử dụng Standard
Keyboard cùng Monitor thoải mái trong class Windows98Machine.

Tuy nhiên, bằng cách khai báo Standard
Keyboard cùng Monitor với tự khóa mới, chúng ta đã liên kết chặt chẽ ba class đó lại với nhau.

Điều này không chỉ làm cho Windows98Machine khó khám nghiệm mà bọn họ còn mất khả năng chuyển đổi class Standard
Keyboard bởi một lớp khác nếu có nhu cầu. Và bọn họ cũng không thể chuyển đổi class Monitor.

Hãy bóc tách Windows98Machine thoát ra khỏi Standard
Keyboard bằng cách thêm một interface Keyboard bao quát hơn và sử dụng interface này trong class:

public interface Keyboard public class Windows98Machine private final Keyboard keyboard; private final Monitor monitor; public Windows98Machine(Keyboard keyboard, Monitor monitor) this.keyboard = keyboard; this.monitor = monitor; Ở đây, họ đang áp dụng dependency injection pattern để thêm Keyboard dependency vào class Windows98Machine.

Chúng ta cũng hãy sửa thay đổi class Standard
Keyboard để triển khai giao diện Keyboard sao cho phù hợp để chuyển vào class Windows98Machine:

public class Standard
Keyboard implements Keyboard Bây giờ, các class đã được tách rời và giao tiếp thông qua Keyboard abstraction. Trường hợp muốn, chúng ta cũng có thể dễ dàng biến đổi loại keyboard trong máy bằng cách triển khai interface khác. Chúng ta cũng có thể làm theo nguyên tắc giống như cho class Monitor.

Giờ chúng ta đã tách rời các thành phần dựa vào và có thể tự vị kiểm Windows98Machine với ngẫu nhiên framework chất vấn nào.

Tổng kết

Trong nội dung bài viết này, chúng ta đã tìm hiểu sâu về SOLID là gì và SOLID principles là gì. Nội dung bài viết bắt đầu bằng lịch sử hào hùng hình thành của SOLID và nguyên nhân vì sao những nguyên tắc này tồn tại và cần thiết trong lập trình.

Bằng bí quyết phân tích từng chữ cái 1 trong các SOLID, ITviec đã từng đi sâu vào ý nghĩa của từng nguyên tắc cũng giống như những phương pháp áp dụng tương xứng được minh họa qua ví dụ dễ dàng hiểu.

Trong nghành nghề lập trình, bài toán xây dựng những phần mềm ổn định, dễ gia hạn và mở rộng luôn là phương châm mà những nhà trở nên tân tiến theo đuổi. Để đạt được kim chỉ nam này, bộ phép tắc SOLID đóng vai trò khôn cùng quan trọng. Nội dung bài viết dưới đây đã cung cấp cho mình một cái nhìn tổng quan liêu về SOLID là gì, giải thích ví dụ từng nguyên tắc cũng tương tự hướng dẫn biện pháp áp dụng chúng vào lập trình hiệu quả.


SOLID là gì?

SOLID là viết tắt của 5 nguyên tắc kiến thiết hướng đối tượng người sử dụng do Robert C. Martin và Michael Feathers đề xuất. Nhờ vận dụng SOLID, xây dựng viên hoàn toàn có thể viết ra mọi đoạn code dễ dàng đọc, dễ hiểu và dễ bảo trì.

*
Solid là viết tắt của 5 nguyên tắc thi công hướng đối tượng

5 phép tắc trong SOLID bao gồm:

Single Responsibility Principle (SRP) – Nguyên tắc trọng trách đơn lẻ.Open/Closed Principle (OCP) – chế độ mở/đóng.Liskov Substitution Principle (LSP) – Nguyên tắc sửa chữa Liskov.Interface Segregation Principle (ISP) – phép tắc phân bóc tách giao diện.Dependency Inversion Principle (DIP) – Nguyên tắc đảo ngược phụ thuộc.

Tổng quan lại về SOLID

Lập trình hướng đối tượng người sử dụng (Object Oriented Programming – OOP) là 1 trong trong những phương thức lập trình thông dụng nhất hiện nay. Nhờ vào những điểm sáng nổi nhảy như tính trừu tượng, đóng gói, thừa kế và đa hình, OOP góp lập trình viên giải quyết và xử lý các vấn đề thực tế một giải pháp hiệu quả:

Tính trừu tượng (Abstraction): chất nhận được tạo ra những lớp mô rộp các đối tượng người tiêu dùng thực tế trong nhân loại thật.Tính gói gọn (Encapsulation): bảo vệ dữ liệu bên phía trong lớp với chỉ hỗ trợ các phương thức truy cập an toàn.Tính thừa kế (Inheritance): Tái sử dụng code hiệu quả bằng cách cho phép những lớp thừa kế tính năng từ những lớp cha.Tính đa hình (Polymorphism): có thể chấp nhận được thực hiện nay một hành vi theo nhiều cách khác biệt tùy nằm trong vào loại đối tượng người tiêu dùng cụ thể.
*
OOP là một trong những phương pháp lập trình phổ biến

Tuy nhiên, bài toán kết hợp hiệu quả các đặc thù này không hẳn điều dễ dàng dàng. Hình thức SOLID thành lập và hoạt động nhằm xử lý vấn đề này, giúp các lập trình viên viết mã OOP một cách công dụng hơn.

Lợi ích của SOLID

Khi áp dụng SOLID vào viết code, thiết kế viên sẽ nhận ra nhiều công dụng như:

Giảm thiểu sự phức tạp: SOLID giúp chia bé dại phần mượt thành các thành phần độc lập, mỗi thành phần phụ trách một tác dụng riêng biệt. Dựa vào vậy, code trở đề xuất dễ đọc, dễ hiểu và dễ dãi sửa thay đổi hơn.Dễ dàng gia hạn và mở rộng: Khi đề xuất thay đổi, bạn chỉ việc tác động vào 1 phần nhỏ cầm vì ảnh hưởng đến tổng thể hệ thống. Nhờ vậy, việc gia hạn và mở rộng ứng dụng trở nên đơn giản và dễ dàng và công dụng hơn, nhất là đối với những dự án lớn.Tăng tính linh hoạt và kỹ năng tái sử dụng: các thành phần được thiết kế theo phong cách linh hoạt, có thể dễ dàng vận dụng vào các dự án khác nhau, nhờ đó tiết kiệm thời hạn và chi tiêu cho việc cách tân và phát triển phần mềm.

5 nguyên lý SOLID và biện pháp sử dụng

Dù ai đang muốn tò mò SOLID trong Java xuất xắc SOLID vào C# thì những cần nắm rõ 5 nguyên lý chính sau:

Single responsibility principle

Nguyên tắc cốt lõi: Mỗi lớp chỉ nên đảm nhiệm một nhiệm vụ cụ thể.

Single responsibility là nguyên tắc đầu tiên, ứng cùng với chữ “S” vào bộ qui định SOLID, nhấn mạnh rằng mỗi lớp chỉ nên đảm nhận một nhiệm vụ duy nhất. Việc gán quá nhiều nhiệm vụ cho 1 lớp sẽ khiến lớp này trở nên phức tạp, nặng nề hiểu và khó khăn bảo trì. Trong ngành IT, yêu cầu thay đổi và bổ sung cập nhật chức năng là điều liên tục xảy ra nên việc sở hữu code rõ ràng, dễ dàng nắm bắt là vô cùng quan trọng.

*
Nguyên tắc này nói rằng mỗi lớp chỉ nên phụ trách một nhiệm vụ duy nhất

Ví dụ:

Hãy tưởng tượng một công ty ứng dụng có 3 vị trí công việc: thiết kế viên (developer), kiểm thử ứng dụng (tester) cùng nhân viên bán hàng (salesman). Từng nhân viên sẽ sở hữu được một dịch vụ và thực hiện công việc tương ứng. Vậy chúng ta có nên xây cất lớp “Employee” với trực thuộc tính “position” với 3 phương thức develop
Software(), test
Software() và sale
Software() không?

Câu vấn đáp là KHÔNG.

Hãy hình dung nếu bao gồm thêm vị trí làm chủ nhân sự, các bạn sẽ phải sửa thay đổi lớp “Employee” và thêm cách tiến hành mới. Vậy nếu gồm thêm 10 địa chỉ khác thì sao? lúc đó, các đối tượng người dùng được tạo nên sẽ có khá nhiều phương thức dư thừa. Ví dụ, developer không cần sử dụng hàm test
Software() cùng sale
Software(), và việc thực hiện sai phương thức rất có thể dẫn đến hậu quả nghiêm trọng.

Áp dụng vẻ ngoài Single Responsibility

Hãy tạo một lớp trừu tượng “Employee” với cách thức working(). Sau đó, thừa kế từ lớp này để tạo nên 3 lớp cầm thể: Developer, Tester với Salesman. Từng lớp sẽ triển khai phương thức working() riêng biệt theo công dụng của từng vị trí. Nhờ vào vậy, câu hỏi nhầm lẫn cách tiến hành sẽ không hề xảy ra.

Open/Closed principle

Nguyên tắc cốt lõi: Không sửa đổi lớp tất cả sẵn, cố vào đó hãy mở rộng bằng kế thừa.

Open/Closed là cơ chế thứ hai trong SOLID, tương xứng với chữ “O” nhấn mạnh rằng lúc cần bổ sung chức năng mang đến chương trình, ta nên tạo lớp mới thừa kế (hoặc sử dụng) lớp cũ rứa vì chỉnh sửa trực tiếp lớp hiện tại tại. Điều này khiến chương trình có không ít lớp hơn, cơ mà bù lại ta không phải kiểm thử lại các lớp cũ mà chỉ triệu tập vào những lớp mới.

*
Đây là cơ chế khi cần bổ sung chức năng cần tạo một lớp new để kế thừa

Tuy nhiên, việc mở rộng chức năng thường kèm theo với việc viết thêm code. Để xây dựng module thuận tiện mở rộng nhưng mà không bắt buộc sửa đổi code nhiều, ta cần bóc tách biệt phần dễ thay đổi khỏi phần khó thay đổi, đảm bảo không tác động đến đầy đủ phần còn lại.

Ví dụ:

Giả sử chúng ta có một tờ Connection
Manager dùng để cai quản kết nối cho cơ sở tài liệu (CSDL). Ban đầu, lớp này chỉ hỗ trợ kết nối với SQL Server cùng My
SQL.