C# 範例解釋物件導向程式設計中的介面隔離原則

2022-07-13 21:00:42

在物件導向程式設計中,SOLID 是五個設計原則的首字母縮寫,旨在使軟體設計更易於理解、靈活和可維護。這些原則是由美國軟體工程師和講師羅伯特·C·馬丁(Robert Cecil Martin)提出的許多原則的子集,在他2000年的論文《設計原則與設計模式》中首次提出。

SOLID 原則包含:

本文我們來介紹介面隔離原則

介面隔離原則

介面隔離原則(Interface segregation principle,ISP)認為「多個特定使用者介面要好於一個寬泛用途的介面」。

它指明使用者(client)不應被迫使用對其而言無用的方法或功能。介面隔離原則將龐大臃腫的介面拆分成為更小、更具體的介面,讓使用者僅需知道他們感興趣的方法。這種縮小了的介面也被稱為角色介面(role interfaces)。介面隔離原則的目的是將系統解耦,從而使其易於重構、更改和重新部署。

C# 範例

糟糕的示範

建立一個包含公司部門的 ICompanyDepartment 介面。

interface ICompanyDepartment
{
    public void AdminDepartment();
    public void FinanaceDepartment();
    public void HRDepartment();
    public void ITDepartment();
}

讓我們首先為 A 公司實現 ICompanyDepartment 介面,檔名為 ACompany.cs

class ACompany : ICompanyDepartment
{
    public void AdminDepartment()
    {
        //DO SOMETHING
    }
    public void FinanaceDepartment()
    {
        //DO SOMETHING
    }
    public void HRDepartment()
    {
        //DO SOMETHING
    }
    public void ITDepartment()
    {
        //DO SOMETHING
    }
}

假如現在有一個從事製造業的 B 公司,他們沒有 IT 部門,而多了一個生產部門,那麼上面的實現就有問題了。

如果在介面 ICompanyDepartment 上新增一個 ManufacturingDepartment 生產部門,那我們就不得不在 ACompanyBCompany 兩個類上都實現該簽名。

也就是說,為了使用 ICompanyDepartment 介面,我們不得不在 ACompany 類上實現不必要的 ManufacturingDepartment 方法,在 BCompany 類上實現不必要的 ITDepartment 方法。這明顯違反了介面隔離原則

為了使其符合介面隔離原則,我們需要進行一些修改。

正確的示範

根據介面隔離原則,我們要將 ITDepartmentManufacturingDepartment 方法從介面 ICompanyDepartment 拆分出來,形成兩個獨立的角色介面

  1. IACompanyUniqueFeature
  2. IBCompanyUniqueFeature

這樣我們就擁有了三個介面:

interface ICompanyDepartment
{
    public void AdminDepartment();
    public void FinanaceDepartment();
    public void HRDepartment();
}
interface IACompanyUniqueFeature
{
    public void ITDepartment();
}
interface IBCompanyUniqueFeature
{
    public void ManufacturingDepartment();
}

ACompanyBCompany 的實現如下:

class ACompany : ICompanyDepartment, IACompanyUniqueFeature
{
    public void AdminDepartment()
    {
        //DO SOMETHING
    }
    public void FinanaceDepartment()
    {
        //DO SOMETHING
    }
    public void HRDepartment()
    {
        //DO SOMETHING
    }
    public void ITDepartment()
    {
        //DO SOMETHING
    }
}

class BCompany : ICompanyDepartment, IBCompanyUniqueFeature
{
    public void AdminDepartment()
    {
        //DO SOMETHING
    }
    public void FinanaceDepartment()
    {
        //DO SOMETHING
    }
    public void HRDepartment()
    {
        //DO SOMETHING
    }
    public void ManufacturingDepartment()
    {
        //DO SOMETHING
    }
}

這樣,以上的介面設計便遵循了介面隔離原則

總結

本文我介紹了 SOLID 原則中的介面隔離原則(Interface segregation principle),並通過 C# 程式碼範例簡明地詮釋了它的含意和實現,希望對您有所幫助。

作者 : 技術譯民
出品 : 技術譯站


參考檔案: