2013-04-09 5 views
1

У меня есть следующие два метода:Есть ли способ объединить эти 2 метода?

class Debug 
{ 
    static bool OutputToConsole = true; 

    public static void Log(string Type, string URL, StringBuilder Parameters) 
    { 
     string Output = Type + ":" + new string(' ', 9 - Type.Length) + URL + " { " + Parameters.ToString() + " }"; 
     Trace.WriteLine(Output); 
     if(OutputToConsole) Console.WriteLine(Output); 
    } 

    public static void Log(string Data) 
    { 
     string Output = "Response: " + Data; 
     Trace.WriteLine(Output); 
     if(OutputToConsole) Console.WriteLine(Output); 
    } 
} 

Если вы заметите, что это только string Output, что изменения.

2 линии после того, как они одинаковы в обоих методах.

Мне просто интересно, есть ли способ сохранить DRY principle и объединить эти 2 метода?

+1

ввести вспомогательную функцию 'trace (string output)'? –

+1

Сделайте метод, который фактически будет таким же, как и вторая перегрузка, только без добавления «Ответ:» в первую очередь? Затем вы можете string.Format любым способом, который вам нравится, и назовите его результатом. Но на самом деле, для двух строк дважды, почему вы беспокоились? – Jon

+0

@Jon Просто ради любопытства, в основном. Чтобы увидеть, возможно ли что-то подобное. Может пригодиться в будущем в «лучшей» реализации. –

ответ

3

Refactor общий код для частной вспомогательной функции: (Visual Studio будет делать все это для вас, выделив соответствующий раздел кода, щелкнув правой кнопкой мыши и выбрав Refactor -> метод экстракт ...)

private static void LogHelper(string text) 
{ 
    Trace.WriteLine(text); 
    if(OutputToConsole) Console.WriteLine(text); 
} 

(Обратите внимание на изменение названия, чтобы убедиться, что он имеет другую подпись от Log(string Data).)

Тогда просто вызовите эту функцию из обоего остальные.

+0

Большое спасибо за этот сервис! Я принял ваш ответ над другими из-за подсказки * Refactor -> Extract method *; полезно! –

1

Существует вероятность никакого способа смешайте два метода и получить любую реальную значение из него потому что Output генерироваться разные, но вы можете создать метод, который делает фактический след:

public static void Trace(string Output) 
{ 
    Trace.WriteLine(Output); 
    if(OutputToConsole) Console.WriteLine(Output); 
} 

, а затем назовите это из этих методов.

2

Не уверен, сколько улучшение это ...

class Debug 
{ 
    static bool OutputToConsole = true; 

    public static void LogRequest(string type, string url, StringBuilder params) 
    { 
     log(type + ":" + new string(' ', 9 - type.Length) + url + " { " + params.ToString() + " }"); 
    } 

    public static void LogResponse(string data) 
    { 
     log("Response: " + data); 
    } 

    private static void log(string msg) 
    { 
     Trace.WriteLine(msg); 
     if(OutputToConsole) Console.WriteLine(msg); 
    } 
} 
+1

Большое спасибо за ваш ответ Kohanz! Это именно то, что я закончил, но я выбрал ответ @ Servy для полезного совета в нем. Это было близко! –

+1

@ DannyBeckett Рад, что я мог бы помочь и поблагодарить за предоставление ваших рассуждений; Согласен! – Kohanz

1

Вы можете использовать дополнительные параметры, если вы хотите, это немного необычно, но интересно:

public static void Log(string Data = null, string Type = null, string URL = null, StringBuilder Parameters = null) 
{ 
    string Output = ""; 
    if (Data != null) 
    { 
     Output = "Response: " + Data; 
    } 
    else if (Type != null && URL != null && Parameters != null) 
    { 
     Output = Type + ":" + new string(' ', 9 - Type.Length) + URL + " { " + Parameters.ToString() + " }"; 
    } 
    else 
    { 
     throw new ArgumentException("Provide yada yada arguments lala"); 
    } 
    Trace.WriteLine(Output); 
    if (OutputToConsole) Console.WriteLine(Output); 
} 

Используйте его как это:

Log(Data: "Test"); 
StringBuilder sb = new StringBuilder(); 
Log(Type: "myType", URL: "www.bla", Parameters: sb); 
Смежные вопросы