有没有办法把这两种方法结合起来?
本文关键字:方法 结合 起来 两种 有没有 | 更新日期: 2023-09-27 18:08:11
我有以下两个方法:
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原则并结合这两种方法?
将公共代码重构为私有辅助函数(Visual studio将通过突出显示相关代码部分,右键单击并选择Refactor -> extract method…为您完成所有这些工作)
private static void LogHelper(string text)
{
Trace.WriteLine(text);
if(OutputToConsole) Console.WriteLine(text);
}
(请注意名称更改,以确保它具有与Log(string Data)
不同的签名)
然后从其他两个函数中调用该函数
不知道这有多大的改进…
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);
}
}
很可能没有办法将结合这两个方法并从中获得任何真正的值,因为生成的Output
是不同的,但是您可以创建一个方法来执行实际的跟踪:
public static void Trace(string Output)
{
Trace.WriteLine(Output);
if(OutputToConsole) Console.WriteLine(Output);
}
然后从这些方法中调用
如果您愿意,可以使用可选参数,这有点不寻常,但很有趣:
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);