现在我正在开发一个Web应用程序,它从一个有可能返回null结果的数据库中接收大量数据。当经历应用程序的圈复杂度时,许多函数的权重在10-30之间。大多数具有高数字的函数有很多类似于以下的行:
If Not oraData.IsDBNull(4) Then row("Field") = oraData.GetString(4)
这引出了我的问题,试图降低这些数字的最佳方法是什么?现在我正在考虑将大部分功能都放在10以下。
答案 0 :(得分:2)
第一个问题是:你为什么“挂”CC?它是评估代码密集程度的工具,经验法则应该是“不太高的cc数”。
它可能会击中所有那些“IF”并提出该数字 - 所以通过调用一个wrap函数减少ifs的数量,该函数从处理null的结果集中提取数据或更改查询,因此它不会返回nulls。
请记住,null确实提供了信息并且没有用处。例如共和党人还是民主党人?使用null表示两种选择。
答案 1 :(得分:2)
分解成函数,可能是这样的:
//Object Pascal
procedure UpdateIfNotNull( const fldName: String; fldIndex : integer );
begin
if oraData.IsDBNull( fldIndex ) then
row( fldName ) := oraData.GetString(fldIndex);
end;
当然你可以扩展程序签名,以便“oraData”和“row”可以作为参数传递。
答案 2 :(得分:2)
如何使用Extension Methods。
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)
这样可以顺利读取并降低功能上的圈复杂度。
答案 3 :(得分:1)
您看到this question了吗?他问的是类似的东西(但我认为在更基本的层面上)......但那意味着答案在这里可能没什么帮助。
我肯定同意这里的其他建议:如果有重复的陈述可以整齐地打包到功能/程序中,那么这可能是一种方法,只要你不仅仅是改变CC。我不确定如果你从CC为35的CC触发到CC为15,10和10的三个触发,你已经获得了太多的收益。(这不是一个糟糕的第一步,但理想情况下你可以简化更大范围内的某些内容,以减少系统中该区域的总CC。)
答案 4 :(得分:0)
可以将 if 重构为单独的实用程序功能以减少您的CC。可能需要许多依赖于类型区分的函数或函数来处理不同的数据库类型(字符串,整数等)。
但是,我认为任何解决方案都会导致代码的可维护性或可读性降低(即,您可能会恶化其他指标!)并且QA会根据此理由允许它通过。