@
guyeuro 比如让我写这个代码的话,我会先写结构。
注释也好伪代码也好,得先打框架起来,然后再去慢慢想细节。
比如这个 num2voice,那么首先把功能细分开。
1. 正负号
2. 整数部分
3. 小数点和小数部分(如果有的话)
那么这个函数实现就是:
def num2voice(num)
# const
suffix10k = ['', '万', '亿', ...]
# sign
puts '负' if num < 0
num = num.abs
# partition to 10k segments and convert to voice
segments = []
seg = 0
while num > 0 do
segments << suffix10k[seg]
segments << num10k2voice(num % 10_000)
seg += 1
end
puts segments.reverse.join
# TODO: fraction part
end
到这里主体功能就写完了,接下来只要把 1 万以内的 num10k2voice 实现就好。
我记得上一次写这个类似的程序还是初二的时候,那时候也不知道怎么做软件架构设计,就是从头到尾硬生生开着循环写代码,最后写得老长还难读。现在写得多了以后,养成了逐步细分的习惯,把功能细分到不同的方法里,然后再串起来调用,就很容易想也很容易写了。
而且你看,这些搞完以后,我都不需要写 num10k2voice 的实现,就可以提前做测试了,只要让函数返回一个固定值,就可以测试万位、亿位的正确性了。