デコレータを使用して Ruby クラスに機能を追加する方法

デコレータを使用すると、実行時にオブジェクトに動作を追加できますが、クラスの他のオブジェクトには影響しません。デコレータは、クラスに対する責任を動的に追加および削除する必要がある場合に適用できます。デコレータ パターンは、サブクラスを作成する代わりに役立ちます。これらは、パブリック API の一貫性を維持しながら、クラスに追加の機能を提供します。 Ruby デコレータの重要性を理解するために例を見てみましょう。 300 を返す Price メソッドを持つ Tattoo クラスがあると考えてください。
クラス タトゥー デフ価格 300 終了終了
機能として追加の色を追加します。価格は 150 増加します。 最も簡単な方法は、price メソッドで 450 を返す TattooWithColour サブクラスを作成することです。
class TattooWithColour < Tattoo def 価格 450 end end
次に、タトゥーの価格に 200 を追加する大きなタトゥーを表す必要があります。これは、Tattoo の BigTattoo サブクラスを使用して表現できます。
クラス BigTattoo < タトゥーのデフォルト価格 500 end end
より大きなサイズのタトゥーを入れることもでき、BigTattoo にさらに価格が追加される可能性があります。これらのタトゥー タイプを色とともに使用できることを考慮する場合は、BigTattooWithColour サブクラスと BiggerTattooWithColour サブクラスを追加する必要があります。 この方法では、合計 6 つのクラスが作成されます。これらの組み合わせをタトゥーの追加のデザインで表現したい場合は、その数を 2 倍にしても構いません。

モジュールによる動的継承

コードを簡素化するために、モジュールを使用して動作を Tattoo クラスに動的に追加する場合があります。このために ColourTattoo モジュールと BigTattoo モジュールを作成しましょう。
モジュール ColourTattoo デフォルト価格 スーパー + 150 エンドエンド
モジュール BigTattoo デフォルト価格 スーパー + 200 エンドエンド
これで、Object#extend メソッドを使用してタトゥー オブジェクトを動的に拡張できるようになりました。 tattoo = Tattoo.new tattoo.extend(ColourTattoo) tattoo.extend(BigTattoo) これは、継承ベースの実装に比べて優れた改善です。サブクラスを持つ代わりに、1 つのクラスと 3 つのモジュールだけが存在します。方程式に追加の設計を追加する必要がある場合、必要なモジュールは 12 クラスではなく 4 つだけです。

デコレータパターンの適用

このモジュールベースのソリューションによりコードは大幅に簡素化されましたが、デコレータを使用することでコードをさらに改善することができます。 BiggerTatto は、Tattoo のコストに 150 を 2 回加算することによって形成されると考えます。 モジュールベースのアプローチではこれを行うことはできません。 BiggerTattoo を取得するために tattoo.extend(BigTattoo) を 2 回呼び出したくなるかもしれません。すでに拡張モジュールを使用している場合、モジュールを 2 回拡張しても効果はありません。 同じ実装を使用し続ける場合は、コストとして super + 300 を返す BiggerTattoo モジュールが必要になります。代わりに、複雑なオブジェクトを構築するために構成できるデコレーターを使用できます。まず、Tattoo オブジェクトのラッパーである BigTattoo というデコレーターから始めます。
class BigTatto def 初期化(タトゥー) @tattoo = タトゥー終了
デフォルト価格 @tattoo.price + 150 終了終了
このラッパーを Tattoo オブジェクトに対して 2 回使用することで、より大きな Tattoo を作成できるようになりました。 tattoo = Tattoo.new big_tattoo= BigTattoo.new(tattoo) big_tattoo = BigTattoo.new(big_tattoo) 同様に、TattooWithColour デコレータを使用してカラー タトゥーを表現できます。たった 3 つのクラスを使用して、6 種類のタトゥーを表現できるようになりました。 Ruby On Rails 開発のあらゆる側面における豊富な専門知識を備えた私たちは、 レイルスカルマは、適切なチャネルを通じて適切なタイミングで見込み客や顧客とコミュニケーションをとるための包括的なパーソナライズされた戦略の実装に役立つ幅広いサービスを提供します。詳細については お問い合わせ。

最新のアップデートを購読する

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

jaJapanese