Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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 クラス。

Rubyのデコレータデザインパターン

WithLoggingを使用することはできません およびWithPerformanceTesting 同時に、このクラスを作成しない限り…

class HTTPClientWithLoggingAndPerformanceTesting
  # ...
end

デコレータパターンは解決 コードの重複を回避するときにこの問題が発生する &クレイジーなクラス名。

ビデオ

概要

デコレータデザインパターンについて学習しました 、このパターンは、オブジェクトに新しい機能を追加するのに役立ちます クラスを変更する必要はありません。

受け身にならないでください!今度は、この概念を自分で練習して適用する番です。必要なときにこれを覚えておくのに役立ちます。

この記事を共有して、より多くの人が読めるようにします🙂


  1. RubyのSOLID設計原則

    すべてのソフトウェアアプリケーションは時間とともに変化します。ソフトウェアに加えられた変更は、予期しないカスケードの問題を引き起こす可能性があります。ただし、変更しないソフトウェアは構築できないため、変更は避けられません。ソフトウェア要件は、ソフトウェアの成長とともに変化し続けます。私たちにできることは、変更に対して回復力のある方法でソフトウェアを設計することです。ソフトウェアを適切に設計することは、最初は時間と労力を要する可能性がありますが、長期的には時間と労力を節約します。緊密に結合されたソフトウェアは壊れやすく、変更によって何が起こるかを予測することはできません。設計が不十分なソフトウェ

  2. AASMGemを使用してRubyでステートマシンを作成する方法

    今日は、ステートマシン、それらがどのように機能するか、AASMgemを使用したRubyプロジェクトでそれらを使用する方法について学習します。 今 : 信号機を想像してみてください… 赤、緑、黄色のいずれでもかまいません。 色が変わると、次へ 色は現在に基づいています 1つ。 これは、目の不自由な人がいつ横断できるかを知るための音を出す種類だとしましょう。 今 : あなたはこのためのソフトウェアを書いています。 毎回再生する音と次の色をどのように知るのですか? 次のようなifステートメントを記述できます: if @light.state == green @ligh