1

如果以下不是最好的风格,那么等价的表达方式是什么?

if (some_really_long_expression__________ && \
    some_other_really_long_expression)

续行感觉很难看。但我很难找到更好的选择。

4

4 回答 4

3

在延续明确的情况下,解析器不需要反斜杠。例如,使用 Ruby 2.0:

if true &&
   true &&
   true
  puts true
end
#=> true
于 2013-11-01T22:30:37.730 回答
1

以下是刚玩过 Ruby 的人对行长度问题的一些或多或少的随机想法。我也没有接受过任何软件工程师的培训,所以请考虑一下自己。

我发现长行的问题通常是字符数多于操作数。前者可以通过(鼓)缩短变量名和方法名来减少。当然,问题是使用冗长过滤器(又名 babbling、prattling 或 jabbering 过滤器)是否会使代码更难理解。您多久看到一次与以下内容相当接近的内容(没有\)?

total_cuteness_rating = cats_dogs_and_pigs.map {|animal| \
  cuteness_calculation(animal)}.reduce {|cuteness_accumulator, \
  cuteness_per_animal| cuteness_accumulator + cuteness_per_animal} 

将其与以下内容进行比较:

tot_cuteness = pets.map {|a| cuteness(a)}.reduce(&:+)

首先,我认为块中局部变量的长名称没有任何好处(并且很少用于方法中的局部变量)。a在这里,在计算中指的是什么不是很明显tot_cuteness吗?a当它被限制在一行代码中时,你需要记住多好的记忆?

其次,尽可能使用可枚举的缩写形式,后跟一个块(例如,reduce(&:+))。这使我们能够在微秒内了解正在发生的事情,只要我们的眼睛锁定+. 相同,.to_i对于_s_f。没错,reduce {|tot, e| tot + e}不会再长了,但我们正在强迫读者的大脑解码两个变量以及运算符,什么时候+才是真正需要的。

另一种缩短生产线的方法是避免长链操作。然而,这是有代价的。就我而言,链条越长越好。它减少了对临时变量的需求,减少了代码行数,并且——可能是最重要的——允许我们像大多数人习惯的那样跨行阅读,而不是向下阅读。上面的代码行是“要计算总的可爱度,请计算每只宠物的可爱度等级,然后将这些等级相加”。怎么可能更清楚?

当链特别长时,它们可以写成多行而不使用续行字符\

array.each {|e| blah, blah, ..., blah
  .map     {|a| blah, blah, ..., blah
  .reduce  {|i|  blah, blah, ..., blah }
  }
}

这与单独的陈述一样清楚。我认为这经常在 Rails 中完成。

缩略语怎么用?以下哪个名字最清楚?

number_of_dogs
number_dogs
nbr_dogs
n_dogs

我认为前三个同样清楚,如果作者始终在变量名前面加上n_“数量”的前缀,那么最后一个也同样清楚。相同tot_,以此类推。足够的。

于 2013-11-02T04:32:15.180 回答
0

一种方法是将这些表达式封装在有意义的方法中。而且您也许可以将其分解为多种方法,以便以后重用。

除此之外,您提供的信息很少,很难提出任何建议。您也许可以使用命令对象或类似的东西摆脱 if 语句,但我不知道它是否对您的代码有意义,因为您没有显示它。

于 2013-11-01T22:22:15.247 回答
0

Ismael 的答案在 Ruby 中非常有效(可能还有其他语言),原因有两个:

  1. 由于缺少类型定义,Ruby 创建方法的开销非常低
  2. 它允许您将此类逻辑解耦以进行重​​用或未来的适应性和测试

我要放弃的另一个选择是创建逻辑方程并将结果存储在变量中,例如

# this are short logic equations testing x but you can apply same for longer expressions
number_gt_5 = x > 5
number_lt_20 = x < 20
number_eq_11 = x == 11

if (number_gt_5 && number_lt_20 && !number_eq_11) 
 # do some stuff
end
于 2013-11-01T22:36:13.893 回答