簡體   English   中英

避免在C#工廠方法中使用多個if語句

[英]Avoiding multiple if statements in C# factory method

我有將數據存儲在NoSQL database中的C# application 該應用程序具有一個存儲庫類,該存儲庫類使用一系列對象將數據從NoSQL形式轉換為C#模型使用的形式,反之亦然(本質上是ORM形式)。 這些對象實現一個converter接口,並且每個對象都使用一種特定的data type (string, bool, etc) 在內部,他們使用反射來執行轉換。 這些對象的實例由返回給定類型的對象的方法創建。 當前的邏輯如下所示:

if(type == typeof(string)
    return new StringConverter(...);

if(type == typeof(int) || type == typeof(uint))
    return new IntegerConverter(...);

... // and so on

但是,所有這些if陳述困擾着我。 我知道我可以做些類似創建字典來將類型映射到創建方法的事情,但是我不確定這是否會導致可讀性更高,易於維護/擴展的代碼(?)。 鑒於需要創建類型抽象,執行此操作的最佳方法是什么? 任何建議歡迎。 在此先感謝。

理想情況下,您要避免嵌套的if-statements 我引用了Microsoft的《完整代碼》書。 這個想法是當您嵌套多達3個級別時,開發人員將保持代碼的注意力,或者隨着開發人員的大量減少而將注意力集中在代碼上。 在您的情況下,如果您的邏輯必須進行硬編碼,則無法繞開一系列if語句。 但是,解決此問題的明智方法是遵循Factory設計模式。(四人幫)

您應該將if代碼導出為工廠類。

如您在這里看到的,工廠是一個GoF模式,它產生不同類型的對象。

在工廠類中,這種int數量是可以的。

您應該只避免嵌套if語句,否則它們會使您的代碼不可讀

在可讀性方面,您應該更喜歡

switch(type.FullName){
  case(typeof(int).FullName) => //your logic
  ...
}

switch-case-Statement比If-Else更具可讀性,並且可以更快。 在這里您可以閱讀更多有關它的信息:

對於僅有的幾項,差異很小。 如果您有很多物品,則一定要使用開關。

如果一個開關包含五個以上的項目,則使用查找表或哈希表來實現。 這意味着,與if:s列表相比,所有項目都具有相同的訪問時間,在if:s列表中,最后一個項目需要花費更多的時間,因為它必須首先評估每個先前條件。

正如其他人已經說過的那樣,將您的switch-case外包給工廠類別。

我認為,將類型映射到字典的想法是您最好的選擇,因為它實現了Strategy模式,並且本身具有很強的表現力。

var converterStrategies = new Dictionary<Object, IConverter>();
converterStrategies.Add(typeOf(string), new StringConverter(...));

然后在傳遞引用類型時使用TryGetValue。

您可能會考慮讓此字典成為類的私有成員,並在包含類的初始化時填充它。

加里·麥克萊恩·霍爾(Gary McLean Hall)在他的《通過C#編寫的自適應代碼》中演示了這種模式,在這種情況下,它對我有很大幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM