[英]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設計模式。(四人幫)
在可讀性方面,您應該更喜歡
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.