方法返回一个或多个,如果只有一个项目它会返回一个数组吗?

时间:2014-08-24 15:00:45

标签: ruby design-patterns

我们假设我们有一个这样的Ruby方法:

# Pseudocode
def get(globbed)
  a_items = Dir.glob(globbed)
  a_items.length == 1 ? a_items.first : a_items
end

该方法旨在返回一个字符串,其中包含有关items的信息。如果有很多项,它将返回一个数组。三元组使得如果只有一个项目,它只返回该字符串。

这里的最佳做法是什么?即使只有一个项目,这样的方法总是会返回一个数组吗?

3 个答案:

答案 0 :(得分:3)

它应该总是返回一个数组。返回不同的东西意味着调用此方法的任何方法都必须具有条件。这是不好的。无论什么时候你可以摆脱一个条件,你应该。条件只应作为最后手段使用。

作为一个真实的例子,构建在JavaScript之上的jQuery库具有选择器的概念,以$(...)的形式表示。这可能导致多个匹配的dom对象或单个对象。但即使匹配的dom对象是一个,jQuery也总是返回一个数组。这让事情变得简单。

答案 1 :(得分:0)

总是关于用例。你必须定义该方法的责任,然后决定做什么是有意义的。 在这个特定的情况下,我会说,除非没有任何特定的理由返回不同的类型,你应该选择更简单的方式来测试和阅读。 在这种情况下,始终返回一个数组意味着更清晰的方法接口:

  

"该方法返回一个包含目录内容"

的数组

而不是更复杂的

  

"如果有多个目录内容,则该方法返回目录内容数组   一个对象,否则返回单个对象。"

所以,首先要清晰。 而且:测试结果会更容易。例程的cyclomatic complexity更少。

有些情况下,无法满足退货类型的一致性。只要想到Array method index:就不可能区分"未找到的对象"和"索引0"如果这里的做法适用。

结论:在这里,我没有看到任何理由通过区分这两种情况来使方法更复杂,所以.. KISS

答案 2 :(得分:0)

嗨,ruby提供了块,yield和迭代器,以便于进行数组或散列处理。对一个或多个元素使用相同的代码是一种很好的做法。例如:

a_items.each {| element | file_treatment(element)}

问候。