您认为以下扩展方法的优缺点是什么?
static class Log
{
public static string AddToLog(this string input)
{
Console.WriteLine(input);
return input;
}
public static string AddToLog(this string input, string format)
{
Console.WriteLine(format, input);
return input;
}
}
使用场景:
class Program
{
static void Main(string[] args)
{
string tableName = "Bills".AddToLog("Default table name is {0}");
"Starting...".AddToLog();
"Creating table".AddToLog();
}
}
答案 0 :(得分:11)
他们一开始就是静态的,这将使测试变得更加困难,并且会更紧密地结合所有内容。
我个人也认为像
Logger.Write("Starting..");
比
更容易理解"Starting...".AddToLog();
答案 1 :(得分:2)
对我来说,它不太可读。
仅仅因为你不能意味着你应该:)
答案 2 :(得分:2)
这使得有趣的,类似ruby的语法。然而,就像约翰所说的那样,仅仅因为你并不意味着你应该这样做。
这会让大多数C#开发人员感到困惑,并增加了不必要的混淆。
对于日志记录的特定目的,有更好的方法来获得您想要的东西。我的第一个问题是,为什么要推出自己的日志记录解决方案?记录是一个非常好解决的问题,你不应该浪费开发周期,例如log4net就可以了。
答案 3 :(得分:1)
我不会有好主意。我想不出有任何理由这样做。它使命名空间变得混乱,并且不是很直观。 (至少对我而言)
修改
现在我想到了,我看到一些倡导者扩展这样的简单对象,但记录器不是一个好的情况恕我直言。如果您提供.ToX()功能,例如将整数转换为MPH字符串或类似的东西,则扩展方法可能很有用,但记录器不太合适。
答案 4 :(得分:1)
通常而不是Console.WriteLine
,您可以调用实际的日志记录机制
您的日志记录API(如果您使用的是)不仅能够记录字符串,还能记录任何类型的对象。
例如,在log4net中,您可以使用对象参数调用.Error
方法。
然后,日志记录机制决定实际记录对象的哪些信息。
你做到这一点的方式就失败了。
答案 5 :(得分:1)
为了正确记录,您需要的不仅仅是一些字符串。日期,来源,类别等,您可能希望以更有条理的方式存储。
总而言之,在String上创建日志记录扩展方法感觉完全错误。根据单一责任原则,扩展方法的功能应与其运行的类型具有相当强的关联。在您描述的情况下,这显然是违反的。
答案 6 :(得分:1)
这种方法中最大的问题是几乎不可能非常干净地将依赖项注入静态/扩展方法。这意味着您的日志记录解决方案(假设它变得比将事情转储到stdout / console / debug更复杂)必须被调整并配置为对项目执行任何类型的测试。如初。