在一篇关于无条件编程 http://michaelfeathers.typepad.com/michael_feathers_blog/2013/11/unconditional-programming.html迈克尔·费瑟斯 (Michael Feathers) 展示了如何限制if
语句可以用作降低代码复杂性的工具。
他用一个具体的例子来说明他的观点。现在,我一直在考虑其他可以帮助我更多地了解无条件/的具体示例if
less/for
更少的编程。
例如在这个cat https://en.wikipedia.org/wiki/Cat_(Unix)克隆有一个if..else
block:
#!/usr/bin/env ruby
if ARGV.length > 0
ARGV.each do |f|
puts File.read(f)
end
else
puts STDIN.read
end
事实证明红宝石有ARGF
这使得这个程序变得更加简单:
#!/usr/bin/env ruby
puts ARGF.read
我想知道是否ARGF
不存在如何重构上面的例子所以不存在if..else
block?
还对其他说明性具体示例的链接感兴趣。
从技术上讲你可以,
inputs = { ARGV => ARGV.map { |f| File.open(f) }, [] => [STDIN] }[ARGV]
inputs.map(&:read).map(&method(:puts))
虽然那是代码高尔夫 https://codegolf.stackexchange.com/而且太聪明了。
不过,它是如何运作的呢?
- 它使用哈希来存储两个替代方案。
- Map
ARGV
到打开文件的数组
- Map
[]
到一个数组STDIN
,有效地覆盖ARGV
如果为空则输入
- Access
ARGV
在哈希中,返回[STDIN]
如果它是空的
- 读取所有打开的输入并打印它们
不过,不要编写该代码。
正如中提到的我对你另一个问题的回答 https://stackoverflow.com/questions/41335425,无条件编程并不是要避免if
不惜一切代价表达,但努力获得可读且能揭示意图的代码。有时这仅仅意味着使用if
表达。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)