2012-05-04 7 views
-3

アイスクリームの価格を計算する簡単なプログラムを書いています。ルビー:デコレータ付アイスクリーム

このプロセスは非常に簡単です:コーンを選んで、いくつかの味を選んで、トッピングを選んで金額を払ってください。

さまざまなコーンがあり、さまざまな種類のフレーバーがあり、さまざまなトッピングがあります。

私のデザインは、あなたが注文する方法と同様にアイスクリームを包むためにデコレータクラスを使用することです。

私は、コーン、フレーバー、トッピングのデコレータークラスと一緒に、物量がどれくらいかを示す「量」属性を提供する、ベースのアイスクリームクラスを持っています。各クラスはアイスクリームのオブジェクトをとり、その量に追加するので、基本的にはさまざまなタイプのアイスクリームを組み合わせてマッチさせます。

私は実際のマネー取引を扱う別のクラスを用意しています。これはさまざまなオブジェクトをとり、価格を計算します。特に、アイスクリームが見られる場合、アイスクリーム関連のプロセスが実行されます。

今、このデザインはうまくいっていますが、アイスクリームメーカーから出てくるオブジェクトがアイスクリームタイプであるかどうかを確認するにはどうすればよいですか?結局のところ、それは理論的にはデコレータの束で包まれているので、あなたがそのクラスを尋ねるならば、ちょうどアイスクリームではなくトッピングのようなものを見るでしょう。アイスクリームはスーパークラスでは必要ありません。階層内に複数のクラスが存在する可能性があります。

<topping ice cream>.Instanceof(Ice_Cream)は動作していないようです。

また、クラスのセットを使用して実装しました。このタイプのデザインを実現するために私が使うことのできるルビの他の方法はありますか?

答えて

1

あなたは私たちにいくつかのコードを表示する必要がありますが、Rubyは、ここで参考にすることができObject#is_a?Class#===を持っています

class MyString < String ; end 
MyString.new.is_a? String #=> true 
String === MyString.new #=> true 
class AnotherString < MyString ; end 
AnotherString.new.is_a? String #=> true 
String === AnotherString.new #=> true 

あなたがについてClass#===を疑問に思う場合は、case文で使用するために、ほとんどです:

case value 
when String 
    # something 
when Array 
    # something else 
end 

もっと慣用的な設計アプローチのためには、おそらくモジュールとそれらの混合物を探すべきでしょう。

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html