【公告】網站目前停止所有的課程訂閱服務,原有學員權益不受影響,造成不便還請見諒,我們正在打造更多課程以及圖書,未來將會合併且擴充目前的課程內容,提供全新課程訂閱服務,感謝學員的支持。

SOLID 設計原則 - 介面隔離原則(ISP)

透過「介面隔離原則 (ISP)」可以解決「Liskov 替換原則」的問題,我們儘量使用介面取代具體的實作類別建構應用程式,而介面的設計要特別注意儘量根據特定需求來定義其規格,以多個小型介面來取代單一大型介面,將特定的功能規格定義在專屬的小型介面。

以下直接調整「Liskov 替換原則」一篇所討論的範例,進一步切割介面功能。

建立另外一個介面IUnitConversionUK,將方法ConversionsUK定義在這個介面中:

public interface IUnitConversion
{
    double Conversions(double d);
}
public interface IUnitConversionUK
{
    double ConversionsUK(double d);
}

現在將英制單位轉換規格隔離,建立於獨立介面 IUnitConversionUK,接下就可以藉由專注特定功能的介面設定避免不必要的實作,導致應用程式發展過程的問題。

public class OZConversion : IUnitConversion, IUnitConversionUK
{
    public double Conversions(double o)
    {
        double c = 0.033814;
        double ml = o / c;
        return ml;
    }
    public double ConversionsUK(double o)
    {
        double c = 0.035195;
        double ml = o / c;
        return ml;
    }
}
public class TemperatureConversion : IUnitConversion
{
    public double Conversions(double c)
    {
        double f = c * 9 / 5 + 32;
        return f;
    }
}

OZConversion 同時需要實作英制轉換,因此一併實作了 IUnitConversionUK 介面,ConversionsUK 方法的轉換參數則是英制比例 0.035195。TemperatureConversion 則是回復至單純僅實作 IUnitConversion 介面。

現在切換至 HomeController.cs 修改其中的UnitConversionUK 方法,這一次傳入的參數必須調整為 IUnitConversionUK 介面型別:

double UnitConversion(IUnitConversion conversion, double d)
{
    double result = conversion.Conversions(d);
    return result;
}
double UnitConversionUK(IUnitConversionUK conversion, double d)
{
    double result = conversion.ConversionsUK(d);
    return result;
}

現在 OZConversion 物件可以傳入 UnitConversion方法取得美制盎司的轉換結果,或是傳入 UnitConversionUK 取得英制盎司的轉換結果,同理,TemperatureConversion 物件則只能傳入 UnitConversion 方法。




沒有留言: