Ruby 设计 API 时,有时候很困扰

FenRagwort · 2012年04月08日 · 最后由 hooopo 回复于 2012年04月08日 · 2986 次阅读

在返回 0、空数组、空字符串还是 nil 之间犹豫不定

比如一个方法

def foo
  # blah blah
  return_array = []
  return_array unless return_array.empty?
end

最后这一句 return_array unless return_array.empty?要不要加呢?加了的话,如果运算得到的 return_array 是个空数组,那么就返回 nil,而不是 []。不加的话,永远返回一个数组。

虽说返回什么确实根据实际情况来定,但还是免不了觉得这也可以,那也可以。有什么 best practice 来指导一下怎么样决定返回值比较好么?

用 rabl,grape 之类的会省很多事

一般来说返回 [] 客户端处理会方便一些。不过这些确实是要看需求定义的。

个人觉得返回空数组的话,用户可以不检查返回结果而统一使用 each 之类的 enumerator。

#1 楼 @cqpx 楼主说的 API 不是你所想的 API. 个人认为,一个方法的返回类型最好要能确定是最好的,不能确定,也至少得返回的类型少,否则调用你这个方法接口的对方会很不方便,另外给你的接口方法取一个明确的有意义的名字也会少很多困惑。

我觉得返回空数组好,这样调用的时候就不用判断 nil? 了,直接用数组的方法

如果返回结果是数组类型的,我一直坚持返回空数组而不是 nil;一直认为代码应该从 client 的角度来考虑,可能自己需要多写一行代码却可以方便 n 个 API 的调用者

不知道楼主写过 Java 没,让每次客户端调用都去判断是否为 null 是超级无趣的。。。只不过语言不同设计思想却是相同的

返回array是最好的,如果ActiveRecord#all方法返回nil值那有多蛋痛? 正常写法:

User.all.each do |user|
 #something
end

变成:

users = User.all
if users.present?
  users.each do |user|
    #something
  end
end

需要 登录 后方可回复, 如果你还没有账号请 注册新账号