我们假设我们有一个这样的Ruby方法:
# Pseudocode
def get(globbed)
a_items = Dir.glob(globbed)
a_items.length == 1 ? a_items.first : a_items
end
该方法旨在返回一个字符串,其中包含有关items
的信息。如果有很多项,它将返回一个数组。三元组使得如果只有一个项目,它只返回该字符串。
这里的最佳做法是什么?即使只有一个项目,这样的方法总是会返回一个数组吗?
答案 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)}
问候。