Ruby のマスターメソッドデリゲーション:実践ガイド
プログラミングにおける委任とは、プログラムのある部分から別の部分にタスクを引き渡すことを指します。これはオブジェクト指向プログラミングにおいて不可欠なテクニックであり、各オブジェクトまたはメソッドが特定のタスクまたは動作を担当するようにすることで、クリーンで保守しやすいコードを実現します。
委任を理解し、使用することが、Ruby やその他のオブジェクト指向言語をマスターする鍵となります。委任により懸念事項の分離が促進され、コードがよりモジュール化され、理解、テスト、リファクタリングが容易になります。
この記事では、Ruby で委任を実現する 3 つの方法について詳しく説明します。明示的な委任、Forwardable の使用 モジュール、および ActiveSupport::Delegate (Rails の場合)。
始めましょう!
Ruby での委任
まず、明示的な委任、つまりメソッド内でメソッドを呼び出すことについて説明します。次に、組み込みの Forwardable を調べます。 最後に、ActiveSupport::Delegate について説明します。 、便利な機能を備えた Rails 固有の委任ツールです。
明示的な委任
最も単純な形式では、委任は、別のメソッド内でメソッドを明示的に呼び出すことによって実現できます。このアプローチは、委任されたメソッドが別のオブジェクトに属している場合、または委任が単純でより高度な技術を使用する必要がない場合によく使用されます。
Ruby での明示的な委任の実装は簡単です。 Printer の例を見てみましょう。 HP オブジェクトを使用してテキストを印刷するクラス:
上の例では、Printer の print メソッド クラスは書式設定タスクを HP に明示的に委任します。 クラスの format メソッドを呼び出します。この委任は、印刷責任をシンプルで読みやすい方法で別のクラスにアウトソーシングします。
明示的な委任は、関心事の分離と保守可能なコードの促進に役立つため、実際のアプリケーションでは一般的です。たとえば、この手法は、あるサービスが別のサービスを呼び出して特定のタスクを実行する、異なるサービス間の通信を必要とするアプリケーションで使用されていることがあります。
さらに、明示的な委任は、外部コードとの対話を分離できるため、サードパーティ ライブラリのアダプタやラッパーを構築するときに役立ちます。
要約すると、明示的な委任は、Ruby のオブジェクト間でタスクを委任するための簡単で効果的な方法です。別のメソッド内でメソッドを呼び出すことで、責任を簡単に委任できるため、コードがより保守しやすくなり、関心の分離が促進されます。
Ruby の転送可能モジュール
Forwardable モジュールは、明示的な委任と比較して、メソッドを委任するためのより合理化された柔軟なアプローチを提供する組み込みの Ruby ライブラリです。 Forwardable モジュールをクラスに含めることで、def_delegator などのメソッドにアクセスできるようになります。 と def_delegators 、委任が簡単になります。
Forwardable モジュールの使用を開始するには、それをクラスに組み込み、def_delegator を使用します。 とdef_delegators メソッドを使用して、それぞれ 1 つまたは複数のメソッドを委任します。新しい Formatter を使用してプリンターの例をもう一度見てみましょう。 クラスを作成し、Forwardable モジュールを実装します。
上の例では、def_delegator を使用しました。 Formatter クラスからフォーマット メソッドを委任します。複数のメソッドを一度に委任する必要がある場合は、def_delegators を使用できます。 。たとえば、Formatter の場合、 クラスには capitalize などの追加メソッドがありました 、次のように委任できます。
Forwardable モジュールを使用する場合、考慮すべき重要な潜在的な欠点がいくつかあります。
- まず、委任を使用する前にターゲット オブジェクトが初期化されていることを確認します。そうしないと、エラーが発生する可能性があります。
- 第 2 に、委任を過度に使用すると、どのメソッドがクラスに属し、どのメソッドが委任されているかが不明瞭になる可能性があるため、コードの可読性が混乱する可能性があります。
- 最後に、Forwardable を使用すると、直接メソッド呼び出しと比較してパフォーマンスのオーバーヘッドがわずかに発生する可能性があります。ただし、このオーバーヘッドは、ほとんどのアプリケーションでは通常無視できます。
Forwardable モジュールの詳細については、Forwardable のドキュメントを参照してください。
ActiveSupport::Delegate Rails アプリケーション用
ActiveSupport::Delegate Rails が提供する委任ユーティリティであり、関連するオブジェクトにメソッドを委任するための簡潔な構文を提供します。 Ruby の組み込み Forwardable モジュール ActiveSupport::Delegate と類似点がありますが、 Rails アプリケーションに合わせた追加のオプションと機能を提供します。
ActiveSupport::Delegate を使用するには 、クラスでデリゲート メソッドを呼び出し、ターゲット オブジェクトとともにデリゲートされるメソッドを指定するだけです。プリンターとフォーマッタの例に戻り、ActiveSupport::Delegate を使用して委任を実装してみましょう。 :
ActiveSupport::Delegate は、さまざまなシナリオで役立つ追加のオプションと機能を提供します。たとえば、:prefix を使用できます。 委任されたメソッドの先頭にプレフィックスを追加するオプション。複数のメソッドを一度に委任したい場合は、to: の前にメソッドをリストするだけです。 オプション:
これにより、formatter_format のようなメソッドが生成されます。 、formatter_bold 、および formatter_italic Printer 内 クラス、Formatter のそれぞれのメソッドに委任します。 クラス。
ActiveSupport::Delegate は、関連するモデルまたはオブジェクト間でメソッドを委任するために、実際の Rails プロジェクトで一般的に使用されます。たとえば、User がある場合、 belongs_to のモデル 組織の場合は、organization から name メソッドを委任できます。 モデルを User に設定します このようなモデル:
これにより、ユーザー オブジェクト user.organization_name を通じて組織名にアクセスできるようになります。 .
結論としては、ActiveSupport::Delegate は、メソッドの簡潔かつ表現力豊かな委任を可能にする、Rails アプリケーション用の強力なツールです。追加のオプションと機能を活用することで、Rails プロジェクトのコンテキストでオブジェクト指向プログラミングの原則に準拠した、保守可能でよく整理されたコードを作成できます。
ActiveSupport::Delegate の詳細については、こちらをご覧ください。 および利用可能なすべてのオプションについては、Rails ActiveSupport のドキュメントを参照してください。
委任手法の比較
明示的な委任は委任への最も簡単なアプローチであり、委任されたオブジェクトから目的のメソッドを呼び出すメソッドを手動で定義する必要があります。この手法はシンプルで外部ライブラリを必要としませんが、委任するメソッドの数が増えると冗長になる可能性があります。
Ruby に組み込まれている Forwardable モジュールは、メソッドを委任するためのより効率的な方法を提供します。def_delegator を使用することで、 と def_delegators メソッドを使用すると、1 つまたは複数のメソッドを簡潔に委任できます。
ActiveSupport::Delegate Rails の ActiveSupport ライブラリの一部であり、メソッドの委任を処理するための宣言的な方法を提供します。クリーンな構文と接頭辞などの追加オプションを備えた、Rails コンテキストにおける表現力豊かなツールです。明示的な委任と比較すると、ActiveSupport::Delegate 特に複数のメソッドを委任する場合、より表現力が豊かになり、冗長さが少なくなります。ただし、Rails が必要なため、Rails 以外の Ruby プロジェクトには適していません。
委任手法の選択は、特定のニーズとアプリケーションによって異なります。明示的な委任はシンプルさと明確さを提供しますが、Forwardable モジュールはより合理化されたアプローチを提供し、ActiveSupport::Delegate は強力な Rails 固有のソリューションを提供します。これらのオプションを理解すると、プロジェクトとコーディング スタイルに最も適した手法を選択できるようになります。
まとめ
明示的な委任から、組み込みの Forwardable モジュールまたは Rails 固有の ActiveSupport::Delegate の使用まで 、それぞれの手法には、独自の利点と潜在的な欠点があります。選択すべき手法は、特定のコンテキスト、プロジェクトの性質、個人のコーディング スタイルによって異なります。
これらのテクニックを理解すると、Ruby プログラミング スキルの幅が広がるだけでなく、よりモジュール化され、読みやすく、保守しやすいコードを作成できるようになります。この知識があれば、雄弁な設計で複雑な問題に取り組む準備が整います。
委任していただきありがとうございます。
追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。
ジェフ・モーハウス
ゲスト著者の Jeff Morhous は、患者が必要な薬を入手できるようにコードを作成し、バグを修正するソフトウェア エンジニアです。最近は Ruby on Rails を使用した Web アプリケーションの作成に重点を置いていますが、以前は iOS と Android の開発に Swift、Java、Kotlin を使用していました。
Jeff Morhous によるすべての記事
-
Rails でのデバイスのマスタリング:OmniAuth、API Auth、および Authtrail
このシリーズのパート 1 では、サンプル アプリを使用してモジュール、ヘルパー、ビュー、コントローラー、ルートを探索する Devise を紹介しました。 このパートでは、Devise のより高度な使用法、特に OmniAuth、API 認証、Authtrail の使用法について説明します。 早速始めてみましょう! Ruby の OmniAuth による認証 現在では、ほぼすべての Web アプリケーションで、Twitter や Facebook などのソーシャル ネットワークから Google、GitHub などに至るまで、幅広い認証プロバイダを介してログインするオプションが提供されてい
-
Ruby on Rails でアクション ポリシーをマスターする:安全な認可のための実践ガイド
アプリを安全に保つには、アプリにアクセスできるユーザーと内容を制御する必要があります。アクセス制御は、「誰に」アクセスを許可する認証と、「何に」アクセスできる認可に分類できます。 認証については別の日に取り上げますが、ユーザーの承認に関しては、通常、ロールベースの戦略を使用するか、リソースベースの戦略を使用するかの 2 つの方法があります。 この 2 部構成のシリーズでは、Ruby on Rails ブログ アプリケーションでの Action Policy gem の使用について詳しく説明します。 このパートでは、アクション ポリシーの基本について説明します。 始めましょう! 前提条件