web-dev-qa-db-ja.com

設計パターンに不快感がありますか?

20年間ビジネスに携わってきたシニアデベロッパーの1人と話し合いました。彼が書いているブログで彼はオンタリオ州でかなりよく知られています。

奇妙なことは彼が私に言ったことです:彼はそれが教科書から書かれたので、それが実際の世界を説明しないので、扱うのが悪夢であるコードの一部があると言いました。新しいフィールドをUI /データベース/データレイヤーに追加するには2〜3時間かかりますが、彼のコードでは30分かかります。

もう1つは、ほとんどのプログラマーがデザインパターンを理解しておらず、メンテナンスの観点からもよくないため、彼はデザインパターンを回避していることです。

次に、カナダのほとんどのWeb開発者は、データモデルを分離するよりも、データレイヤークラスから継承することを好むという考えもあります。 「モデルをデータレイヤーから分離するのは業界標準ではないですか」と彼に尋ねました。彼は時々言ったが、ここのほとんどの人々はそれがあまりにも多くの仕事であるのでそうすることを好まない。

彼がベストプラクティスを使用してコーディングを行わない理由は、それがメンテナンスの悪夢であり、従業員の何人かが(私自身を除いて)理解していないためです。また、新しい機能やフィールドを数日でプッシュする必要がある場合、作業が遅くなります。時間。

Stack Overflowが主に人々に業界標準に従うことを奨励していることを考えると、このような意見を聞くのは奇妙です。新しいフィールドや機能を数日のうちに絶えず作り出すことを余儀なくされているという問題は、十分に柔軟でしっかりしたパターンを推定することができないということですか?これは私がこれから理解することの要点のようです。

これらの発言をどう思いますか?

136
Igneous01

これらは成功を見つけた人の言葉であり、彼が理解していないパターン専門用語で何をすべきかを彼に伝えようとする人を無視します。

デザインパターンとベストプラクティスは同じものではありません。一部の人々は、彼らがそうであると考え、自分が何をしているかを知っている人々を駆り立てます。彼らがしていることの適切な名前を知らなくても。

デザインパターンは、名前が付く前から存在していました。私たちは彼らに話しやすいように名前を付けました。名前の付いたパターンは良いことではありません。 認識できるものにします。

この男は、あなたが聞いたこともないパターンを使用している可能性があります。あなたが何かがどのように行われるかについて彼と話す必要があるまで、それは結構です。彼はあなたと話す方法を学ぶ必要があるか、あなたは彼と話す方法を学ぶ必要があります。 「正しい」人とは何の関係もありません。

239
candied_orange

あなたとあなたの友人が説明している種類の多くのデザインパターンは、本当にプログラミング言語の欠陥の回避策です。より表現力豊かなプログラミング言語を使用すると、これらのデザインパターンの必要性のほとんどがなくなります。

考えられる多くの使用シナリオに対応するには、優れた設計パターンが必要であるため、過剰に設計される傾向があります。過剰に設計されたコードにはコストがかかります。コードを読んで、その機能を理解し、ソフトウェアシステム全体のコンテキスト内でコードがどのように機能するかを理解する必要があります。したがって、他のソフトウェア開発手法と同様に、手法を使用するコストに対して手法を評価し、メリットがコストを超えるかどうかを判断する必要があります。

他のすべての条件は同じですコードが少ない方が常に優れています。複数のプロジェクトを3〜6回ホップして興味深い、つまり、オーバーヘッドを追加する以外にが実際に何かを実行するコードです。

よく知られているソフトウェアパターンは、設計戦略を伝えるための共通の語彙を提供することになっています。残念ながら、多くのソフトウェア開発者は、ソフトウェアパターンのボキャブラリーを十分に理解していないため、プログラミングの問題に適切に適用できません。経験の浅い開発者は、これらのパターンを専門家の領域内にあると見なしています。彼らは専門家として見られることを望んでいるので、準備ができる前に、パターンを早すぎて学習して適用しようとしています。彼らが実際にすべきことは、最初にプログラミングの基礎を学ぶことに焦点を当て、次に各パターンが自分自身で解決する問題を解決しようとすることです。これを行うと、パターンを正しく理解して適用できるようになります。

94
Robert Harvey

Stackoverflow.SEおよびProgrammers.SEは、主にSOLIDのようなベストプラクティスに従うことを奨励し、業界標準。信じられないかもしれませんが、事実上の業界標準は、多くの場合 "泥の大きな玉" アーキテクチャです-真剣に。

しかし、あなたの質問に直接答えると、デザインパターンの問題は継承の問題と似ています-平凡な開発者の多くがそれらを使いすぎており、過度に設計された、保守が難しいコードを作成する特定のリスクがあります。しかし、これに対する答えは確かにデザインパターン(または継承)の使用を完全に回避または禁止することではありません。答えは、これらのツールを意味のある状況で使用することを学ぶことです。そして、これは「アジャイル」の動作から完全に独立しています。

86
Doc Brown
  1. デザインパターンは、アイデアを伝えるために使用される単なる名前です。私はしばしば自分が名前を持っていることに気づいたことがあります。したがって、「非設計パターンウェイ」とは対照的に「設計パターンウェイ」はありません。

  2. 設計パターンはガイドラインです。すべてとして、それらのそれぞれに長所と短所があります。重要なのは、パターンを学習してそれを適切な場所に適用することではなく、パターンの概念、長所と短所を理解し、それを使用して問題の解決策のインスピレーションを得ることです。

  3. 十分な理由がある場合は、すべてのベストプラクティスとガイドラインを無視できます。有効な理由には、開発時間とアプリケーションからの期待が含まれます。たとえば、値をハードコードするのは悪いことだと私は知っています(愚かな例)が、概念実証では、コスト(この場合は主に開発時間)を上回る利点が得られる場合があります。ただし、このような決定がなされた場合、それは逆効果になり、ある時点でリファクタリングが必要になる可能性があります。

45
Paul92

スープに別のメタファーを追加するためのデザインパターンは、Microsoft OfficeヘルパーのClippyです。 「あなたはたくさんのことに対して同じことをしているようです。イテレーターまたはビジターを提供することでそれを手伝っていただけますか?」

これらのパターンの適切な説明は、以前に何度も行われたのと同じ方法で何かを行うことが役立つ場合、最初にそれを試すときにどんな間違いをするか、そしてそれらの間違いを回避するために見つかった一般的な方法を示します。したがって、デザインパターンを読んだ(またはメモリからレビューした)後、作業に取り掛かります。できないことは、クリッピーとウィザードを使用してonlyを取得することです。

経験の浅い人が間違って現実を考慮しないコードを書くことができるのは、彼らがデザインパターンのリストをソフトウェアの問題を解決するためのすべての可能なアプローチの完全なリストであると考え、デザインをリンクしてコードをデザインしようとするときです。それが完了するまでパターン。実際に見られるもう1つの貧弱な戦術は、デザインパターンが「ベストプラクティス」であるという根拠に基づいて、デザインパターンを実際には適さない状況に追い込むことです。いいえ、それはベストプラクティスかもしれませんし、そうでないかもしれません実際に解決する問題のクラスの場合、しかし、それが解決できない問題、または導入することによってのみ解決する問題の場合、確かにベストプラクティスではありませんより単純なソリューションがある場合、不必要な複雑さ。

もちろん、YAGNIに基づいてパターンを回避し、それが必要であることを認識して、通常の解決策に模索することも可能です。これは通常(常にではありませんが)、最初から要件を実現するよりも悪いため、アジャイル開発でさえ、完全に予測可能な要件が早期に発見されない場合はイライラします。 Javaは最初に汎用コンテナを不必要に複雑であると拒否し、後でそれらをボルトで締め直した。

したがって、設計パターンを避けたいので、Iterator 原則としてを書かないのは間違いなく間違いです。

UI /データベース/データレイヤーに新しいフィールドを追加するには、2〜3時間かかります。彼のコードの場合と同様に、30分かかります。

あなたはそれについて本当に議論することはできません:このメトリックによって彼のデザインは他のものよりはるかに優れています。それがデザインパターンを回避したためかどうかは疑問ですが、彼はそれを設計するときに適切な「現実世界」の問題を考慮したため、より可能性が高いと思います。教科書と高い理念だけで武装した人。

そのため、フィールドを追加するためにコードのさまざまな箇所に触れる必要のあるパターンは、「フィールドを簡単に追加できるようにする」という悪いパターンであることを認識し、それらのパターンを使用しませんでした。レイヤードアーキテクチャは実際にその点で影響を受ける可能性があり、欠点を認識せずにデザインパターンを使用することは誤りです。

それとは対照的に、彼のデザインで新しいUIを作成するのにどのくらいの時間がかかりますか?プロジェクトで、フィールドを常に追加するのではなく、固定データモデルを介して新しいUIを常に構築および展開するように求められた場合は、代わりにそのために設計したはずです。または同様に。しかし、そのすべての利点について、「アジャイルに取り組んでいる」と言っても、悲しいことに、別のトレードオフをする必要がないということではありません。

デザインパターンのメニューから選択すると、最も重要な問題について考えるのをやめることができます。しかし、ビジターを作成していることを認識し、それを「ビジター」として文書化したり名前を付けたりして、読者がすぐに理解できるようにしても、それほど邪魔になりません。 「これは訪問者です」と書く代わりにそれを適切に文書化することは、上級開発者が与える理由のためにひどい間違いです-プログラマーはそれを理解しません。訪問者が何であるかを知っているプログラマーでさえ、「これは訪問者です」というよりも多くの情報が必要です。

30
Steve Jessop

あなたの同僚は NIH症候群 (「ここでは発明されていません」)に苦しんでいるようです。

彼のコードが新しいフィールドを追加するのを容易にすることは完全にもっともらしいです:私はまた、他の人によって書かれたコードよりも自分のコードを更新する方がはるかに速いです。しかし、この短期間の速度は、コードの保守性と移植性については何も言いません。私は彼に疑いの恩恵を与えます:既存のコードは、教科書を順守していないか、間違ったコンテキストで優れたレシピを順守している場合、実際に正しく構造化されていない可能性があります。

デザインパターンを回避することは本当に驚くべきことです。プログラマーのコーディングと管理の最後の30年間で、設計パターンは本能的に行われたことに言葉を置くのに役立ち、意図、利点、不便さ、リスク、機会、および関連パターンをより迅速に理解するのに役立ちました。設計パターンは、複雑さをマスターするための真のアクセラレーターであることが証明されました!

  • おそらく、あなたの同僚は私たちのほとんどよりもはるかにインテリジェントであり、彼は顕著な生産性の低下なしにパターンを再発明するオーバーヘッドを許すことができますか?

  • 「プログラマーがデザインパターンを理解していない」という主張は、「自分がやっていることを実際に説明することはできない」と思われます。あるいは、「自分のデザインについて議論したくない」。パターン化は全体的な理解を活かすことができると私は本当に思います、そしてそれはより年配の同僚が貴重な意見を共有することを可能にするかもしれません。しかし、おそらくあなたの先輩の同僚はそれだけを避けたがっています。

レイヤードアプローチは、ほとんどのエンタープライズアプリケーションで他のアーキテクチャよりも優れていることが証明されています。世界クラスの主要なパッケージは、このアイデアを中心に構築されており、職人のアーキテクチャよりも桁違いに優れています。 Martin Fowlerがこのアプローチを示しています 「エンタープライズアーキテクチャのパターン」に関する優れた著書。ああ!申し訳ありませんが、これは実証済みのパターンに関するものです。同僚のNIHビューではチャンスはありません;-)

20
Christophe

多くの人が見逃している重要な洞察は、ソフトウェア設計はコンテキストに依存しているということです。ビジネス目標を達成するために存在し、目標が異なれば、異なるアプローチが必要になる場合があります。言い換えれば、常に最高のデザインがあるにもかかわらず、常に最高のデザインはありません。

設計パターンは、標準的な問題に対する標準的な解決策です。ただし、問題がなければ、問題を解決するのは無駄です。

ウォーターフォールとアジャイルソフトウェア設計の主な違いはwhen設計の決定が行われることです。ウォーターフォールでは、すべての要件を収集し、必要なデザインパターンを特定してから、コーディングを開始します。アジャイルアーキテクチャでは、YAGNIの原則に従って、可能なかぎり選択について可能な限り知っている最後の責任ある瞬間まで、設計の決定を延期します。

つまり、ウォーターフォールでは、必要に応じてデザインパターンが適用される傾向があります予想アジャイルでは、必要な場合実際に必要。その結果、アジャイルプロジェクトでは、予想されるすべてのニーズが実際であるとは限らないため、デザインパターンを適用する頻度が低くなる傾向があります。

16
meriton

デザインパターンは、何をすべきかを規定しているため、実際にはデザインパターンと呼ばれていません。 以前に行われたことを説明するであるため、デザインパターンはデザインパターンです。一部の開発者(複数可)は、特定のタスクを適切に実行する方法を設計し、同様の状況に適用して同様の結果を得ることができました。それだけです。多くのパターンには固有の長所と短所があり、適切なパターンを適用するために決定する技術的およびビジネス上のニーズを評価するのは、教育を受けた開発者次第です。

その意味で、100%1回限りのコードを作成することに真剣に取り組み、ユースケースごとに概念や実装が使用できない場合を除き、ほぼ確実に少なくともいくつかの設計パターンを使用しています。 「リポジトリ」、「作業単位」、「MVC」などの派手で一般的な名前はないかもしれませんが、「デザインパターンではない」というわけではありません。

8
Jeremy Holovacs

私は通常、GPSを使用した「ナビゲーション」のように考えます。 「ベストプラクティス」と「デザインパターン」を学ぶとき-あなたはGPSナビゲーションルートを取ることを学びます。しかし、その地域を知っていると、脇道を走ると問題のある地域を通り過ぎて、より速く、またはより良くそこに行くことができることがよくわかります。これらのことに関しては、ほとんど同じです。経験により、ツールボックスを分解してショートカットを作成することができます。

デザインパターンを学び、「ベストプラクティス」を学ぶことは、背後にあるアイデアについて理解し、特定の状況で選択できることを意味します。現実の状況は理論的な状況に比べて複雑になることが多いため、教科書にはない制約や問題が発生することがよくあります。クライアント/顧客は、製品を速く、通常は安価にしたいと考えています。レガシーコードで作業する必要があります。サードパーティのツールを操作する必要がありますが、これはブラックボックスであり、効果がない可能性があります。そしてあらゆる種類のもの。あなたの状況は特定です-ベストプラクティスとパターンはより一般的です。

SEなどのサイトの多くの人々が「ベストプラクティス」の回答と「デザインパターン」の回答を提供する主な理由の1つは、一般的な抽象化されたソリューションで回答しているため、問題。そして、あなたを学ぶために。

だから-いいえ-アジャイル開発環境では設計パターンが嫌われません。ただし、開発がパターンに完全に適合するほど一般的で抽象的であることはまれであり、(経験豊富な)開発者はこれを知っています。

6
Allan S. Hansen

UI /データベース/データレイヤーに新しいフィールドを追加するには、2〜3時間かかります。彼のコードの場合と同様に、30分かかります。

デザインを「最適化」したい場合は、最適化しようとしていることを言う必要があります。

たとえば、レーシング自転車は最適化された車両であり、ボーイング747も最適化された車両ですが、さまざまな要件に合わせて最適化されています。

たとえば、「MVC」パターンのアイデアは、次のようなことを最適化します。

  • 同じモデルの異なるビュー(ビューはモデルから独立しています)
  • 各レイヤーは個別に(たとえば、異なるチームによって)開発し、統合前に個別にテスト(ユニットテスト)できます。
  • 等.

一方、彼のコードは他の何かのために最適化しているかもしれませんが、例えば:

  • 最小限のコード行
  • 一人の人がすべてのレイヤーに影響を与える変更を簡単に行うことができます(まったく異なるレイヤーがまったくないため)
  • 等.

パターンの説明は、パターンが解決しようとしている問題の説明から始まります。特定のパターンを使用しないことが「ベストプラクティス」であると彼が考える場合、(それが愚かなパターンではないと仮定し、それが時々役立つパターンであると想定した場合)、そのパターンが主張する特定の問題を経験していないと思います解決するために、および/または彼が代わりに最適化しようとしている別の(より大きなまたはより緊急の、競合する)問題を抱えています。

5
ChrisW

デザインパターンはツールです。ツールと同様に、それらを使用する2つの方法があります。正しい方法と正しくない方法です。たとえば、私があなたにドライバーと釘を与えて、あなたに2つの木片を一緒に結合するよう頼むならば、あなたはハンマーを頼みますすべき。釘にはハンマーが使用され、ねじにはドライバーが使用されます。

多くの場合、デザインパターンはOne True Wayとして宣伝されますが、これは多くの場合、特定の問題が発生した場合にのみ当てはまります。ジュニア開発者は、何か新しいものを見つけたとき、子供のようです。彼らはそのデザインパターンをすべてに適用したいと考えています。そして、パターンAが問題Bに適用され、パターンCが問題Dに適用されることを最終的に学習する限り、本質的に問題はありません。釘を打ち込むためにドライバーを使用しないのと同じように、特定のそれが存在するという理由だけでパターン。パターンは、そのジョブに最適な(既知の)ツールであるため使用します。

パターンの裏側はアンチパターンです。通常は実行時間またはメモリの点で、何度も悪いことが証明されているもの。ただし、パターンとアンチパターンはどちらも、理解できない開発者には役に立ちませんなぜそれらが存在します。開発者は、自分たちがやっていることは新しくて独創的であると考えるのが好きですが、ほとんどの場合、そうではありません。以前は考えられていたようです。彼らの前の人々は経験のためにパターンを作成しました。

もちろん、後輩の開発者は、古いことを行うための新しい方法を思い付くように見えることが多く、それらの方法の方が優れている場合もあります。しかし、それがダニング・クルーガー効果の事例となることが多すぎます。開発者は関数型プログラムを作成するのに十分な知識がありますが、独自の制限を理解していません。これを乗り越える唯一の方法は、ポジティブとネガティブの両方の経験を通してであるようです。彼らは自分たちが優れていると信じているのでパターンを無視しますが、実際には、1万人の開発者が特定のデザインを既に使用していて、それが実際に悪いためにそれを破棄したことを知りません。

アジャイルは、進化するクライアントのニーズに迅速に適応することに関して、「対応を迅速に行う」ことを支持します。それはデザインパターンを好むことも、それらを軽視することもありません。パターンが最も速く、最も信頼できる方法である場合、開発者はそれを使用する必要があります。特定のパターンが単に「実行する」よりも時間がかかる場合は、パターンではないものを使用しても問題ありません(もちろん、パフォーマンスが大幅に低下していない場合など)。既知のパターンが見つからない場合は、クライアントに「いいえ」と伝えるよりも、独自のパターンを設計することをお勧めします。クライアント、特に有料クライアントは通常は正しいです。

パターンがザ・ウェイであると主張する人、またはパターンがザ・ベイン・オブ・エグジットであると主張する人は誰でも間違っています。パターンは特定の状況に適用することを目的としたツールであり、状況に応じて成功の度合いは異なります。これは真実であり、MVCを選択したかどうか、データ転送オブジェクトを使用したかどうかなどに依存しないものです。重要なのは、ユーザーにとって適度に機能する、適度に短い時間枠でコードを実装することです。論理的なバグはほとんどありません。

通常、パターンはデザインの一貫性のある形式を許可し、100%オリジナルのアイデアを書くためにすべてのパターンを無視するよりも優れたパフォーマンスを発揮しますが、すべてのパターンを回避することはできません。たとえば、y = x + 5の場合、x + 5を書くパターンを避けるために、y = x +(5 * 3 + 15/3)/ 4を本当に書きますか?いいえ、違います。 y = x + 5と記述して、次の問題に進みます。

人々は毎日パターンを使用しており、それは大丈夫ですです。最も重要なのは、論理的に機能し、めったにクラッシュせず、ユーザーフレンドリーなコードを用意することです。それ以上に重要なことはありません。

4
phyrfox

システムの2つの部分を同じ方法で設計しないようにすることを除いて、「設計パターンを回避する」ことはできません(これはお勧めしません。上級開発者が行っているのではないかと思います)。彼がおそらく意味することは、「デザインパターンに忠実であるという理由だけで、デザインを盲目的に使用しないこと」です。あなたがやっていることを考えることは間違いなく「ベストプラクティス」であり、1つの大学すべき教えるために存在すること。悲しいことに、それは起こっていないようです。

2
Jonathan Cast

デザインパターンは、アジャイルプラクティスに反するものではありません。アジャイルの実践に反するのは、デザインパターンを使用するためにデザインパターンを使用することです。デザインパターンを使用することは、「工場パターンを使用してこの問題をどのように解決するのか」という考えに沿って新卒者と学生の間で共通の習慣です。

アジャイルとは、選択したツールに合うようにジョブを形作ることではなく、ジョブに最適なツールを選択することを意味します。
そして、それがすべての常識的な開発慣行の結果です(もちろん、選択できるツールの選択は通常、企業の標準、ライセンスの制限(GPLや他のオープンソースツールは、特に再販用のソフトウェアを構築する場合は特に使用できないことが多くあります)。

同僚や友人はおそらく、それ自体がデザインパターンを使用しているためではなく、別のデザインの方が優れていた場合に特定のパターンの使用を示すように設計された人工的な構造であるため(おそらく主観的ですが)特定のデザインパターンを強制的に使用すると、見苦しく、保守が難しくなり、コードの効率が非常に悪くなる多くの例を見てきました(間違いなく多くの人がいます)。

2
jwenting