Interface Segregation Principle là gì?

The interface Segregation Principle (ISP) được phát biểu như sau.

“Clients should not be forced to depend on methods that they do not use”

Phần mềm nên tránh bị phụ thuộc vào những thứ chúng không sử dụng.

Ví dụ:

Sample interface
SampleClass1, SampleClass2, SampleClass3 cùng mở rộng ISampleInterface.

Vì nhu cầu mở rộng nên SampleClass1 và SampleClass2 cần một Method3 để thực hiện tính toán. Nếu thêm Method3 vào ISampleInterface, chuyện gì sẽ xảy ra?

SampleClass1 và SampleClass2 đạt được mục đích của mình đó là Method3, tuy nhiên SampleClass3 sẽ phải thêm cả Method3 vào, mặc dù không có nhu cầu sử dụng chúng. Điều này sẽ vi phạm nguyên tắc ISP. Phần mềm nên tránh bị phụ thuộc vào những thứ chúng không sử dụng.

Giải quyết vấn đề:
ISP gợi ý rằng chúng ta nên sử dụng các Interface mỏng (thin) chứa một vài phương thức, thay vì một interface bự (fat) chứa nhiều phương thức khác nhau. Điều này sẽ dễ dàng hơn cho việc mở rộng phần mềm sau này.

Để giải quyết vấn đề trên, ta chỉ cần thêm một Interface khác có chứa Method 3, và để SampleClass1, Sample Class2 mở rộng interface đó.

Chia cắt interface

Chia cắt interface

 

Ví dụ thực tế:

Để thực hiện quyền đăng nhập, đăng xuất, đăng ký, quên mật khẩu bạn quyết định sử dụng interface sau.

public interface IMembership
{
   bool Login(string username, string password);
   void Logout(string username);
   Guid Register(string username, string password, string email);
   void ForgotPassword(string username);
}

Khi app cần login, app chỉ cần gọi Login, khi cần Logout, app chỉ cần gọi Logout. Tuy nhiên, với một số form đặc thù như đăng nhập, đăng xuất, bạn chỉ cần Login/Logout.

Nếu LoginForm sử dụng cả bốn hàm trên rõ ràng nó đã vi phạm nguyên tắc ISP.

Do vậy ta phải tạo một ILogin interface chỉ chứa hai hàm Login và Logout.

public interface ILogin
{
 bool Login(string username, string password);
 void Logout(string username);
}

public interface IMembership : ILogin
{
 Guid Register(string username, string password, string email);
 void ForgotPassword(string username);
}

Vấn đề tương tự với Register và ForgotPassword, do vậy ta phải chia cắt IMemberShipI thành 2 interface nhỏ đó là IRegister và IForgotPassword.

public interface ILogin
{
 bool Login(string username, string password);
 void Logout(string username);
}
public interface IRegister
{
 Guid Register(string username, string password, string email);
}
public interface IForgotPassword
{
 void ForgotPassword(string username);
}

public interface IMembership : ILogin, IRegister, IForgotPassword
{
}

Như vậy, IMemberShip đã bị chia cắt tử một interface bự (fat) ban đầu thành 3 interface nhỏ (thin). Điều này vừa giúp các form trong phần mềm của bạn mở rộng dễ dàng hơn do không phải quan tâm đến các interface mà nó không sử dụng.

Mẹo chia cắt interface:

Khi chia cắt các interface, các interface phải gắn kết với nhau, tức là những hoạt động tương tự nhau nên đưa vào chung một interface, như Login, Logout.

Ích lợi của Interface Segregation Principle:

Fat Interface

Fat Interface

Nếu bạn chia cắt interface đúng đắn, bạn sẽ đảm bảo rằng các thành phần chỉ sử dụng những thứ chúng cần, qua đó phần mềm sẽ nhẹ nhàng hơn, dễ bảo trì hơn.

Thin Interface

Thin Interface

Các môn học khác

SQL là ngôn ngữ truy vấn mang tính cấu trúc, nó cho phép bạn truy cập và sử dụng database.

Khóa học này cung cấp cho ta kiến thức nền tảng về công nghệ Blockchain, Bitcoin. Vì sao nó được gọi là công nghệ của tương lai, vì sao giá Bitcoin lại cao đến vậy. Làm sao để mua Bitcoin, ETH.

Chương trình thường được xây dựng quanh dữ liệu và logic để xử lý chúng. Nói cách khác: Program = Cấu trúc dữ liệu + giải thuật. Do vậy đây là môn học bắt buộc dành cho các lập trình viên.