考虑这种方法:
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 (...)
{
// ...
}
}
}
}
可以通过将最里面的if
s组移动到单独的方法中来进行改进:
void Foo(object person)
{
if (...)
{
// ...
}
else if (...)
{
// ...
}
if (x == 1 && person is Hobbit)
{
DoHobbitStuff();
}
}
void DoHobbitStuff()
{
if (...)
{
// ...
}
if (...)
{
// ...
}
if (...)
{
// ...
}
}
但是,我认为“ 5”不需要出于减少CC的目的而重构您的代码。
我该怎么做才能重构它,从而减少出口点?
根据nDepend,return
不计算诸如以下的出口点:
以下表达式不计入CC计算:
其他| 做| 开关| 尝试| 使用| 扔| 最后 返回| 对象创建| 方法调用| 现场访问
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句