[英]The use of C# extension methods to show intention
假設我有一個類A
,它具有一些狀態:
class A
{
// Ctor etc.
string Foo { get; private set; }
string Bar { get; private set; }
}
整個我的代碼庫都使用該類來保存應用程序狀態。 最終,此狀態被寫入XML文件以進行保存。 自然,我將寫一個方法來做到這一點:
class A
{
// Ctor, the state, etc.
public string ToXml()
{
// Writer implementation goes here
return xmlString;
}
}
ToXml
不需要訪問A
的任何私有/受保護實例變量,它僅使用使用A
的公共接口。 既然是這樣,我可以將ToXml
實現為擴展方法:
class A
{
// Ctor, the state, etc.
public static string ToXml(this A instance)
{
// Same deal as above
return xmlString;
}
}
擴展方法只能使用它正在擴展的類的外部接口。 因此,忽略擴展方法的主要用途(擴展鎖定的類,語義幫助程序),SO社區對使用擴展方法的唯一目的是傳達一種方法僅使用類的外部接口的看法?
我之所以這樣問,是因為我個人大量使用擴展方法(也許是因為我喜歡函數式編程),但是我的同事卻不喜歡這樣做的理由,因為我想傳達“這種特定方法肯定只使用了類的公共接口”。 。
注意 :這些擴展方法將代替它們的實例等效項。 因此,擴展方法不會出現任何常見的名稱空間問題。 這個問題完全集中在“溝通意圖”方面。
擴展方法是“ 開放/封閉原則”的一個示例。 也就是說,它可以擴展,但是可以修改。
使用擴展方法的主要好處是您不必重新編譯正在擴展的類,因此不必重新編譯依賴的代碼。 同樣,通過不更改接口,您不必擔心任何代碼都取決於它的破壞情況。
如果您認真對待SOLID原則,那么這是一個有效的論點。 大多數開發人員都不知道大驚小怪。
您有一個類A
,它具有特定的職責:保存一組不可變的數據。 如果現在添加新方法ToXml
,則您的類不再具有特定的職責; 它有兩個松散相關的職責:保存數據並將該數據轉換為另一種形式。
因此,為了保留單一職責原則,此類與損失相關的功能應存在於另一個類中,例如DataTransformationsOnA
。 由於該方法是純函數(它會從輸入中創建確定的輸出而沒有任何副作用,因此應將其設為靜態方法。因此,可以將其設為擴展方法:
static class DataTransformationsOnA
{
public static string ToXml(this A instance)
{
// generate xmlSTring from instance
return xmlString;
}
// other transformation methods can also be placed in this class
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.