Chapter 3 - Item 27 : Augment Minimal Interface Contracts with Extension Methods

Effective C# (Covers C# 6.0), (includes Content Update Program): 50 Specific Ways to Improve Your C#, 3rd Edition By Bill Wagner 讀後心得

在介面設計上可利用擴充方法擴充原有介面,利用擴充方法擴充介面有幾個好處:

1. 無需修改原有介面,維持介面簡單。

2. 擴充方法設計可彈性運用,讓方法更明確表達自身意義。

範例一:

public static class Comparable
{
    public static bool greaterThan<T>( this T left, T right )
        where T : IComparable<T> =>
        left.CompareTo( right ) > 0;

    public static bool greaterThanEqual<T>( this T left, T right )
        where T : IComparable<T> =>
        left.CompareTo( right ) >= 0;

    public static bool lessThan<T>( this T left, T right )
        where T : IComparable<T> =>
        left.CompareTo( right ) < 0;

    public static bool lessThanEqual<T>( this T left, T right )
        where T : IComparable<T> =>
        left.CompareTo( right ) <= 0;
}

在這個例子裡,T 被限制需實作 IComparable<T>。雖然可直接呼叫 CompareTo 比較物件相對大小關係,但其回傳值為 int 較不直覺。利用擴充方法明確命名比較方法並回傳布林值,能讓呼叫端更能了解方法回傳值所代表的意義。

範例二:

public interface IFoo
{
    int Maker { get; set; }
}

public class Mytype : IFoo
{
    public int Maker { get; set; }

    public void nextMaker( ) => Maker += 5;
}

public static class FooExtendsions
{
    public static void nextMaker( this IFoo thing ) =>
        thing.Maker += 1;
}

實作擴充方法時,需注意類別內部定義的方法與擴充方法是否有衝突。在此例中,nextMaker 有兩個呼叫版本,應維持同樣名稱的方法回傳相同結果,避免誤會。

結論:
1. 定義最小化介面,其餘利用擴充方法設計。

2. 利用擴充方法無需破壞原本介面設計,降低不相容風險。