設計パターンは一般に良いか悪いかの力ですか?[閉まっている]


33

パンをスライスして以来、デザインパターンが最高のものであると主張したと聞いています。また、デザインパターンは「セカンドシステムシンドローム」を悪化させる傾向があり、非常に使い古されており、ユーザーに実際よりも優れたデザイナーだと思わせると主張していると聞きました。

私は以前のキャンプに近づく傾向がありますが、最近では、ほぼすべての相互作用がオブザーバー関係に置き換えられ、すべてがシングルトンであるデザインを見てきました。

それでは、利点と問題を考慮して、設計パターンは一般に良いか悪いか、そしてその理由は何ですか?

回答:


53

設計パターンは言語であり、プログラムや契約書を書くためのアドバイスではありません。それらの主な用途は、コンポーネントまたはシステムがどのように実装された(または実装される予定であるか)事後説明です。細部にこだわる代わりに、リスナーがそれがどのように機能し、何が重要であるかを理解するのに十分な実装を説明できるいくつかの言葉を言うことができます。

Alex:ねえ、構成ファイルはどのように作成されますか?

Bob:それらはにあるファクトリによって生成されますconfig.h

これでアレックスは、構成ファイルの作成に重要な準備が必要であることを知っています。そうしないと、作成が工場に囲まれないからです。

ただし、Bobがパターン指向の偽物であり、あちこちでパターンを使用している場合、Bobは工場をどこでも使用しているため、構成の作成について何も伝えることができませんでした。これは、プログラムの過度の複雑さにもつながります。

したがって、最初にプログラムを作成してから、コード内のパターンを見つけてください。それが効果的な使い方です。


11
とにかく+1ですが、特に「その後スポットパターン」の場合-そもそも正確にパターンを取得する方法ですが、繰り返し発生する問題を探します
フランクシェラー

16
理由からデザインパターンと呼ばれます。コーディング中にパターンを見つけることには何の問題もありませんが、コーディングを開始する前に適切なパターンを識別することには何の問題もありません。問題はハンマーのように振る舞い、すべてが釘であると考えることにあります。
ジョージマリアン

11
重要なことは、「このコードにどのデザインパターンを使用すべきか」と言うのではなく、コードがどのように機能するかパターン見つけることです。特に、コーディング方法が異なる1つの言語を対象としたDPを誤って使用する場合。
ピーターボートン

いい答えだ。私の採用の定義:どの手法も、ビルドチェーンで実行可能かつコンパイル可能なアーティファクトとして識別された後にのみ採用されると見なされます。ビルドチェーンでの1つの実際の指導に値する量の本、ブログ、ハードブレスをすることはありません。

14

デザインパターンは素晴らしいです。適切に使用すると、コードのメンテナンス性が向上し、読みやすくなり、作業しやすくなります。優れたプログラマーになるには、停止するタイミングを知って、それ以上のリファクタリングがメリットを上回ることを確認する必要があります。設計パターンを単独で使用しても、誰かが優れたプログラマーになるわけではありませんが、いつ、どこでそれらを使用するかを知っています。この世界の他のものと同じように、デザインパターンは極端になり、悪用される可能性があります。すべてのデザインパターンに目的があり、ジグソーパズルのピースのように完全に所定の位置に収まるコードの完璧なバランスを、私はまだ探しています(そして、長い間そうするでしょう)。


10

設計パターンは、正しく使用すれば素晴らしいです。

設計パターンのアイデアはアーキテクチャに由来することを覚えておくと便利です。アーキテクチャは大きく異なります。しかし、どの建物にも多くのコアアイデアがあります。このように、パターンはデザインの構成要素と考えてください。すべての建物にすべての可能なアーキテクチャパターンが含まれているわけではないことに注意することが重要です。

あなたが家を設計しているとしましょう。正面玄関を通りに開けるのではなく、家に入る前に保護された場所、すなわち控え室が必要です。この領域は特定のパターンに適合します。つまり、2つの入り口、いくつかの壁、そしておそらく屋根があります。このパターンは、ドア、窓、または壁の数を指定しないことに注意してください。ほとんどの実装では、2つのドア、4つの壁、そしておそらく窓があります。ただし、このパターンは、2つの入り口がある囲まれた領域を示しています。1つは家の外から控え室自体につながり、もう1つは家の残りの部分につながります。ここで重要なのは、控え室が必要な場合は、エリアを囲み、そのエリアへの2つの入り口を提供する必要があるということです。

プログラミングにおける設計パターンの典型的な問題は使いすぎであり、問​​題を解決するための特効薬であるという信念です。ではない。それらは、有用なプログラミングのアイデアを伝え、考える方法です。特定の言語の構文の一部がレンガとモルタルである場合、パターンは特定のニーズを満たすためにそれらを配置する便利な方法を説明します。


特に、システムを設計する際に使用するのが最適であることに注意してください。残念なことに、これらのパターンの使用場所と使用方法に関する知識は、主に、実装中にのみ発見された以前のシステムのリファクタリングの経験に基づいています。したがって、私のバージョンはマイナーな拡張です。まず考えてから、コードを書きます。次に、結果を分析し、必要に応じてリファクタリングします。次回は、コーディングする前に、より多くのパターンが明らかになります:
ロランドケッデス

7

設計パターンは、絶対に従わなければならない不変の契約というよりも、「アドバイス」に近いと考えています。どうして?あなたが言及した理由のために。すべてのデザインパターンに従うことは、最初からパターンを使用する目的に反する大きな混乱を招きます。

これが、Java Practicesのようなサイトが嫌いな理由です。確かにいくつかのアイデアは良いものですが、著者は彼が言及したすべての単一のデザインパターンに従ってプログラム全体(およびフレームワーク)を書くことにしました。著者はまた、実際のJavaの実践は恐ろしく、ペストのように避けるべきだと読者に思わせる大きな怖い引用ですべての記事を書きました。

TL; DR:デザインパターンを使用します。悪用しないでください


私は一般に、デザインパターンについて懐疑的で冷笑的なところにいた。私はプロの仕事でそれらを直接使いたいと思ったことがありません。これはおそらく、Javaまたは「ハードコア」OO C ++を使用していないためです。興味深いことに。リチャードガブリエルは、デザインパターンの創始者(建築アーキテクチャのアレクサンダー)が実際にデザインパターンを建物に適用するのにいくつかの厄介な失敗があり、アレクサンダーがデザインパターンで探していた建物の品質を実際に達成することはなかったと報告しています。
ポールネイサン

2

SOでこのスレッドも参照してください。別のPOV設計パターンには、使用される方法論の欠点を補う定型コードがあります。私はこれらの回避策をあまりにも祝うのが好きではありません。


さらに、これらのパターンをあまり必要としない言語を使用する代わりに(Common LispとSmalltalkが思い浮かびます)、人々はその定型文を必要とする言語を使用し続けます。
フランクシェラー

私の考えは正確に。
missingfaktor

1
設計パターンを定型的なものと考えるべきでありませ。定型文は、「ほ​​とんどまたはまったく変更せずに多くの場所に含める必要があるコードのセクション」として定義されます。一方、デザインパターンは単なるコードの塊ではありません。それらは、特定のタイプの設計問題を解決するためのコードの構造化方法に関する広範な原則です。特定の実装はありません。設計パターンの実装は、プロジェクトのニーズに応じて常に変更する必要があります。
Kramii回復モニカ

@Kramii:たとえば、命令型プログラミング言語の「関数オブジェクト」/「ファンクター」は、関数がファーストクラスである関数型言語と比較して定型コードです。そこで何もコーディングする必要はありません。言語でサポートされています。逆に、Haskellで「IO Monad」と呼ばれる「設計パターン」を使用して、命令型言語で無料で取得できる順次の命令型I / Oを取得する必要があります。リンクしたスレッドをフォローすることをお勧めします。
レニープログラマー

1
@ Lenny222:リンクを読んで、パターンが言語の欠点を克服するというあなたの主張に同意します。ただし、「定型句」という用語の使用には同意しません。ボイラープレートは、通常、同じコードの繰り返し実装を指します-多くの場合、コピーアンドペーストコードまたは少なくともテンプレート化されたコードフラグメントと同等です。設計パターンの実装は、要件に応じてさまざまな方法で実装する必要があります。
Kramii復活モニカ

0

私は真ん中のものを好むでしょう。正しく指摘されたポスターのように、パターンを理解しても良い開発者にはなりません。一方、パターンを理解することは、優れた開発者になるのに役立ちます。

パターンの関係を理解し​​、プロジェクトのパターンを(構想段階で)見ることが、優れた開発者となるでしょう。


0

設計パターンは、プログラミングの問題に対する既成のソリューションを提供するとよく言われます。それらはどのような問題ですか?「どうすればオブジェクトの動作を変更できますが、システムの他の部分から変更を分離できますか?」

GoFパターンは、システムの他の部分からの分離(カプセル化)を提供することで認識されていますが、システムのどの部分に設計パターンを使用して変動性が与えられているかを知ることはしばしば困難です。彼らが提案した分類スキーム(創造的、行動的、構造的)に従う代わりに、パターンの違いを図表化し、パターンを分類するためにライフサイクルとコンポーネントカプセル化階層の2つのスキームを考え出しました。

設計パターンのカプセル化階層

カプセル化階層のこの表からわかるように、設計パターンはコンポーネントのすべてのレベルに適用できます。しかし、それは理にかなっていますか?コンポーネントは、提案されたカプセル化レベルで動作の変化を提供する必要があり、そのレベルに適切なパターンが使用されていますか?これらの質問が適切に回答されない場合、デザインパターンが誤って適用される可能性が高くなります。車のキャビンに垂直ピボットを組み込むことができたからといって、それを賢明なアイデアとはしません。


0

お金との類似性を使用すると、設計パターンは、資本コストは高くても運用コストは低いソリューションと考える必要があります。設計パターンは、余分なコーディング、冗長性、およびそれらが作成する余分な間接性からの概念的な重みという点で、前払いで費用がかかります。また、デザインの他の側面をロックダウンする傾向があります。たとえば、テンプレートメソッドを使用すると、強制的にオブジェクト指向スタイルでプログラミングする必要があります。

ただし、いくつかの小さな方法で変化する多くの密接に関連する問題を解決する必要がある場合、または将来特定の方法でコードの一部を大幅に変更する必要がある場合は、設計のために初期費用が価値がある可能性がありますパターンはコードに柔軟性を追加します。密接に関連する一連の問題の2番目の修正または解決策は、パターンを使用するよりも使用しないよりもはるかに簡単になります。


0

どちらの陣営も正しい-正しく使用すれば善の勢力であり、あちこちに散らばれば悪の勢力である。


0

設計パターンには、あなたを引き込むコツがありますが、一般的なコーディングにも同じことが言えます。究極のツールボックスを書くことで簡単に誘惑されます-コースから引き出されるのを止め、アプリケーションに必要な構造の感覚をつかむために、YAGNIを念頭に置いておく必要があります。IMOこれは、個人とその経験/判断の印にかかっています。


0

デザインのダッターは、コードに常に適用しようとしているものではないと思います。私にとっては、主に開発者向けの共通言語についてです。全体を何度も説明するよりも、「ビルダーパターンに従う」と言う方が簡単です。

私は現在、エンタープライズアプリケーションアーキテクチャのパターンを読み直しています。なぜなら、その本のパターンの1つに従う多くのコードに出くわしたからです。パターンの1つに従うように意図的に選択されたとは思いませんが、「トランザクションスクリプト」と言うことができ、誰もがその意味を明確に理解していると間違いなく役立ちます。

しかし、新しい機能やまったく新しいアプリケーションを設計するときに、用意されているパターンのカタログから選択できるというアイデアが気に入っています。特定の問題に対する実証済みのソリューションがある場合、なぜすべてを再発明するのですか?

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