2013-08-01 11 views
6

Null Object PatternをRailsアプリケーション(RubyTapasエピソード112にも記載)に実装した後、私はいくつかのコードをリファクタリングしましたが、これ以上動作しないように見える構文構造があります。NullObjectをRubyで偽に評価する

私はCURRENT_USERが、それはそれを返す設定されている場合、それはそれが出リダイレクト nilだった場合、今 current_user Null::Userのインスタンスので、「truthy」、およびそのスニペットであってもよいし、 current_user || redirect_out、のような文を書くために使用

リダイレクトされません。

||演算子を定義しようとしましたが、動作しませんでした。この構文がヌル(ただし真実)オブジェクトでも使用できる方法はありますか?

答えて

6

あなたはそのパターンを半分しか採用しておらず、その精神を正しく採用していないと思います。パターンの目的は、||を避けることです。

current_user || redirect_outを呼び出すための何らかの目的があるはずです。それは何かをしているか、その属性を取得している可能性があります。例えば、あなたのコードがあるとします。

(current_user || redirect_out).foo 

current_userNull::Userのインスタンスではありません、あなたはそれにfooを呼び出すために望んでいました。その場合、Null::User#fooredirect_outと定義します(可能であれば、他のクラスではfooのような操作を追加します)。

class Null::User 
    def foo; redirect_out ... end 
end 

(current_user || redirect_out).fooの代わりに、あなただけのcurrent_userNull::Userインスタンスでない場合には、それはfooを呼び出します

current_user.foo 

を行う必要があります。そのようなインスタンスの場合は、redirect_out ...ルーチンが呼び出されます。

3

Rubyでは、偽のオブジェクトが2つあります:nilfalseです。期間。

残念ながら、独自の偽のオブジェクトを定義することや、ブール演算子を無効にすることはできません(not/!を除く)。オブジェクトが別のオブジェクトをシミュレートできるのはOOの基本的な柱の1つですが、Rubyではfalseまたはnilをシミュレートすることはできません。したがって、OOの基本的なプロパティの1つをそうでなければかなり良いOOモデルです。

+0

私はあなたが 'not'と'! 'を上書きできるかどうかわかりませんでした。 – sawa

+1

@sawa: '!'と 'not'の両方で呼ばれる'! 'というメソッドを定義することができます。 –

5

私はかつてRubyで「偽の」オブジェクトを定義することができないし、ヌルオブジェクトの偽装を試みるのが間違っている理由について、an articleと書きました。基本的には

は、あなたができる最善のは紛らわしい一貫性のないオブジェクトが #!nil?を、使用を考え出すさなど

他の人が指摘したように、通常、あなたはそれがあなたのためだ「falsy」ヌルオブジェクトを作成したいとき多形性を十分に活用しているわけではありません。ヌルオブジェクトの全体点は型チェックを避けることであり、if文の形でNilClassをチェックすることは他の型チェックと同じように型チェックになります。

しかし、時にはそれはやむを得ないことです。だから私のNaughtライブラリでは、Actual()というヘルパ変換関数を(他のいくつかの変換の中で)生成しています。 Actual()はヌルオブジェクトをnilの値に戻しますが、他のすべてのオブジェクトだけを残します。したがって、オブジェクトの真実性を切り替える必要がある場合は、次のようにすることができます。

if Actual(obj_that_might_be_null) 
    # ...do stuff... 
end 
+0

良い記事から学んだ、ありがとう! – TuteC

関連する問題