现在我正在开发一个Web应用程序,它从一个有可能返回null结果的数据库中接收大量数据。当经历应用程序的圈复杂度时,许多函数的权重在10-30之间。大多数具有高数字的函数有很多类似于以下的行:

If Not oraData.IsDBNull(4) Then row("Field") = oraData.GetString(4)

这引出了我的问题,试图降低这些数字的最佳方法是什么?现在我正在考虑将大部分功能都放在10以下。

有帮助吗?

解决方案

如何使用扩展方法

Imports System.Runtime.CompilerServices

Module Extensions

    <Extension()> _
    Public Function TryGetString(ByVal row As IDataRecord, i As Integer) As String
        If row.IsDBNull(i) Then
            Return null
        End If
        Return row.GetString(i);
    End Function

End Module

然后你可以简单地写:

row("Field") = oraData.TryGetString(4)

这样可以顺利读取并降低功能上的圈复杂度。

其他提示

分解成函数,可能是这样的:

//Object Pascal
procedure UpdateIfNotNull( const fldName: String; fldIndex : integer );
begin
  if oraData.IsDBNull( fldIndex ) then
    row( fldName ) := oraData.GetString(fldIndex);
end;

当然,您可以扩展程序签名,以便“oraData”和“行”可以作为参数传递。

第一个问题是:你为什么“挂”了在CC?它是评估代码密集程度的工具,经验法则应该是“不太高的cc数”。

它可能会击中所有那些“IF”并提出该数字 - 所以通过调用一个wrap函数来减少ifs的数量,该函数从处理null的结果集中提取数据或更改查询,因此它不会t返回空值。

请记住,null确实提供了信息并且没有用处。例如共和党人还是民主党人?使用null表示两种选择。

您是否看到此问题?他问的是类似的东西(但我认为在更基本的层面上)......但那意味着答案在这里可能没什么帮助。

我肯定同意这里的其他建议:如果有重复的陈述可以整齐地打包到功能/程序中,那么这可能是一种方法,只要你不仅仅是转移CC。我不确定如果你从CC为35的CC转换到CC为15,10和10的三个触发,你已经获得了太多的收益。(这不是一个糟糕的第一步,但理想情况下你可以简化更大范围内的某些内容,以减少系统中该区域的总CC。)

可以将 if 重构为单独的实用程序功能以减少您的CC。可能需要许多依赖于类型区分的函数或函数来处理不同的数据库类型(字符串,整数等)。

但是,我认为任何解决方案都会导致代码的可维护性或可读性降低(即您可能会恶化其他指标!)并且QA会根据此理由允许它通过。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top