7つの最も重要なソフトウェア設計パターン

ソフトウェアデザインパターンの主題についての包括的な詳細については、C.H。が作成したソフトウェアデザインパターン:開発者向けベストプラクティスをご覧ください。 Netflix、Microsoft、およびOracleで複数年の経験を持つベテランのソフトウェアエンジニアであるAfzal。以下の多くは彼のコースから要約されています。

なぜデザインパターンなのか?

デザインパターンは、最近ではプログラミングの世界でいくつかの論争の対象になっています。これは、主に、理解と管理が困難なコードにつながる「使い過ぎ」と認識されているためです。

デザインパターンは、コードに「万能」な方法で偶然に適用されるショートカットを一緒にハッキングすることを意図したものではないことを理解することが重要です。最終的に、ソフトウェアエンジニアリングの真の問題解決能力に代わるものはありません。

ただし、適切な状況で適切な理由で使用された場合、デザインパターンは非常に有用であるという事実が残っています。戦略的に使用する場合、すでに他の人によって改良された方法を使用する代わりに、ことわざの輪の再発明を回避できるようにすることで、プログラマーを大幅に効率化できます。また、他の人と議論したり、大規模なチームでコードを管理したりするときに繰り返し発生する問題と解決策を概念化するための便利な共通言語も提供します。

そうは言っても、重要な注意点は、各パターンの背後にある方法と理由が開発者にも理解されるようにすることです。

苦労せずに(一般的に重要度の高い順):

最も重要な設計パターン

  1. シングルトン

シングルトンパターンは、クラスの作成を1つのオブジェクトのみに制限するために使用されます。これは、システム全体でアクションを調整するために1つ(1つだけ)のオブジェクトが必要な場合に役立ちます。キャッシュ、スレッドプール、レジストリなど、クラスのインスタンスが1つだけ存在する場所の例がいくつかあります。

クラスのオブジェクトを開始するのは簡単ですが、1つのオブジェクトのみが作成されるようにするにはどうすればよいでしょうか?答えは、コンストラクターを、シングルトンとして定義する予定のクラスに対して「プライベート」にすることです。これにより、クラスのメンバーのみがプライベートコンストラクターにアクセスでき、他のユーザーはアクセスできません。

重要な考慮事項:コンストラクターをプライベートではなく保護することにより、シングルトンをサブクラス化することが可能です。これは状況によっては適切な場合があります。これらのシナリオでとられるアプローチの1つは、サブクラスのシングルトンのレジスタを作成することで、getInstanceメソッドはパラメーターを取得するか、環境変数を使用して目的のシングルトンを返すことができます。その後、レジストリは、必要に応じてアクセスできるシングルトンオブジェクトへの文字列名のマッピングを維持します。

2.ファクトリーメソッド

通常の工場は商品を生産します。ソフトウェアファクトリはオブジェクトを生成します。それだけでなく、作成するオブジェクトの正確なクラスを指定せずにそうします。これを実現するために、オブジェクトを作成するには、コンストラクターを呼び出す代わりにファクトリーメソッドを呼び出します。

通常、Javaでのオブジェクト作成は次のように行われます。

SomeClass someClassObject = new SomeClass();

上記のアプローチの問題は、SomeClassのオブジェクトを使用するコードが、突然SomeClassの具体的な実装に依存するようになることです。 newを使用してオブジェクトを作成しても何も問題はありませんが、コードを具体的な実装クラスに緊密に結合する手荷物が伴います。

3.戦略

戦略パターンにより、抽象化の下で関連するアルゴリズムをグループ化できます。これにより、クライアントを変更せずに、あるアルゴリズムまたはポリシーを別のアルゴリズムまたはポリシーに切り替えることができます。コードは、単一のアルゴリズムを直接実装する代わりに、実行するアルゴリズムのグループを指定するランタイム命令を受け取ります。

4.オブザーバー

このパターンはオブジェクト間の1対多の依存関係であるため、1つのオブジェクトが状態を変更すると、そのすべての依存関係が通知されます。これは通常、それらのメソッドの1つを呼び出すことによって行われます。

簡単にするために、Twitterで誰かをフォローするとどうなるかを考えてください。あなたは基本的に、あなたにフォローしている人(件名)の更新をツイートする(オブザーバー)ようにTwitterに要求しています。パターンは、更新に関心のあるオブザーバーと更新を生成するサブジェクトの2つのアクターで構成されています。

サブジェクトは多くのオブザーバーを持つことができ、1対多の関係です。ただし、オブザーバーは他のサブジェクトからの更新も自由に購読できます。 Facebookページからニュースフィードを購読することができます。これは件名になり、ページに新しい投稿があるたびに、購読者に新しい投稿が表示されます。

重要な考慮事項:多数の被験者と少数のオブザーバーの場合、各被験者が別々にオブザーバーを保存すると、一部の被験者が同じオブザーバーを複数回保存するため、保存コストが増加します。

5.ビルダー

名前が示すように、ビルダーパターンはオブジェクトの構築に使用されます。場合によっては、作成するオブジェクトは複雑で、複数のサブオブジェクトで構成されたり、複雑な構築プロセスが必要になることがあります。ビルダーパターンを使用することにより、複雑なタイプを作成する演習を簡素化できます。複合オブジェクトまたは集合オブジェクトは、ビルダーが一般的に構築するものです。

重要な考慮事項:ビルダーパターンは「抽象ファクトリ」パターンに似ているように見えるかもしれませんが、1つの違いは、ビルダーパターンがオブジェクトを段階的に作成するのに対し、抽象ファクトリパターンは一度にオブジェクトを返すことです。

6.アダプター

これにより、あるクラスのインターフェイスを別のクラスに変換することにより、互換性のないクラスが連携して動作することができます。翻訳者のようなものだと考えてください。共通言語を話さない2人の国家元首が出会うと、通訳が通常2人の間に座って会話を翻訳し、コミュニケーションを可能にします。

2つのアプリケーションがあり、一方が出力をXMLとして出力し、もう一方がJSON入力を必要とする場合、2つのアプリケーションをシームレスに動作させるにはアダプターが必要です。

7.状態

状態パターンは、マシンが取り得るさまざまな状態をカプセル化し、内部状態が変化したときにオブジェクトが動作を変更できるようにします。機械またはコンテキストは、パターンスピーチで呼び出されるため、さまざまな状態に推進するアクションを実行できます。パターンを使用しないと、コードは柔軟性がなくなり、if-else条件が散らばってしまいます。

学び続けたいですか?

ソフトウェア設計パターン:開発者向けのベストプラクティスを使用すると、理論を読むだけでなく、それ以上のことを行うことができます。実際の問題を深く掘り下げ、実際のコード例を使用して実用的なソリューションを理解することができます。

このコースは、ギャングオブフォーの人気の本に基づいていますが、インタラクティブで消化しやすい形式で提供されています。本から23の有名なデザインパターンをインタラクティブに習得し、3つの主要なデザインパターンタイプ(創造、構造、および動作)の適切なアプリケーションを学び、これらのデザインパターンを自分のプロジェクトに組み込むことを学びます。

今すぐチェックしてください。

当初は2018年11月7日にblog.educative.ioで公開されました。