2013-04-08 99 views
0

我有相同的代碼在兩個地方:如何刪除此重複的代碼

if (amountUnit.ToLower().Contains("x")) 
{ 
    string[] amount = amountUnit.Split('x'); 
    x = amount[0].Trim(); 
    y = amount[1].Trim(); 
} 
else 
{ 
    x = "1"; 
    y = amountUnit.Trim(); 
} 
// 
unit = textInBrackets.Replace(amountUnit, ""); 
name = ""; 
for (int z = 0; z < i; z++) 
{ 
    name += someArray[z]; 
    name += " "; 
} 
name = name.Trim(); 

確切的代碼重複兩次。如何解決它?如果我在一個新的方法中提取它,我會有很多參考輸入參數。有另一種方法嗎? 如果這是不可能的,只是部分直到評論?

+0

哪些參數在這裏說明什麼? – 2013-04-08 11:45:40

+3

看起來應該有兩種不同的方法 - 一個用於'x'和'y',另一個用於'name'。如果你把'x'和'y'封裝成一個結構體,你將有一個'ref'參數(或者考慮_returning_該結構體並在調用者中改變它)。 – Oded 2013-04-08 11:45:54

+0

也許你可以返回一個更復雜的結構或類包含所有的返回數據? – 2013-04-08 11:46:14

回答

0

我愛:

public struct Parameters 
{ 
    public int X {get; set;} 
    public int Y {get; set;} 
} 

public Parameters ExtractParameters(string amountUnit) 
{  
    var parameters = new Parameters(); 
    if (amountUnit.ToLower().Contains("x")) 
    { 
     string[] amount = amountUnit.Split('x'); 
     parameters.X = int.Parse(amount[0].Trim()); 
     parameters.Y = int.Parse(amount[1].Trim()); 
    } 
    else 
    { 
     parameters.X = 1; 
     parameters.Y = int.Parse(amountUnit.Trim()); 
    } 
    return parameters; 
} 

用法:

var parameters = ExtractParameters(amountUnit); 
var x = parameters.X; 
var y = parameters.Y; 

你也可以使它成爲字符串的擴展方法。 當然你最好添加一些異常處理。

0

該代碼似乎有兩個獨立的塊,邏輯上。

一個處理xy - 其他與name。這些應該可能是單獨的方法。

現在,您可以創建封裝了xy的類型(類或結構),這意味着您只需傳入一個參數即可。相反,通過ref通過它,你可以簡單地回報並在調用者取代你在通過

+0

你的意思是輸入參數是amountUnit,好的。但是我怎麼不在這裏使用ref? – 2013-04-08 11:52:09

+1

@petko_stankoski - 你返回一個新的實例並在調用者中使用它。例如,您可以使用所有的'string'函數。 – Oded 2013-04-08 11:52:42

0

結合您的代碼和數據放到一個類;-)

public class Point 
{ 
    public Point(string amountUnit) 
    { 
     if (amountUnit == null) 
     { 
      throw new ArgumentNullException("amountUnit"); 
     } 

     if (amountUnit.ToLower().Contains("x")) 
     { 
      string[] amount = amountUnit.Split('x'); 
      this.X = amount[0].Trim(); 
      this.Y = amount[1].Trim(); 
     } 
     else 
     { 
      this.X = "1"; 
      this.Y = amountUnit.Trim(); 
     } 
    } 

    string X { get; private set; } 
    string Y { get; private set; } 
} 
0

如果你什麼都不需要非常有活力,如何拆分爲兩個方法,做這樣簡單的東西:

public static string GetX(string amountUnit) 
{ 
    return amountUnit.ToLower().Contains("x") ? 
         amountUnit.Split('x')[0].Trim() : 
         "1"; 
} 

public static string GetY(string amountUnit) 
{ 
    return amountUnit.ToLower().Contains("x") ? 
         amountUnit.Split('x')[1].Trim() :  
         amountUnit.Trim(); 
}