Rubyでストラテジーデザインパターンを使用する方法
戦略デザインパターンについて話しましょう!
このデザインパターンは、メソッド内のメインアルゴリズムを変更するのに役立ちます。
これを行うには、このアルゴリズムをクラスにハードコーディングするのではなく、このアルゴリズムを実装するクラスを渡します。
そして私がアルゴリズムと言うとき 私は派手なコンピュータサイエンスアルゴリズムを意味するのではなく、結果を得るための一連の手順に従うコードを意味します。
戦略パターンを使用する場合
このパターンは正確にどのような問題を解決していますか?
開放/閉鎖原則の問題。
この原則は次のように述べています:
「ソフトウェアエンティティ(クラス、モジュール、メソッド)は、拡張のために開いており、変更のために閉じている必要があります。」
つまり、クラスに新しいことをさせるために、クラス自体を変更する必要はありません。これにより、コードの柔軟性と堅牢性が同時に向上します。
しかし、どうやってそれを達成しますか?
戦略パターンのようなデザインパターンを使用する🙂
ReportGenerator
があるとします クラスであり、同じデータを使用してさまざまな種類のレポート形式を生成したい。
レポートタイプごとにメソッドを作成することもできますが、それは、新しいタイプを追加するたびにクラスを変更する必要があり、オープン/クローズの原則に違反することを意味します。
またはさらに悪いことに!
あらゆる種類のifステートメントを含む単一の巨大なメソッドを持つことができます…これらは多くの場合うまくいきません。
しかし、クラスがレポートのフォーマット方法を知る必要がなかった場合はどうなりますか?
アルゴリズムがクラス外からのものである場合はどうなりますか ?
そうすれば、クラス自体を変更せずに、いつでもフォーマットアルゴリズムを変更できます。
これで問題は解決します。
そしてそれがまさに戦略パターンです です。
戦略パターンの例
戦略は、単一のメソッドを持つクラスの形式で実装されます。
ReportGenerator
のフォーマット戦略は次のとおりです。 クラス:
require 'json' module ReportFormatters class JSON def self.format(data) data.to_json end end class PlainText def self.format(data) data.to_s end end class HTML def self.format(data) html = "" html << "
- "
data.each { |product, amount| html << "
- #{product}: #{amount} " } html << "
すべての戦略がformat
をどのように実装しているかに注目してください 方法。このメソッドは、レポートジェネレータクラスによって呼び出されます。
ここにコードがあります :
class ReportGenerator def self.generate(data, formatter) formatter.format(data) end end data = { onions: 31, potatoes: 24, eggs: 10 } p ReportGenerator.generate(data, ReportFormatters::HTML) p ReportGenerator.generate(data, ReportFormatters::JSON) p ReportGenerator.generate(data, ReportFormatters::PlainText)
今:
出力形式を変更する場合(HTML
から) PlainText
へ )別の戦略を渡す必要があります。戦略がformat
を実装している限り、それは機能します。 メソッド。
このパターンについて考える別の方法は、特定のビジネス戦略を専門とするコンサルタントを雇うことです。コンサルタントが来て、戦略を実行します あなたにとって、この戦略は特定の結果を生み出します。
対照的に、デコレータパターンのようなパターンは、クリスマスツリーに新しい装飾を追加してより派手にするようなものです。
一度に使用できる戦略は1つだけですが、装飾品はいくつでも持つことができます。
ビデオ
概要
戦略設計パターンについて学習しました。クラス自体を変更せずに、クラスの機能の一部を変更する必要がある場合に使用してください。
読んでくれてありがとう!
この投稿を共有することを忘れないでください Twitterでおもしろいと思ったら 、それはより多くの人々がそれを楽しむのにも役立ちます🙂
-
Rubyのデコレータデザインパターン
デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli
-
Rubyの配列クラスの使用方法(例+便利なメソッド)
アレイとは何ですか? 配列は組み込みのRubyクラスであり、0個以上のアイテムのリストを保持します 、およびこれらすべてのアイテムを簡単に追加、アクセス、およびループするのに役立つメソッドが含まれています。 配列が存在しない場合は多くの変数を使用する必要があるため、これは便利です。 例 : a =1b =2c =3 しかし、代わりに、あなたはそうすることができます : 番号=[1、2、3] 最良の部分は? 配列内には何でも入れることができます! いいね : 数字 文字列 より多くのアレイ! (それは多次元配列になります) アレイを最大限に活用できるように、アレイについ