Rubyのデコレータデザインパターン
デコレータのデザインパターンは何ですか?
そして、Rubyプロジェクトでこのパターンをどのように使用できますか?
デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。
例を見てみましょう!
ロギングとパフォーマンス
この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。
次のようになります:
require 'restclient' data = RestClient.get("www.rubyguides.com")
今 :
一部のリクエストにログを追加したいが、RestClient
を変更したくないとします。 モジュール。
これは、デコレータパターンを使用して実行できます。
これがログモジュールです :
module LogHTTPRequest def get(url) puts "Sending Request For #{url}" super end end
これにより、必要な情報が画面に出力され、元のget
が呼び出されます。 RestClient
のメソッド 。
リクエストにロギング機能を追加するには、extend
を使用できます メソッド。
このように :
class HTTPClient def initialize(client = RestClient) @client = client end def get(*args) @client.get(*args) end end client = HTTPClient.new client.extend(LogHTTPRequest) client.get("rubyguides.com")
このHTTPClient
を作成する必要があります RestClient
のためのラッパークラス はモジュールであり、モジュールからオブジェクトを作成することはできません。
デコレータパターンを使用する場合
このパターンの利点は、1つのオブジェクトのみを強化していることです。 、したがって、非ロギングクライアントとロギングクライアントを持つことができます。
もう1つの利点は、これらのデコレータを階層化して、パフォーマンステストを実行するデコレータ、ロギングなどを実行するデコレータを用意できることです。
継承を使用してHTTPClientWithLogging
を作成した場合、デコレータを組み合わせることができません。 、およびHTTPClientWithPerformanceTesting
クラス。
WithLogging
を使用することはできません およびWithPerformanceTesting
同時に、このクラスを作成しない限り…
class HTTPClientWithLoggingAndPerformanceTesting # ... end
デコレータパターンは解決 コードの重複を回避するときにこの問題が発生する &クレイジーなクラス名。
ビデオ
概要
デコレータデザインパターンについて学習しました 、このパターンは、オブジェクトに新しい機能を追加するのに役立ちます クラスを変更する必要はありません。
受け身にならないでください!今度は、この概念を自分で練習して適用する番です。必要なときにこれを覚えておくのに役立ちます。
この記事を共有して、より多くの人が読めるようにします🙂
-
RubyのSOLID設計原則
すべてのソフトウェアアプリケーションは時間とともに変化します。ソフトウェアに加えられた変更は、予期しないカスケードの問題を引き起こす可能性があります。ただし、変更しないソフトウェアは構築できないため、変更は避けられません。ソフトウェア要件は、ソフトウェアの成長とともに変化し続けます。私たちにできることは、変更に対して回復力のある方法でソフトウェアを設計することです。ソフトウェアを適切に設計することは、最初は時間と労力を要する可能性がありますが、長期的には時間と労力を節約します。緊密に結合されたソフトウェアは壊れやすく、変更によって何が起こるかを予測することはできません。設計が不十分なソフトウェ
-
AASMGemを使用してRubyでステートマシンを作成する方法
今日は、ステートマシン、それらがどのように機能するか、AASMgemを使用したRubyプロジェクトでそれらを使用する方法について学習します。 今 : 信号機を想像してみてください… 赤、緑、黄色のいずれでもかまいません。 色が変わると、次へ 色は現在に基づいています 1つ。 これは、目の不自由な人がいつ横断できるかを知るための音を出す種類だとしましょう。 今 : あなたはこのためのソフトウェアを書いています。 毎回再生する音と次の色をどのように知るのですか? 次のようなifステートメントを記述できます: if @light.state == green @ligh