0

在 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)]

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

4

2 回答 2

4

as concise as the language allows or to be concise while still readable?

Always, always prefer readability. Conciseness is only useful when it makes your code more readable (i.e., less verbosity and clutter to wade through). It saves you nothing if it obscures the code and serves only to slow development down.

Readability/maintainability only takes a back seat to performance concerns and only when absolutely necessary. This is not often the case in a language like Ruby, more common in a language like C when a bottleneck has been shown to exist that can only be remedied by performing some amount of low level optimizations that may make the code slightly more difficult to comprehend. In this case, add comments that explain the behavior of the code thoroughly.

于 2012-04-10T17:04:45.180 回答
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

于 2012-04-10T17:19:10.143 回答