代码之家  ›  专栏  ›  技术社区  ›  Victor Hurdugaci

日志记录的扩展方法。好主意?

  •  3
  • Victor Hurdugaci  · 技术社区  · 14 年前

    在你看来,以下扩展方法的优缺点是什么?

    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();
        }
    }
    
    7 回复  |  直到 14 年前
        1
  •  10
  •   Grant Crofton    14 年前

    它们一开始是静态的,这会使测试变得更困难,并且会把所有的东西结合得更紧密。

    Logger.Write("Starting..");
    

    更容易理解

    "Starting...".AddToLog();
    
        2
  •  2
  •   John Gardner    14 年前

        3
  •  2
  •   Brad Cunningham    14 年前

    这就产生了有趣的、类似ruby的语法。然而,正如约翰所说,仅仅因为你可以,并不意味着你应该。

    这会让大多数C开发人员感到困惑,并增加不必要的困惑。

    对于日志记录的特定目的,有更好的方法来获取所需内容。我的第一个问题是,为什么要推出自己的日志解决方案?日志记录是一个很好解决的问题,您不应该把开发周期浪费在某些事情上,例如log4net,它做得很好。

        4
  •  1
  •   Paul    14 年前

    编辑

    现在我想起来了,我看到一些人主张扩展这样的简单对象,但是logger不是一个好的例子。如果您提供了一个.ToX()功能,比如将整数转换成一个MPH字符串或类似的东西,那么扩展方法可能会很有用,但记录器并不适合。

        5
  •  1
  •   Carlos Muñoz Boom    14 年前

    通常代替 Console.WriteLine

    您的日志API(如果您正在使用一个)不仅可以记录字符串,还可以记录任何类型的对象。
    例如,在log4net中,您可以调用 .Error 具有对象参数的方法。

    你做这件事的方式挫败了这个想法。

        6
  •  1
  •   Wim    14 年前

    对于正确的日志记录,您需要的不仅仅是一些字符串。日期、来源、类别等,您可能希望以更结构化的方式存储这些信息。

    总而言之,在字符串上创建日志扩展方法感觉完全是错误的。根据单一责任原则,扩展方法的功能应该与它所操作的类型有相当强的关联。在你描述的情况下,这显然是被侵犯了。

        7
  •  1
  •   Wyatt Barnett    14 年前

    这种方法中最大的问题是,几乎不可能非常干净地将依赖注入静态/扩展方法。这意味着您的日志解决方案(假定它变得比将内容转储到stdout/console/debug更复杂)必须启动并配置为在项目上执行任何类型的测试。永远不会。