面试题答案
一键面试常用衡量代码复杂度指标
- 圈复杂度(Cyclomatic Complexity):衡量程序逻辑复杂度,由代码中独立路径数量决定。独立路径是指程序中至少被执行一次的一条语句序列。
- 代码行数(Lines of Code,LOC):简单统计代码包含的行数,虽然不能全面反映复杂度,但一定程度上可体现规模。
- Halstead复杂度:通过程序中运算符和操作数的数量来计算,衡量程序的体积和可理解性。
Kotlin代码圈复杂度计算示例
假设我们有如下Kotlin函数:
fun calculateScore(score: Int): String {
var result = ""
if (score >= 90) {
result = "A"
} else if (score >= 80) {
result = "B"
} else if (score >= 70) {
result = "C"
} else {
result = "D"
}
return result
}
计算圈复杂度步骤:
- 基本块划分:代码可分为5个基本块,开始部分,每个
if - else
分支,以及最后的返回部分。 - 边的计算:每个
if
条件引入一个分支,有4个if - else
条件,共4条边。 - 圈复杂度公式:$V(G)=e - n + 2$,其中$e$是边数,$n$是节点数。这里$e = 4$,$n = 5$,所以$V(G)=4 - 5 + 2 = 3$。
圈复杂度对代码质量评估的意义
- 可维护性:圈复杂度越高,代码逻辑越复杂,理解和维护成本越高。高复杂度代码修改时更易引入新的错误。
- 可读性:复杂逻辑意味着代码难以阅读,开发人员需要花费更多时间理解代码意图。
- 测试难度:复杂度高的代码有更多的逻辑路径,需要更多的测试用例来覆盖,增加测试工作量和难度。较低的圈复杂度有助于更高效地进行单元测试。