適切なデザインパターンの選択


32

デザインパターンを活用することの重要性は常に認識しています。他の開発者がどのように最も適切な開発者を選ぶかについて興味があります。決定に役立つ一連の特性(フローチャートなど)を使用していますか?

例えば:

オブジェクトは関連しているが、具象クラスを指定したくない場合は、Abstractを検討してください

インスタンス化が派生クラスに委ねられている場合は、Factoryを検討してください

集合オブジェクトの要素に順番にアクセスする必要がある場合は、Iteratorを試してください

または何か似たような?


8
重要性は何だと思いますか?programmers.stackexchange.com/questions/70877/...
PDR

重要なのは、最も適切で全体的なパターンを認識し、最終的に他の開発者にそれを伝えることができる能力だと思います。それが理にかなっている場合は?
カールセーガン14

@pdrに同意します。私は何をする必要があるかを考え、パターンの名前を覚えておくと、クラスに名前を付けるのに役立ちます。
エイミーブランケンシップ14

4
確かに。これは単純に「正しいデザインをどのように選択しますか?」に要約できます。まず、正しいデザインはなく、間違ったデザインがたくさんあります。それを超えて、それは山の経験(間違ったものを選ぶ)が付属しています。
Telastyn 14

回答:


109

今日のコーディングの世界における重要な誤解は、パターンが構成要素であるということです。あなたが取るAbstractFactoryここにFlyweight多分そことSingletonあそことXMLとプレストとともに、それらを接続するには、動作するアプリケーションを持っています。

そうではありません。

うーん、それは十分な大きさではありませんでした。

パターンは構成要素ではありません

それは良いです。

パターンは、問題があることがわかったときに使用するものです。パターンが提供する柔軟性が必要な場合、または構成ファイルで小さな言語を作成しているときにつまずいた場合は、ちょっと待って、これは私が書いている独自のインタプリタです-これは既知の解決済みの問題で、インタープリターパターンを使用してください。

しかし、そこから注意してください、それはあなたがあなたのコードで発見したものであり、あなたが始めたものではないということです。ジャワのクリエイターは、開始時に「ああ、私たちは整数でフライ級を出してあげる」と言うのではなく、することができ、パフォーマンスの問題に実現しませんでした解決フライ級に

したがって、適切なパターンを見つけるために使用する「フローチャート」はありません。パターンは、繰り返し発生する特定のタイプの問題の解決策であり、その重要な部分はパターンに蒸留されます。

パターンから始めることは、解決策を見つけて問題を探すようなものです。これは悪いことです。過剰なエンジニアリングにつながり、最終的には設計の柔軟性が失われます。

コードを書いているときに、ファクトリを書いていることに気付いたら、「ああ、これは私が書いている工場です」と言って、ファクトリパターンを知っている知識を使って、 Factoryパターンを再発見しようとせずにコードを作成します。しかし、「ここにクラスがあります。柔軟に対応できるように、そのためのファクトリを作成します」から始めるわけではありません。

Eamma Gamma(Gamma、Helm、Johnson、およびVissidesのとのインタビューからの抜粋は次のとおりです。デザインパターンの使用方法

すべてのパターンを使用しようとするのは悪いことです。なぜなら、合成デザイン、つまり誰も必要としない柔軟性を備えた投機的デザインになるからです。最近のソフトウェアは複雑すぎます。他に何をすべきかを推測する余裕はありません。本当に必要なことに集中する必要があります。だから、パターンのリファクタリングが好きです。特定の種類の問題やコードの匂いがあるとき、最近人々はそれを呼ぶようになっているので、人々はパターンツールボックスに行って解決策を見つけることができることを学ぶべきです。


「いつ、何を使用するか」の最良のヘルプは、おそらくソフトウェアデザインパターンの Wikipediaページです。「分類とリスト」セクションでは、各パターンが属するカテゴリとその機能について説明します。フローチャートはありません。そこにある説明は、おそらく、「いつ、何を使用するか」の短い断片として見つけることができる最高のものです。

プログラミングのさまざまな分野でさまざまなパターンを見つけることに注意してください。Webデザインには独自のパターンセットがあり、JEE(Webデザインではない)には別のパターンセットがあります。金融プログラミングのパターンは、スタンドアロンのアプリケーションUIデザインのパターンとはまったく異なります。

したがって、それらすべてをリストする試みは本質的に不完全です。あなたはそれを見つけ、それを使用する方法を見つけて、それが最終的に第二の性質になり、あなたはそれを再び使用する方法や時期を考える必要はありません(誰かがそれを説明するように頼むまで)。


11
「問題を探している解決策」に+1。パターンを知ることで、パターンが自然に発見されるのをスキップすることができます。他の人のコードを読んだり、他のプログラミング言語を学習したりするのと同じように、それらについて学ぶことはおそらくあなたのコーディングとデザインのスキルを向上させるのに役立つでしょう。しかし、コードに「パターンをフィットさせる」ことを積極的に試みるべきではありません。
グレックマック14

1
私は常に、開発者が最初に設計原則に慣れるためにパターンを検討し始めることを推奨します。すべてのパターンは、設計の原則の一部を示しています(「SOLID」の一連の原則はほんの一例です)。
ryscl 14

2
別の言い方をすれば、デザインパターンのポイントは、私たちが構築しているものを議論するときに共通言語である名前を付けることです。苦労して獲得した開発知識の積み重ねの略記です。
EBarr 14年

2
デザインパターンを選択するには、ここで線間のステップを読む:1.常にあなたがで作業している任意のコードを批判的に考える。2.抽象基本問題への具体的なコード3.ないという問題が知られている解決策を持っている(デザインパターン)?4.はい、そのソリューションを私の仕様にどのように適用しますか?5.一般的な解決策を抽象的な問題に適応させ、特定の問題の解決策を作成します。
クリス

@クリスは本当にそれを要約します。また、パターンを使用せずに記述し、デザインで必要な場合にコードを適切なパターンにリファクタリングすることにも問題はありません。

18

自分自身に問う:

  1. どのような問題を解決しようとしていますか?
  2. どのソフトウェア設計パターンが(もしあれば)同じ問題を最も密接に解決しますか、または問題を解決するための論理的なパスを提供しますか?
  3. パターンが提供する追加の抽象化(および複雑さ)が必要ですか、それとも特定の問題に対して過剰設計ですか?パターンなしで、より簡単で効率的な方法で問題を解決できますか?

ソフトウェアパターンを選択するプロセスは、データ構造を選択するプロセスと似ていますが、データ構造を選択する際に、問題のパフォーマンスとメモリ特性を評価し、それらの特性に最も近いデータ構造を選択する点が異なります。


もちろん、それは青写真やフローチャートではなく、経験と専門家に関するものであり、私はあなたに同意します。しかし、少なくとも工場などの最も重要で頻繁なパターンの場合は、分類された高度なチートシートのような完全なリソースが必要になります。パターンを使用した方が良いでしょう。インターネットでそのようなリソースを知っていますか?!
Pmpr

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.