【问题标题】:Why is cyclomatic complexity of those methods so high?为什么这些方法的圈复杂度如此之高?
【发布时间】:2013-12-27 05:43:56
【问题描述】:

使用 Visual Studio 计算指标。

第一种方法的 CC = 4

    private IEnumerable<string> GetRows(DataTable dt, string columnDelimiter)
    {
        return from DataRow row in dt.Rows
               select string.Join(columnDelimiter, row.ItemArray.Select(k => k.ToString()));
    }

第二种方法的CC = 5。

    private IEnumerable<string> GetRowsForeach(DataTable dt, string columnDelimiter)
    {
        var rows = new List<string>();
        foreach (DataRow row in dt.Rows)
        {
            var rowString = string.Join(columnDelimiter, row.ItemArray.Select(k => k.ToString()));
            rows.Add(rowString);
        }

        return rows;
    }

我会说第一种方法应该有 CC = 1 和第二种可能 CC = 1 或可能 2 (理解 foreach 与结束条件。但我永远不会说他们的 CC 这么高。我误解了什么?

【问题讨论】:

  • 大概算匿名函数和LINQ生成的代码。
  • @Tilo 它曾经更糟糕,因为它还计算了 lync 生成的样板代码。但事实上,Linq 语句增加了复杂性,它基本上是它自己的 foreach,不管它看起来多么简单。
  • @Tilo:你的回答让我有了不同的想法。我以为它扫描了我的源代码,而不是我的 IL。所以因为你是第一个如果你发表你的评论作为答案,我会接受它。

标签: c# visual-studio-2012 code-metrics


【解决方案1】:

这是一个不完美的工具。它会看到 IL,即由 C# 编译器生成的代码。它看不到你的代码。 C# 中有很多语法糖,旨在使您的代码易于理解,但在水线以下有一座代码生成冰山。查询理解当然符合这种模式。

仅将 CC 用作指导,永远不要让它设定规则,永远不要让它束缚你的风格。您的大脑胜过任何工具。

【讨论】:

  • 我只是想向我的同事展示我的重构方法的 CC 比重构前的方法 (CC=9) 低很多,并且很惊讶我达到了 CC=5。
【解决方案2】:

显然这是因为使用 linq 方法生成的每个 IEnumerator 也将实现 IDisposable,为了正确释放,会将代码包装在 try..catch 块中。

here有一个很好的解释。

在您的第一个示例中,您有两个 select 语句以及一个连接,因此计数为 4。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多