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

Точный код повторяется дважды. Как это исправить? Если я извлечу его по новому методу, у меня будет много параметров ввода ref. Есть ли другой способ? Если это невозможно, просто часть до комментариев?

+0

, какие параметры вы указываете здесь? –

+3

Похоже, у вас должно быть два разных метода - один для 'x' и' y', а другой для 'name'. Если вы инкапсулируете 'x' и' y' в структуру, у вас будет один параметр 'ref' (или рассмотрите _returning_ эту структуру и измените ее в вызывающем абоненте). – Oded

+0

Возможно, вы можете вернуть более сложную структуру или класс, содержащий все ваши возвращаемые данные? –

ответ

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

Код, кажется, имеет два отдельных блока, логически.

Тот, который имеет дело с x и y - другой с name. Вероятно, это должно быть отдельных методов.

Теперь вы можете создать тип (класс или структуру), который инкапсулирует x и y, что означает, что вам нужно передать только один параметр. Вместо того чтобы передавать его ref вы можете просто возвращение это и в вызывающем заменить то, что вы прошли в

+0

Вы имеете в виду входной параметр будет amountUnit, нормально. Но как бы я не использовал ref здесь? –

+1

@petko_stankoski - Вы возвращаете новый экземпляр и используете это в вызывающем. Например, как и для всех функций 'string'. – Oded

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(); 
} 
Смежные вопросы