2010-05-07 39 views
2

我盡我最大的努力寫了一個改進版,但失敗了。我們可以避免多個,如果'是?

inFiles.ToList().ForEach(i => 
{ 
    filePath = inFolder + "\\" + i.Value; 

    if (i.Key.Equals(replacementFile)) 
    { 
     replacementCollection = GetReplacementDataFromFile(filePath); 
    } 
    else if (i.Key.Equals(standardizationFile))  
    { 
     standardizationCollection = GetStandardizationDataFromFile(filePath); 
    }     
}); 

的問題是,我不能使用開關的情況下在這裏,因爲對比參數不是恆定的。

請幫助改進此代碼。

我正在使用C#(3.0)。

感謝

+10

爲什麼你覺得這有問題嗎? – Robin 2010-05-07 13:48:22

+0

我不知道,@Robin,有一些奇怪的事情,至少有一件壞事。 – Will 2010-05-07 13:58:16

+1

@Newbie這是一個問題目的代碼的縮短版本嗎?如果沒有,那麼我認爲這個代碼是好的 - 我從一個快速瀏覽中理解代碼,我認爲這是主要的。長如果陳述是一種潛在的「代碼異味」,並且你試圖改進,但如果陳述本身不是一個目標,那就太棒了。 – 2010-05-07 14:12:12

回答

9

您擁有的代碼沒有過多的if。

您似乎有三種可能性:屬於替換,屬於標準化,屬於這兩者之一。你有什麼是一個高效,可讀的方式來做到這一點。

我會保持它的樣子。

+0

呃...我會+1但是他需要修復該路徑連接。 – Will 2010-05-07 14:09:03

+0

先生,實際上它有5/6如果..但我只輸2 – Newbie 2010-05-07 14:14:32

+4

@Newbie:那麼有點改變的事情,不是嗎?請發佈完整的代碼清單,以便我們看到發生了什麼。 – FrustratedWithFormsDesigner 2010-05-07 14:17:40

-2

我的版本:

foreach(var file in inFiles) 
{ 
    filePath = Path.Combine(inFolder, file.Value); 
    if(file.Key.Equals(replacementFile)) 
    { 
    replacementCollection = GetReplacementDataFromFile(filePath); 
    // ATTENTION ATTENTION LOOP CONTINUATION STATEMENT FOLLOWS 
    continue; 
    // THIS CONCLUDES OUR USE OF THE LOOP CONTINUATION STATEMENT 
    } 
    if (file.Key.Equals(standardizationFile)) 
    standardizationCollection = GetStandardizationDataFromFile(filePath); 
} 

不知道爲什麼你要ToList和foreach,但它不會提高可讀性的。另外,你的路徑連接不好。始終使用路徑類型執行文件路徑操作。我也不喜歡堆疊if語句,所以我通常使用gate語句;我將退出/快捷方式或循環而不是else if。有些人認爲這是一個不好的做法(單一入口,邏輯單一退出),但我認爲他們充滿了。

+4

那些有意見的人可能會充滿它,但是你還沒有讓代碼更具可讀性,遠非如此。在仔細查看代碼的時候,很容易錯過沒有像CodeRush這樣的生產力工具的繼續語句,這些工具會讓這些事情更加引人注目。你究竟有多少行代碼可以避免?恰好兩個。 – 2010-05-07 14:02:05

+0

@dave lol容易錯過繼續聲明?我想這很容易錯過任何特定的陳述,在這種情況下,你對這種方法的精神描述將是不正確的。但是,我不明白這是如何使任何特定的方法壞,因爲你誤讀它。這是一個愚蠢的聲明。另外,這個例子非常簡單,就像SO上給出的大多數代碼示例一樣。它們通常用大量的'if else'或嵌套'if'語句表示更多複雜的方法。這種方法也可以用來簡化這些。 – Will 2010-05-07 14:05:24

+4

不是,威爾:根據定義,更容易被誤讀的代碼是不易讀的。生成可讀代碼幾乎與生成功能代碼一樣重要,所以我肯定會說這會讓你的解決方案「不好」。除此之外,您的解決方案不會模仿原始代碼的行爲,因爲您沒有第二個條件(您基本上正在執行'else'而不是'else if')。 – 2010-05-07 14:12:16

1

如果您有巨大的邏輯,您可以使用Replace Conditional with Polymorphism重構。

+0

如果您基於類型進行切換,那真的只會起作用。 – 2010-05-07 14:07:30

+2

對我來說,創建智能類型(用戶定義類型)是最重要的一塊,而OO設計系統.i總是會認爲如果我有過多的if/else,循環並將它們重構爲正確的類型 – 2010-05-07 14:39:41

+0

我的觀點是,你不能總是這樣做。 '如果(長度<3.14159 && ...)'不容易重構爲一個類型。這是一個以價值爲基礎的條件。 – 2010-05-07 19:26:29

0

確定這裏是另一種嘗試(現在仍然沒有明確的if語句!):

inFiles.ToList().ForEach(i => 

{ 

    filePath = inFolder + "\\" + i.Value; 
    replacementCollection = testForReplacement(i,filePath,replacementFile); 
    standardizationCollection = testForStandardization(i,filePath,standardizationFile); 
    someOtherCollection_1 = testForOtherCollection(i,filePath,otherFile); 
    ....//more statements like this... 
}); 
... 
... 
... 
Collection testForReplacement(i,filePath,testFile) 
{ 
    return i.Key.Equals(testFile) ? GetReplacementDataFromFile(filePath) :null; 
} 
Collection testForStandardization(i,filePath,testfile) 
{ 
    return i.Key.Equals(testFile) ? GetStandardizationDataFromFile(filePath) :null; 
} 
Collection testForSomeOtherCollection(i,filePath,testfile) 
{ 
    return i.Key.Equals(testFile) ? GetOtherDataFromFile(filePath) :null; 
} 
...///more functions like this... 

這是更僞代碼比真正的代碼(不知道這將彙編​​原樣),但我希望它使重點。 ;)

該代碼看起來多餘,但很容易編寫一個腳本/宏,它可以獲取所有可能的文件類型的列表,並在模式更改時生成(或重新生成)所有必需的函數和語句使用它們。生成的代碼可以節省很多時間,如果你做得對!

0

您似乎在尋找列表中的最後一個元素,它是替換文件或標準化文件。

林不知道是否有集合中的相同類型的多個文件,會發生什麼情況..

這並不像你必須去通過列表效率的兩倍..但也許是更富有表現力,如果文件列表很小,也許只是一個過早的優化問題!

inFiles.Where(i => i.Key.Equals(replacementFile)).ToList().ForEach(i => 
{ 
    replacementCollection = GetReplacementDataFromFile(Path.Combine(inFolder, i.Value)); 
} 

inFiles.Where(i => i.Key.Equals(standardizationFile)).ToList().ForEach(i => 
{ 
    standardizationCollection = GetStandardizationDataFromFile(Path.Combine(inFolder, i.Value)); 
}     
0

非常可讀,我不知道你希望通過刪除if來獲得什麼。我會按原樣離開,但可能會添加最後一個else,而不是僅僅結束該方法。這可能會引發異常或記錄一些信息。

0

如果inFiles是一本字典,你可以這樣做:

replacementCollection = 
    inFiles.ContainsKey(replacementFile) ? 
     GetReplacementDataFromFile(
      Path.Combine(inFolder, inFiles[replacementFile])) : null; 

standardizationCollection = 
    inFiles.ContainsKey(standardizationFile) ? 
     GetStandardizationDataFromFile(
      Path.Combine(inFolder, inFiles[standardizationFile])) : null; 

你可以把它如果縮短你的GetReplacementDataFromFile,GetStandardizationDataFromFile可以處理優雅空字符串參數:

string value; 


replacementCollection = 
    GetReplacementDataFromFile( 
     inFiles.TryGetValue(replacementFile, out value) ? Path.Combine(inFolder, value) : string.Empty); 

standardizationCollection = 
    GetStandardizationDataFromFile( 
     inFiles.TryGetValue(standardizationFile, out value) ? Path.Combine(inFolder, value) : string.Empty); 
相關問題