我应该如何简洁地制作红宝石?

时间:2012-04-10 16:53:31

标签: ruby

在ruby或编程中,最好的做法是尽可能简洁,因为语言允许或简洁而仍然可读?例如:

animals = %w{ cat dog bird }
chosen_animal = rand(animals.length)
random_animal = animals[chosen_animal]

或者

animals = %w{ cat dog bird }
random_animal = animals[rand(animals.length)]

我感觉第二个是更好的代码。使用第一个有什么好处吗?你会用哪个?为什么?

2 个答案:

答案 0 :(得分:4)

  

尽可能简洁,语言允许或简洁,但仍然可读?

总是,总是喜欢可读性。简洁性只有在它使您的代码更多可读时才会有用(即,更少的冗长和混乱)。如果它模糊了代码并且仅用于减缓开发速度,它就不会为您节省任何费用。

只有绝对必要时,可读性/可维护性才会落后于性能问题。在像Ruby这样的语言中通常不会出现这种情况,在C语言中更常见的情况是,当已经证明存在瓶颈时,只能通过执行一些可能使代码稍微难以理解的低级优化来解决这个问题。 。在这种情况下,请添加用于彻底解释代码行为的注释。

答案 1 :(得分:1)

这是一个非常广泛的问题,有很大的主观偏见空间。

人们普遍认为可读性始终是一件好事。然而,可读性因人而异。

例如,从您的示例中我实际上更喜欢第二种变体。

有很多人会说,传播你的代码,这会有所帮助,但有些人(包括我自己)更喜欢不那么分散的代码(在极限范围内!),因为它让我更容易感受远处代码(结构,循环,条件等)的“形状”。

在您的示例中,使用一个或另一个变体几乎不会影响可读性。但假设你有一个类似的公式:

r1 = $r*(($objcols-i).to_f+j+k)*3/total_objs

它有更多的术语,所以它更难以观察。你可以把它拆开:

t1 = ($objcols-i).to_f
t2 = t1 + j + k
t3 = $r * t2 * 3
r1 = t3 / total_objs

但是这会让它更具可读性吗?实际上,这个特殊的公式只是一个神奇的公式,可以产生一个漂亮的随机旋转。

您可以通过横向展开来妥协:

r1 = $r*( ($objcols-i).to_f+j+k ) * 3 / total_objs

至少用于对主要术语进行分组。

但在一天结束时,我们正在讨论微观问题。是否需要3秒或10秒来理解该片段并不重要。这些更重要:

  • 表达式的原因必须明显。如果代码本身并不明显,则需要对其进行解释。
  • 代码应易于导航。这意味着:
    • 消除/减少重复代码
    • 将程序分解为不小或太大的函数。同样,“太小”和“太大”是主观术语,并且通常有例外。
    • 通过大量评论解释更复杂和更高级别的结构(例如大型互动类网络)。

最后,你知道你能做到吗? (至少在ruby 1.9 +中):

random_animal = animals.sample

animals获取随机元素。