在不影响业务逻辑的情况下降低循环复杂性

代码帮助

考虑这种方法:

public ActionResult DoSomeAction(ViewModel viewModel)
{
    try
    {
        if (!CheckCondition1(viewModel))
            return Json(new {result = "Can not process"});

        if (CheckCondition2(viewModel))
        {
            return Json(new { result = false, moreInfo = "Some info" });
        }

        var studentObject = _helper.GetStudent(viewModel, false);

        if (viewModel.ViewType == UpdateType.AllowAll)
        {
            studentObject = _helper.ReturnstudentObject(viewModel, false);
        }
        else
        {
            studentObject.CourseType = ALLOW_ALL;
            studentObject.StartDate = DateTime.UtcNow.ToShortDateString();
        }

        if (studentObject.CourseType == ALLOW_UPDATES)
        {
            var schedule = GetSchedules();

            if (schedule == null || !schedule.Any())
            {
                return Json(new { result = NO_SCHEDULES });
            }

            _manager.AddSchedule(schedule);
        }
        else
        {
            _manager.AllowAllCourses(studentObject.Id);
        }

        _manager.Upsert(studentObject);

        return Json(new { result = true });
    }
    catch (Exception e)
    {
        // logging code
    }
}

该方法具有许多出口点,并且圈复杂度为8我们的最佳做法是,该值不应大于5

  • 是因为有多个中频吗?

  • 我该怎么做才能重构它,从而减少出口点?

提前致谢。

米奇

这是我在上述问题下的评论的摘要


我们的最佳做法是,该值不应大于5。

“ 5”听起来有点低。nDepend和Microsoft建议分别为“ 30 ”和“ 25 ”。

nDepend:

CC高于15的方法很难理解和维护。CC大于30的方法极其复杂,应拆分为较小的方法(除非它们是由工具自动生成的)

微软:

圈复杂度=边数-节点数+ 1,其中一个节点表示逻辑分支点,一个边缘表示节点之间的线。当圈复杂度大于25时,该规则将报告违规。

上:

“是因为有多个IF”-

是的, ||

我该怎么做才能重构它,从而减少出口点?

一种简单的方法是仅采用该方法并拆分为较小的方法if,将您的某些if逻辑移至一个或多个方法中,而不是在一个方法中将所有s移至另一个。

例如

class Class1
{
    class  Hobbit
    {
         
    }

    void Foo(object person)
    {
        if (...)
        {
                // ...
            
        }
        else if (...)
        {
                // ...
        }

        if (x == 1 && person is Hobbit)
        {
            if (...)
            {
                // ...
            }

            if (...)
            {
                // ...
            }

            if (...)
            {
                // ...
            }

        }
    }
}

可以通过将最里面的ifs组移动到单独的方法中来进行改进

    void Foo(object person)
    {
        if (...)
        {
                // ...
            
        }
        else if (...)
        {
                // ...
        }

        if (x == 1 && person is Hobbit)
        {
            DoHobbitStuff();
        }
    }

    void DoHobbitStuff()
    {
        if (...)
        {
            // ...
        }

        if (...)
        {
            // ...
        }

        if (...)
        {
            // ...
        }
    }

但是,我认为“ 5”不需要出于减少CC的目的而重构您的代码。

我该怎么做才能重构它,从而减少出口点?

根据nDependreturn不计算诸如以下的出口点

以下表达式不计入CC计算:

其他| 做| 开关| 尝试| 使用| 扔| 最后 返回| 对象创建| 方法调用| 现场访问

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章