透過「介面隔離原則 (ISP)」可以解決「Liskov 替換原則」的問題,我們儘量使用介面取代具體的實作類別建構應用程式,而介面的設計要特別注意儘量根據特定需求來定義其規格,以多個小型介面來取代單一大型介面,將特定的功能規格定義在專屬的小型介面。
以下直接調整「Liskov 替換原則」一篇所討論的範例,進一步切割介面功能。
建立另外一個介面IUnitConversionUK,將方法ConversionsUK定義在這個介面中:
現在將英制單位轉換規格隔離,建立於獨立介面 IUnitConversionUK,接下就可以藉由專注特定功能的介面設定避免不必要的實作,導致應用程式發展過程的問題。
OZConversion 同時需要實作英制轉換,因此一併實作了 IUnitConversionUK 介面,ConversionsUK 方法的轉換參數則是英制比例 0.035195。TemperatureConversion 則是回復至單純僅實作 IUnitConversion 介面。
現在切換至 HomeController.cs 修改其中的UnitConversionUK 方法,這一次傳入的參數必須調整為 IUnitConversionUK 介面型別:
現在 OZConversion 物件可以傳入 UnitConversion方法取得美制盎司的轉換結果,或是傳入 UnitConversionUK 取得英制盎司的轉換結果,同理,TemperatureConversion 物件則只能傳入 UnitConversion 方法。
以下直接調整「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 方法。
沒有留言:
張貼留言