gpt4 book ai didi

ruby - 分配分支条件大小太高

转载 作者:行者123 更新时间:2023-12-05 08:26:16 27 4
gpt4 key购买 nike

我正在制作采用多行字符串(日志)并将新字符串写入数组的方法。

def task_2(str)
result = []
str.each_line do |x|
ip = x[/^.* - -/]
datetime = x[/[\[].*[\]]/]
address = x[/T .* H/]
if !ip.nil? && !datetime.nil? && !address.nil?
result << datetime[1..-2] + ' FROM: ' + ip[0..-4] + 'TO:' + address[1..-3]
end
end
result
end

我需要它以默认配置通过 rubocop 分析,但它给出 AbcSize 18.68/15我确信这是因为 if..end 语句,但我该如何重写它?

日志示例:

10.6.246.103 - - [23/Apr/2018:20:30:39 +0300] "POST /test/2/messages HTTP/1.1" 200 48 0.0498
10.6.246.101 - - [23/Apr/2018:20:30:42 +0300] "POST /test/2/run HTTP/1.1" 200 - 0.2277

最佳答案

ABC 大小是通过执行以下操作计算的:

√(assignments² + branches² + conditionals²)

让我们先来看看作业:

result = []
ip = x[/^.* - -/]
datetime = x[/[\[].*[\]]/]
address = x[/T .* H/]

这给我们留下了 4 个作业。

接下来是 Twig 。为此,我不得不提到大多数运算符都是方法(因此计入分支)例如 1 + 1 也可以写成 1.+(1) + 是一个整数的方法。 string[regex]也是如此,可以写成string.[](regex) []是字符串的方法。而 !value 可以写成 value.!@ !@ 是所有对象的方法。

让我们数一数分支。

str.each_line
x[/^.* - -/]
x[/[\[].*[\]]/]
x[/T .* H/]
!ip.nil? # counts for 2 (! and .nil?)
!datetime.nil? # counts for 2 (! and .nil?)
!address.nil? # counts for 2 (! and .nil?)
result << ...
datetime[1..-2]
ip[0..-4]
address[1..-3]
+ # 4 times in result << ... + ... + ....

这给我们留下了 18 个分支。

最后要计算的是条件。由于 Ruby 使用 &&|| 运算符的短路,它们将计入条件。

if
&& # 2 times

这给我们留下了 3 个条件。

√(4² + 18² + 3²) ≈ 18.68

现在我们了解了数字的来源,我们可以尝试减少它。减少 ABC 大小的最简单方法是减少数字最大的东西,因为这个数字是平方的。在您的情况下,这些是分支机构。您已经在问题中发现了问题所在。

if !ip.nil? && !datetime.nil? && !address.nil?
result << datetime[1..-2] + ' FROM: ' + ip[0..-4] + 'TO:' + address[1..-3]
end

可以简化为:

if ip && datetime && address
result << "#{datetime[1..-2]} FROM: #{ip[0..-4]}TO:#{address[1..-3]}"
end

一共拿走10个分支。 3 次 !something.nil?(算 2 次,因为 !.nil? 都计入分支)和 4 次 +

留给你:

√(4² + 8² + 3²) ≈ 9.43

关于ruby - 分配分支条件大小太高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55422300/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com