パターンは、それらが最良のソリューションになるか、優れたソリューションの作成に役立つ場合にのみ使用する必要があります(同意しますか?)。
実装の詳細として設計パターンを厳密に見ています。公開APIとプログラムをそのドキュメントに文書化する場合、一般に、デザインパターンがどこにあるかは重要ではありません(または影響は大きくありません)。つまり、「ここにブリッジパターンがあります。その上にビジターを実装します」というわけではありません。代わりに、「このクラスはさまざまなオペレーティングシステムで異なる実装を持つため、ブリッジパターンを使用して実装されます」です。次に、それを使用する場合、ブリッジパターンとしてではなくパブリックAPIを見るので、ブリッジとして実装されていることに無関心です。
疎結合で柔軟な設計を作成するために実際にどれだけの労力を費やす必要がありますか?
疎結合は、単純な一連の規則に従うことで実現できます。これらを尊重すると、コードは(さらに)記述したときに疎結合になります(つまり、何らかの努力がすでに開発プロセスの一部になっています)。
ルールの中で(完全なリストではありません):
- クライアントコード(クラスの使用方法)を検討(または記述)してインターフェースを定義します。クラスが行うこと(つまり、実装ではなくインターフェースを設計する)ではありません。
- 「教えて、聞かないで」
- すでに作成されたパーツからオブジェクトを構築する
- コンストラクターに、使用する実際のオブジェクトを渡します(メンバーのファクトリー、パラメーターのファクトリーのパラメーターなどではありません)。
- DRY(2つの場所に同じ順序で表示される2つの行がある場合、それらを別の関数に抽出する、など)。
- オブジェクトの作成がより複雑な操作である場合は、中間パーツの作成をファクトリメソッド/クラスとして(つまり、コンストラクタ本体ではなく)実装します。
- YAGNI(以前ではなく、必要に応じて作成する)。
これらのルールは、言語、開発方法論、続いてチーム(TDDなど)、時間予算の制約などに応じて、異なる方法で守られます。
たとえば、Javaでは、インターフェイスをとして定義し、interface
その上にクライアントコードを作成することをお勧めします(その後、実装クラスでインターフェイスをインスタンス化します)。
一方、C ++ではインターフェイスがないため、インターフェイスを抽象基本クラスとしてのみ記述できます。C ++では、強い要件がある場合にのみ継承を使用するため(不要な仮想関数のオーバーヘッドを回避できるため)、おそらくインターフェイスを個別に定義せず、クラスヘッダーのみを定義します)。
設計パターンに反対する人々は、これらのパターンを使用するコストが利益を上回ることが多いと言います。
彼らはそれを間違っていると思います。疎結合(およびDRY)コードを記述する場合、最小限の追加労力で設計パターンをコードに統合できます。それ以外の場合は、設計パターンを実装するためにコードを適合させる必要があります。
デザインパターンを実装するために多くの変更を行う必要がある場合、問題はデザインパターンではなく、コードベースがモノリシックで密結合されていることです。これは、設計パターンの問題ではなく、不良/次善の設計問題です。
私が知りたいのは、抽象化とデザインの追加レベルを作成するために実際にどのくらいの努力を払うべきかということです。これは、アプリケーションが疎結合、インターフェイスへのプログラム機能などのオブジェクト指向の原則に従うことを許可するためだけです。それは本当に価値がありますかそれ?これにはどのくらいの努力が必要ですか?
あなたの質問は、疎結合の唯一の利点は設計パターンを簡単に実装できることであるという(述べられていない)仮定を立てます。そうではない。
疎結合の利点には、次のものがあります。
- リファクタリングと再設計の柔軟性
- 無駄な労力が少ない
- テスト容易性
- コードを再利用する可能性の増加
- シンプルなデザイン
- デバッガーで費やされる時間の短縮
...そして、今は思い浮かばない他のいくつか。