2014-06-20 201 views
-1

我认为空对象模式是一种减少重复代码的方法,用于检查nil或根据nil的值进行操作。我的想法错了吗?什么是空对象模式?

我用null对象重构了这段代码:https://github.com/WithGJR/null。请告诉我是否有什么问题。

+0

我不确定你在这里的意思。在Ruby中有'nil'对象,但是与JavaScript中可能没有的'null'等价。 'nil'更类似于'undefined',因为它通常被认为是一个非值,即使它是一个响应方法的对象。 – tadman

+0

By * Null Object *你指的是一个对象,它通过不做任何事情来响应任何消息并返回'nil',对吧?这样,你可以说'might_be_a_null_object.any_method',而不必担心显式的'nil'检查或'NoMethodError',对吧?如果'x'应该是一个字符串,但可能是'nil',并且您希望像'空字符串'那样对待'nil',那么类似的模式就会说'x.to_s'。 –

回答

2

从你的榜样,所谓的Null Object概念是在你的代码不使用Ruby nil,因为nil并不Subscription类的方法作出回应。

nil的情况下,你必须实现

def price 
    # this will generate a NoMethodError: undefined method `price' for nil:NilClass 
    subscription.price 
end 

因为这样的事情:

def price 
    subscription.try(:price) || 0 
    # or if you don't use rails try method 
    # subscription.nil? ? 0 : subscription.price 
end 

引进NullSubscription可以确保您@subscription对象user.rb总是响应方法chargehas_mentoring?price,这些方法总是返回一个合适的值(不管它是否是真实的Subscriptoin实例或NullSubscription实例)。所以无论如何你都可以直接拨打subscription.price

(感谢@FrederickCheung)如果您搜索的是Rails的源代码module Nullclass Null,您可以找到这种模式的一些示例。

在Rails应用程序,人们倾向于使用Rails的trytry!方法来处理零对象。

+1

利用'nil.to_s =='''','nil.to_i == 0','nil.to_a == []',...也是很常见的。至少它在我的代码中。 –

+1

至少有一个地方使用它:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/null_relation.rb –

+0

@FrederickCheung,我没想到:-)。实际上,在rails代码库中搜索'module Null'和'class Null'会返回很多... – huocp