【发布时间】:2016-12-26 18:56:04
【问题描述】:
在一篇关于 unconditional programming Michael Feathers 的博文中,展示了如何将限制 if 语句用作降低代码复杂性的工具。
他用一个具体的例子来说明他的观点。现在,我一直在思考其他可以帮助我更多地了解无条件/ifless/forless 编程的具体示例。
例如在这个cat 克隆中有一个if..else 块:
#!/usr/bin/env ruby
if ARGV.length > 0
ARGV.each do |f|
puts File.read(f)
end
else
puts STDIN.read
end
原来 ruby 有ARGF,这让这个程序更简单:
#!/usr/bin/env ruby
puts ARGF.read
我想知道如果ARGF 不存在,如何重构上面的示例,所以没有if..else 块?
还对指向其他说明性具体示例的链接感兴趣。
【问题讨论】:
-
我认为您将该博客文章误读为绝对规则,而不是您工具箱中的工具。但在您的情况下,您可以通过首先从
ARGV创建一个 IO 对象数组来简化代码,如果该列表为空,则使用STDIN。io = ARGV.map { |f| File.new(f) }; io = [STDIN] if !io.length;然后你的代码可以用io做它喜欢的事情。虽然这具有严格相同数量的条件,但它消除了 if/else 块,从而消除了一个分支:代码是线性的。由于它将收集数据与使用数据分开,因此您可以将其放入一个方法中并重用它,从而进一步降低复杂性。 -
在 Stack Overflow 上克隆猫是题外话,请迁移到 biology.stackexchange.com :)
-
@Schwern 你对这个用法很有信心,当然如果它使你的代码更难阅读并且可能更慢,但在你的建议中你仍然使用 if
-
@peter 不要挂断
if。