公開されたデザインパターン:戦略パターン



このブログでは、動的に選択できる互換性のあるアルゴリズムファミリを作成するために使用される戦略デザインパターンについて説明します。

'

「DesignPatternsExposed」シリーズの最初の投稿へようこそ。このシリーズでは、各デザインパターンを最初から明らかにします。





プログラミング言語とその構成を知っているだけでは、優れたプログラマーや開発者にはなりません。現在および将来的に機能するソフトウェアを作成するには、デザインパターンの知識が必要です。

多くの開発者は、現在直面している、または将来直面するであろう設計上の問題にすでに遭遇しています。彼らはその問題に対処する標準的な方法を指定しました。したがって、デザインパターンを使用することで、実績のある手法を使用できるという利点が得られます。



各デザインパターンは、特定の種類の状況を解決するためのものであり、複数のデザインパターンを使用できる場合があります。

ほとんどのプログラマーは、デザインパターン、冗長なコード、さらには密結合を気にせずに、直面している問題を解決しようとします。しかし、優れたプログラマーは別の方法で始めます。彼らは、今日の要件、将来の要件、コードの保守、およびコードの再利用性について考えています。

優れたプログラマーは、要件を取得した後、コーディングを急いで開始する必要はありません。彼らは座って、自分たちのデザインが機能するかどうかについての問題について考えます。はいの場合、要件が変更される6か月後に機能するかどうか。



優れたプログラマーは、ペンと紙を持って、クラスとクラス間の関係の設計を開始します。彼らは、オブジェクト指向の原則を念頭に置いて、これらすべてを実行しながら、設計で疎結合と高い凝集度を取得しようとします。低レベルのコードにすぐに入るわけではありません。柔軟で再利用可能なソフトウェアを設計するには、このアプローチに従う必要があります。そうしないと、以前に作成したコードを常に変更することになります。

ソフトウェア業界で一定していることは1つだけであり、それは 変化する。 要件は確実に変化し続けます。では、コードが将来の要件に簡単に適応できるソフトウェアをどのように設計するのでしょうか。そのためには、早期に開始し、将来の要件が以前のコードを壊さないように設計する必要があります。

どうやってやるの?

そうですね、それは、設計原則とそれらの原則に基づく設計パターンに従うことによって行うことができます。

それでは、コーディングに飛び込み、より優れたプログラマーになるための旅を始めましょう。この投稿では、最も重要なパターンの1つを明らかにします –戦略パターン

私が最も重要だと言うとき、それは戦略パターンによって解決される一般的な問題を反映しています。

戦略パターンとは何ですか?

「GangofFour」の本から直接定義したものは次のとおりです。戦略パターンは、実行時に必要なプロセスが選択されるアルゴリズムの交換可能なファミリを作成するために使用されます」。

あなたがいる場合理解できません、心配しないでください、私たちはそれを説明するつもりですよりシンプル仕方あなたのために理解する。

最初に問題を理解してから、戦略パターンがそれをどのように解決できるかを見ていきましょう。

上記のUMLダイアグラムには、Animal抽象クラスと、Animalスーパークラスから拡張された2つの具象クラスDogとBirdがあります。

それでは、Animal抽象クラスと2つの具象クラス、DogとBirdを定義しましょう。

上記のデザインについてどう思いますか?私たちのデザインには大きな間違いが1つあります。

上記の場合のように、犬が飛ぶことができないように、すべての動物が飛ぶことはできません。しかし、それでも「飛ぶ」動作があります。

Animalクラス内にabstractfly()メソッドを記述して間違えました。この設計により、各サブクラスのDog、Bird、Penguin、Crocodile、Gooseなどにfly()メソッドの実装が強制されます。

飛行はすべての動物が持つとは限らない能力であることを理解すべきでした。動物の抽象クラスでfly()メソッドを提供することにより、すべてのサブクラスで飛行能力を設定しましたが、これは動物のすべてのサブクラスに対して正しくありません。

PHPウィンドウをインストールする方法

サブクラスにflyメソッドを実装する際の問題は何かと思うかもしれません。飛んでいない動物のサブクラスにfly()メソッドを実装して、「I ca n’tfly」と出力することもできます。しかし問題は、あなたはまだ飛んでいない動物に飛ぶ行動を与えているということです。これは正しくありません。

dog.fly()またはcrocodile.fly()を呼び出すとどのように感じますか。

これで、設計が正しくないことがわかりました。動物サブクラスからfly()メソッドを削除する必要があります。

すべてのAnimalサブクラスにフライ動作を強制しないようにクラスを設計するもう1つの方法は何ですか。

すぐに頭に浮かぶ解決策の1つは、フライ方式のフライングインターフェイスを作成でき、フライできる動物だけがそのフライングインターフェイスを実装することです。このように、ハエの行動を定義するためにすべての動物サブクラスを強制するわけではありません。それでは、この設計アプローチをコーディングしましょう。

これで、Animalクラスからflyメソッドを削除すると、Animalクラスは次のコードのようになります。

それでは、Flyingインターフェースを定義しましょう

これで、犬のクラスが変更されますなので以下のコードで、フライ動作をする必要はありません。

飛行動作をする動物サブクラスのいくつかを見てみましょう。

以前の問題は解決しましたが、新たな問題が発生しました。それが「コードの重複」です。

たとえば、100種類の空飛ぶ動物のサブクラスがあります。フライングインターフェイスはフライ動作の実装を提供できないため、フライ動作のコードを複製する必要があります。後でサブクラスのfly()メソッドの実装を変更する場合は、そのクラスを開いてコードを変更する必要があります。これは悪いです。何か大きなものが不足しているため、実行時にクラスの飛行動作を変更することはできません。

しかし、心配しないでください。この問題から抜け出すための戦略パターンがあります。

それでは、ストラテジーパターンを使用するようにコードをリファクタリングしましょう。

フライングインターフェースはそのままです。ここで、各飛行サブクラスが飛行インターフェース自体を実装するのではなく、異なる飛行動作を実装する個別の具象クラスを定義します。その方法を見てみましょう。

それで、それがすべてどのように機能するか、TestClassを見てみましょう

ストラテジーパターンを使用することで、実行時に動物の飛行行動を変更できるようになりました。これにより、サブクラスに飛行行動自体を指定させる必要がなくなりました。

いつストラテジーパターンを使用するのですか?

実行時に動作を動的に変更できるようにしたい場合。

戦略パターンを明確に理解するために、別の例を見てみましょう。

上記の従業員クラスでは、指定に応じて従業員の給与を設定しています。従業員が「インターン」の場合、実際の給与を計算するために基本給に10%のボーナスを追加します。

従業員が「Web開発者」である場合、実際の給与を計算するために基本給に20%のボーナスを追加します。他のタイプの従業員についても、同様のプロセスが続きます。実際の給与を計算するためのアルゴリズムは、理解しやすくするために非常に単純ですが、ほとんどの場合、多くの比較と計算が含まれています。

では、従業員クラスのコードの何が問題になっていますか?

さて、賃金を計算するためのコード(getPay())は静的です。 「インターン」のボーナスを10%から14%に変更したいとします。 Employeeクラスのコードを開いて変更する必要があります。

また、別の問題は、実行時に従業員の給与アルゴリズムを変更できないことです。だから、それを行う方法は?ストラテジーパターンは、この種の問題を処理するために特に使用されます。

ストラテジーパターンを使用するようにコードをリファクタリングしてみましょう。

賃金を計算するためのいくつかのアルゴリズムを定義します。そうすれば、これらのアルゴリズムのいずれかを使用して、実行時の賃金を計算できるようになります。

それでは、Employeeクラスがどのように変化するかを見てみましょう。

注意: Employeeクラスから賃金計算ロジックを削除し、賃金計算に使用するPayAlgorithmを設定するためのset PayAlgorithm()メソッドを作成しました。

これにより、実行時にPayAlgorithmを動的に指定することで、給与を計算する柔軟性が得られます。また、後で賃金計算ロジックを変更する必要がある場合は、新しいPayAlgorithmを作成し、それを使用して賃金を計算できることに注意してください。以前のコードを変更する必要はありませんね。

それで、それが機能するのを見てみましょう。

SQLの例の日付データ型

戦略パターンをよく理解していただければ幸いです。何かを学ぶための最良の方法は、練習することです。

ストラテジーパターンまたはその他のパタ​​ーンに関連するクエリがある場合は、以下にクエリを残してください。

次の投稿に注意してください。ここでは、最も人気のあるデザインパターンの1つであるファクトリパターンを明らかにします。

それまでは、コードプレイをダウンロードして、戦略パターンを頭の中にしっかりと固定することができます。

質問がありますか?コメントセクションでそれらに言及してください。折り返しご連絡いたします。

関連記事: