2013-04-09 93 views
1

我有以下两种方法:有没有办法将这两种方法结合起来?

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

后面的两行在两种方法中都是相同的。

我只是想知道是否有办法保持DRY principle并结合这两种方法?

+1

引入一个辅助函数'trace(string output)'? – 2013-04-09 17:21:53

+1

创建一个与第二次重载实际上相同的方法,只需要首先不添加“Response:”?然后你可以用你喜欢的任何方式string.Format并用结果调用它。但是,真的,两行两次你为什么要打扰? – Jon 2013-04-09 17:22:30

+0

@Jon主要是为了好奇。看看这样的事情是否可能。未来可以在“更好”的实施中派上用场。 – 2013-04-09 17:22:57

回答

3

重构公共代码私人助手功能:(Visual Studio将做到这一切你通过突出显示的代码,右键单击的相关章节,并选择重构 - >提取方法...)

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

(注意名称更改,以确保它已经从Log(string Data)不同的签名。)

然后,只需调用该函数来自其他人。

+0

非常感谢Servy!由于* Refactor - > Extract method *提示,我已经接受了其他人的答案。有用! – 2013-04-10 00:02:31

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的答案来提供有用的技巧。它很接近! – 2013-04-10 00:03:33

+1

@DannyBeckett很高兴我可以帮助和感谢您提供您的推理;我同意! – Kohanz 2013-04-10 01:06:56

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); 
相关问题