-3

アイスクリームの値段を計算する簡単なプログラムを書いています。

プロセスは非常に簡単です。コーンを選び、いくつかのフレーバーを選び、いくつかのトッピングを選んで、金額を支払います。

さまざまなコーンがたくさんあり、さまざまなフレーバーがたくさんあり、さまざまなトッピングがたくさんあります.

私の設計は、デコレータ クラスを使用して、注文方法と同様にアイスクリームを包むことです。

そのため、Cone、Flavor、Toppings のデコレータ クラスとともに、価格を示す「amount」属性を提供するベース Ice Cream クラスがあります。各クラスはアイスクリームのオブジェクトを取り、その量に追加するので、基本的にはさまざまな種類のアイスクリームを混ぜ合わせます。

実際のお金の取引を処理する別のクラスがあり、さまざまなオブジェクトを取得して価格を計算します。特に、アイスクリームを検出すると、アイスクリーム関連の処理を実行します。

さて、このデザインは問題ないように思えますが、アイス クリーム メーカーから出てきたオブジェクトがアイス クリーム タイプであるかどうかを確認するにはどうすればよいでしょうか。結局のところ、理論上はたくさんのデコレータで囲まれているので、そのクラスを尋ねると、おそらくアイスクリームだけではなく、Topping のようなものが表示されるでしょう。アイスクリームもスーパークラスである必要はありません。階層内のいくつかのクラスになる場合があります。

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

また、一連のクラスを使用して実装しました。このタイプのデザインを実現するために使用できるルビーの他の方法はありますか?

4

1 に答える 1

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

より慣用的な設計アプローチについては、おそらくモジュールとその mixin としての使用を検討する必要があります。

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

于 2012-05-04T18:21:37.657 に答える