如何重构指定Ruby方法以将ABC规模降至15以下?
重构Ruby范围减法方法以降低ABC规模
没问题,咱们来搞定这个方法的ABC规模优化。首先得明确:ABC规模是通过**赋值(Assignments)、分支(Branches)、条件(Conditions)**的总数来衡量代码复杂度的,咱们的目标是把总数压到15以下(其实原方法的ABC已经不算高,但拆分后会更清爽,也能确保绝对达标)。
原方法的问题在于把两个范围的判断逻辑直接嵌在数组里,虽然代码短,但把多个条件和分支揉在了一起。咱们可以通过拆分单一职责来简化主方法,把每个子范围的判断抽成独立逻辑。
方案1:提取辅助方法(推荐,符合单一职责)
这种方式把前后两个重叠部分的判断拆成单独的小方法,主方法只负责整合结果,逻辑非常清晰:
require 'active_support' require 'active_support/core_ext' def subtract_two_ranges(range_a, range_b) return [range_a] unless range_a.overlaps?(range_b) [before_overlap(range_a, range_b), after_overlap(range_a, range_b)].compact end private def before_overlap(range_a, range_b) range_a.begin..(range_b.begin - 1) if range_a.begin < range_b.begin end def after_overlap(range_a, range_b) (range_b.end + 1)..range_a.end if range_b.end < range_a.end end
规模计算
- 主方法
subtract_two_ranges:赋值0,分支1(return的分支),条件1(overlaps?判断),ABC=0+1+1=2 - 每个辅助方法:赋值0,分支1(if的分支),条件1,ABC=0+1+1=2
整体复杂度极低,远低于15的阈值。
方案2:用局部变量拆分(更紧凑)
如果不想新增辅助方法,也可以用局部变量把两个子范围的逻辑拆出来,让主方法的结构更直观:
require 'active_support' require 'active_support/core_ext' def subtract_two_ranges(range_a, range_b) return [range_a] unless range_a.overlaps?(range_b) before_range = range_a.begin < range_b.begin ? (range_a.begin..(range_b.begin - 1)) : nil after_range = range_b.end < range_a.end ? ((range_b.end + 1)..range_a.end) : nil [before_range, after_range].compact end
规模计算
这个版本的ABC规模是:赋值2(before_range和after_range),分支1(return分支),条件3(overlaps?+两个三元判断的条件),ABC=2+1+3=6,同样轻松达标。
两种方案都能有效降低复杂度,你可以根据代码上下文选择——如果这个前后范围的判断在其他地方也会用到,优先选方案1;如果只是这个方法用,方案2更紧凑。
内容的提问来源于stack exchange,提问作者pedrozath
相关产品推荐
相关产品推荐

