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改变。

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

我只是想知道是否有办法保持DRY 原则并将这两种方法结合起来?

4

4 回答 4

3

将公共代码重构为私有辅助函数:(Visual Studio 将通过突出显示代码的相关部分、右键单击并选择重构 -> 提取方法来为您完成所有这些工作...)

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

(注意名称更改以确保它具有与 不同的签名Log(string Data)。)

然后只需从其他两个函数调用该函数。

于 2013-04-09T17:25:21.613 回答
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);
    }
}
于 2013-04-09T17:25:22.027 回答
1

可能无法将这两种方法结合起来并从中获得任何真正的价值,因为Output生成的不同,但您可以创建一个执行实际跟踪的方法:

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

然后从这些方法中调用它。

于 2013-04-09T17:23:31.203 回答
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);
于 2013-04-09T17:33:06.227 回答