2013-04-08 118 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(); 
}