絶えず変化するプロジェクトで設計パターンを使用することを避けるべきですか?


32

私の友人は、すべての開発者が嫌うプロジェクトで小さな会社で働いています:彼はできるだけ早くリリースするように圧力をかけられています、彼は技術的な負債を気にしているようです、顧客は技術的な背景などを持っていません

彼は私に、このようなプロジェクトでのデザインパターンの適切性について考えさせた物語を教えてくれました。ここに物語があります。

Webサイトのさまざまな場所に製品を表示する必要がありました。たとえば、コンテンツマネージャーは製品を表示できますが、APIを介してエンドユーザーまたはパートナーも表示できます。

製品から情報が欠落している場合がありました。たとえば、製品が作成されたばかりのとき、それらの束には価格がありませんでしたが、価格はまだ指定されていませんでした。説明のないものもあります(説明は、変更履歴、ローカライズされたコンテンツなどを含む複雑なオブジェクトです)。出荷情報が不足しているものもありました。

デザインパターンに関する最近の読み物に触発され、私はこれが魔法のNull Objectパターンを使用する絶好の機会だと思いました。だから私はそれをやったが、すべてがスムーズできれいだった。product.Price.ToString("c")価格を表示するため、またはproduct.Description.Current説明を表示するために電話する必要がありました。条件付きのものは必要ありません。ある日、利害関係者はnull、JSON を使用して、APIで別の方法で表示するように要求しました。また、「Price unspecified [Change]」と表示することにより、コンテンツマネージャーにとっても異なります。そして、私は最愛のヌルオブジェクトパターンを殺さなければなりませんでした。それはもはや必要ではなかったからです。

同様に、いくつかの抽象的な工場といくつかのビルダーを削除しなければなりませんでした.3か月間、基礎となるインターフェイスが1日に2回変更されたため、美しいFacadeパターンを直接のugい呼び出しに置き換えました。関係するオブジェクトはコンテキストに応じて異なる必要があることを要件が告げたとき。

3週間以上の作業は、デザインパターンを追加してから1か月後にそれらを引き裂くことで構成され、私のコードは最終的に自分を含む誰もが維持できないほどのスパゲッティになりました。そもそもこれらのパターンを使用しない方が良いと思いませんか?

確かに、要件が絶えず変化し、製品の凝集性や一貫性を実際に意識していない人によって指示されるようなタイプのプロジェクトで自分自身で作業する必要がありました。この文脈では、あなたがどれだけ機敏であるかは問題ではなく、問題に対する洗練された解決策があり、最終的にそれを実装すると、要件が大幅に変更され、エレガントな解決策が適合しないことがわかりますもはや。

この場合の解決策は何ですか?

  • デザインパターンを使用せず、思考を停止し、コードを直接記述しますか?

    チームがコードを直接記述している間に、別のチームが入力前に2回考えて、数日後に元のデザインを破棄するリスクを冒すような体験をするのは興味深いでしょう。同じ技術的負債。そのようなデータがない場合、20人月のプロジェクトに取り組むとき、事前に考えずにコードを入力するのは適切ではない断言するだけです。

  • もう意味をなさないデザインパターンを維持し、新しく作成された状況にさらにパターンを追加しようとしますか?

    これも正しくないようです。パターンは、コードの理解を簡単にするために使用されます。パターンを入れすぎると、コードが混乱してしまいます。

  • 新しい要件を含む新しいデザインを考え始めてから、古いデザインをゆっくりと新しいデザインにリファクタリングしますか?

    理論家として、またアジャイルを好む人として、私は完全にそれに夢中です。実際には、毎週ホワイトボードに戻って以前のデザインの大部分をやり直さなければならないこと、そしてその費用を支払うだけの十分な資金も顧客も待つ時間がないことを知っているとき、これはおそらく動作しません。

だから、提案はありますか?


43
これは間違ったジレンマだと思います。友人自身の承認により、コードはスパゲッティの維持不可能なプレートになりました。それはソフトウェアパターンのせいではありません。保守性を低下させるのではなく、保守性向上させる方法で、友人がこれらのパターンを適切に使用できないことです。特定の例を思いつくことができたら、適切な答えを投稿します。
ロバートハーヴェイ14

5
また、FWIW、コストの変動に対する許容度を持たないお客様は、要件を変更するためのコストに手当が組み込まれていない限り、おそらくアジャイルを行うべきではありません。
ロバートハーヴェイ14

5
私はデザインパターンなしで、コードがはるかに早くunmaintainable状態に達しているだろうと思われる
スティーブンA. Loweの

28
この質問には意味がありません。「デザインパターンを回避する」唯一の方法は、ソフトウェアをまったく作成しないことです。「XYZパターン」のようなものは、プログラマーがコード構造と選択に関する情報とアドバイスをより便利に伝えることができるように、一般的なコーディング戦略に付けられた名前です。コード内のデザインの選択には名前を付けて「デザインパターン」と呼ぶことができますが、必ずしも広く知られているものではありません(ただし、独自のデザインを誇りに思っており、名前とブログを付ける動機が十分にある場合を除きます)それか何か)。
ジェイソンC 14

9
すなわち、あなたはあなたの足を「足」と呼ぶことを避けることができますが、あなたはまだその足を持っています。あなたがそれを「足」と呼ばないなら、誰かとそれについて話すのは難しいです。あなたは「デザインパターンを避けている」と思うかもしれませんが、うまく機能するデザインを思いついたら、戻って見てみましょう。それを呼び出すかどうか。
ジェイソンC 14

回答:


86

この質問には間違った仮定がいくつかあります。

  • デザインパターンを使用したコードは、正しく適用されますが、それらのパターンを使用しないコードよりも実装に時間がかかります。

設計パターンはそれ自体で終わりではありません。それらはあなたに役立つはずであり、その逆ではありません。設計パターンによってコードの実装が容易にならない場合、または少なくとも進化しやすい場合(つまり、要件の変化に適応しやすい場合)、パターンはその目的を失います。チームにとって「生活」が楽にならないパターンを適用しないでください。新しいNullオブジェクトパターンが、友人が使用していた時間に友人にサービスを提供していた場合、すべてが正常でした。後で削除する場合は、これも問題ありません。Nullオブジェクトパターンが(正しい)実装を遅くした場合、その使用法は間違っていました。ストーリーのこの部分から、これまで「スパゲッティコード」の原因を結論付けることはできません。

  • 技術的なバックグラウンドがなく、製品の凝集性や一貫性を気にしないため、顧客は責任を負います。

それは彼の仕事でもなければ、障害でもありません!あなたの仕事は、凝集と一貫性を気にすることです。要件が1日に2回変わる場合、ソリューションはコードの品質を犠牲にするべきではありません。どれだけ時間がかかるかを顧客に伝え、設計を「正しく」行うためにもっと時間が必要だと思う場合は、推定に十分な安全マージンを追加してください。特に、お客様にプレッシャーをかけようとしている場合は、「スコッティの原則」を使用してください。そして、非技術的な顧客と努力について議論するとき、「リファクタリング」、「ユニットテスト」、「設計パターン」または「コード文書化」などの用語を避けてください。彼はその中に価値を見ないからです。 または少なくとも顧客が理解できるもの(機能、サブ機能、動作の変更、ユーザードキュメント、エラー修正、パフォーマンスの最適化など)。

  • 急速に変化する要件に対する解決策は、コードを迅速に変更することです

正直なところ、「基礎となるインターフェースが3か月間1日に2回変更される」場合、解決策は1日に2回コードを変更することで対応すべきではありません。実際の解決策は、要件が頻繁に変更される理由と、プロセスのその部分で変更を加えることが可能かどうを尋ねることです。事前分析がさらに役立つかもしれません。コンポーネント間の境界が誤って選択されているため、インターフェイスが広すぎる可能性があります。要件のどの部分が安定しており、どの部分がまだ議論中であるか(および実際に議論中のものの実装を延期するか)に関する詳細情報を求めると役立つ場合があります。そして時々、何人かの人々は1日2回彼らの心を変えないために「彼らのロバで蹴られる」だけです。


30
+1-技術的な解決策では人の問題を解決できません。
テラスティン14

1
+1、または「少なくとも進化可能(つまり、変化する要件に適応しやすい)」- 合理的に変化する要件でこれを修飾しますか?
Fuhrmanator

1
@Fuhrmanator:これを一般的な用語で議論するのは難しいと思います。私見では、最初の要件が "ワードプロセッサが必要"であり、これが "フライトシミュレータが必要"に変更された場合に役立つデザインパターンはないことは明らかです。要件が大幅に変更されない場合、ソフトウェアを進化可能に保つのに役立つものを決定するのは必ずしも簡単ではありません。最も良いのは、あまりにも多くのパターンを適用するのではなく、いくつかの原則-主に固体の原則とYAGNIを適用することです。また、要件が頻繁に変更される場合、技術的な問題ではない可能性が高いので、Telastynに100%同意します。
Doc Brown 14

4
1 - 。「正直なところ、 『基本的なインターフェイスは、3ヶ月間、一日二回に変更』の場合は、その解決策を1日2回、コードを変更することにより、反応してはならない真の解決策を依頼することですなぜ要件がそれほど頻繁に変更し、もしプロセスのその部分で変更を加えることができます。「常に新しい方向性が与えられている場合は、すべての利害関係者と一緒に座って期待を再確認するのが最善です。プロジェクトに明確な目標を与えることで、違いを解決し、できれば全員の時間とお金を無駄にしないようにしてください。
krillgar 14

1
@Cornelius Doc Brownは、具体性なしでは難しいと言いました。ワードプロセッサからフライトシミュレータに移行する要件は合理的ではありません。設計パターンは役に立ちません。彼の例と、たとえば、ワープロの保存機能に新しいファイル形式を追加することとの間には、非常に多くの灰色の領域があります(これは非常に合理的です)。詳細がなければ、議論するのは難しいです。また、変更したくないということでもありませ。要件に基づいて早期に設計を選択した場合、そのような変更は困難です。ワードプロセッサとフライトシムは、初期の選択肢の好例です。
Fuhrmanator

43

私の謙虚な意見は、デザインパターンの使用を避けたり避けたりすべきではないということです。

デザインパターンは、名前が付けられた一般的な問題に対する単純でよく知られた信頼できるソリューションです。技術的には、考えられる他のソリューションや設計と違いはありません。

問題の根本は、「デザインパターンを適用するかしないか」という観点から友人が考えることではないかと思います。知っている"。

たぶん、このアプローチは、パターンが部分的に人工的または強制的な方法で、それらが属していない場所で使用するように導く。そして、これが混乱の原因です。


13
+1 「デザインパターンは、一般的な問題に対するよく知られた信頼できるソリューションであり、名前が付けられています。技術的な点では、考えられる他のソリューションやデザインと違いはありません。」まさに。人々は名前の付いたデザインパターンに夢中になり、これらがコードとデザインの選択についてプログラマーが互いに簡単に通信できるようにするためのさまざまな戦略に付けられた名前にすぎないことを忘れています。この態度は、必ずしも利益をもたらさない問題に対して不適切な「パターン」を強制しようとすることに関連していることが非常に多い-大きな混乱。
ジェイソンC 14

14

Null Objectパターンを使用する例では、顧客のニーズではなくプログラマのニーズを満たしているため、最終的に失敗したと思います。顧客は、コンテキストに適した形式で価格を表示する必要がありました。プログラマーは、表示コードの一部を単純化する必要がありました。

設計パターンが要件を満たしていない場合、すべての設計パターンは時間の無駄であると言いますか、それとも別の設計パターンが必要だと言いますか?


9

パターンオブジェクトを使用するよりも、パターンオブジェクトを削除する方がミスの方が多いようです。初期設計では、Nullオブジェクトが問題の解決策を提供したようです。これは最善の解決策ではなかったかもしれません。

プロジェクトで作業している唯一の人であることにより、開発プロセス全体を体験する機会が与えられます。大きな不利な点は、メンターになる人がいないことです。時間をかけてベストプラクティスまたはベストプラクティスを学習して適用すると、すぐに成果が得られる可能性があります。秘Theは、どのプラクティスをいつ学習するかを特定することです。

product.Price.toString( 'c')の形式で参照を連鎖すると、デメテル法則に違反します。私はこの慣行に関するあらゆる種類の問題を見てきましたが、その多くはヌルに関連しています。product.displayPrice( 'c')などのメソッドは、null価格を内部的に処理できます。同様に、product.Description.Currentは、product.displayDescription()、product.displayCurrentDescription()で処理できます。またはproduct.diplay( 'Current')。

マネージャーとコンテンツプロバイダーの新しい要件の処理は、コンテキストに応答することで処理する必要があります。使用できるさまざまなアプローチがあります。ファクトリメソッドは、表示されるユーザークラスに応じて異なる製品クラスを使用できます。別のアプローチは、製品クラスの表示メソッドが、ユーザーごとに異なるデータを作成することです。

良いニュースは、あなたの友人が物事が手に負えなくなっていることに気づいていることです。うまくいけば、彼はリビジョン管理のコードを持っています。これにより、彼は悪い決定を取り消すことができ、常にそれを行います。学習の一部はさまざまなアプローチを試すことで、そのうちのいくつかは失敗します。彼が今後数ヶ月を処理できる場合、彼は彼の人生を簡素化し、スパゲッティをきれいにするアプローチを見つけるかもしれません。彼は毎週1つの問題の修正に取り組むことができました。


2
また、デメテルの法則を「しなければならない」ことを見て、表面で使用されているモデルが不適切であったことを示すこともできます。「表示モデル」(大まかに言うと)に表示する説明がないだけなのはなぜですか?(つまり、UIレベルで現在の説明以上のものがあるのはなぜですか?)ビジネスレイヤーは、マネージャーであるかどうかに応じて、異なるコンテンツを持つUIレイヤーに適切に入力されたオブジェクトを準備できます。
コーネリアス14

7

質問は多くの点で間違っているようです。しかし、露骨なものは次のとおりです。

  • 言及したヌルオブジェクトパターンの場合、要件が変更された後、コードを少し変更します。それは問題ありませんが、Null Object Patternを「殺す」という意味ではありません(言い回しに注意してください。これは極端に聞こえます。

多くの人が正しく言っているように、設計パターンは一般的な慣行のラベル付けと命名に関するものです。シャツについて考えると、シャツには襟があります。何らかの理由で襟または襟の一部を取り外します。名前とラベルは変わりますが、本質的にはシャツです。これはまさにこの場合です。細部の小さな変更は、そのパターンを「殺した」という意味ではありません。(ここでも極端な言葉遣いに注意してください)

  • 要件の変更が些細なことになると、場所全体で大規模な戦略的設計変更を行うため、あなたが話した設計は悪いです。高度なビジネス上の問題が変化しない限り、大規模な設計変更を行うことを正当化することはできません。

私の経験では、小さな要件が発生した場合、コードベースのごく一部を変更するだけで済みます。少しハッキーかもしれませんが、保守性や読みやすさに実質的に影響を与えるほど深刻なものはなく、多くの場合、ハッキー部分を説明するための数行のコメントで十分です。これも非常に一般的な方法です。


7

しばらく立ち止まって、ここで根本的な問題を見てみましょう- アーキテクチャモデルがシステムの低レベル機能と結合しすぎて、開発プロセスでアーキテクチャが頻繁に破損するシステムの設計。

アーキテクチャとそれに関連するデザインパターンの使用は適切なレベルに置く必要があり、適切なレベルの分析は簡単ではないことを覚えておく必要があると思います。一方では、「MVC」などの非常に基本的な制約のみでシステムのアーキテクチャを高レベルに簡単に維持できます。これにより、明確なガイドラインやコードレバレッジのように機会を逃す可能性があります。そのすべての空きスペースで繁栄します。

一方、制約を詳細レベルに設定する場合など、システムを過度にアーキテクトすることもできます。実際には、予想よりも揮発性が高く、絶えず制約を破り、あなたが絶望し始めるまで、あなたは絶えず改造して再建することを強制します。

システムの要件の変更は、程度の差はあれ、常にそこにあります。そして、アーキテクチャとデザインパターンを使用することの潜在的な利点は常に存在するため、デザインパターンを使用するかどうかの問題は実際にはありませんが、それらをどのレベルで使用する必要があります。

これには、提案されたシステムの現在の要件を理解するだけでなく、システムの安定したコアプロパティとみなせるシステムの側面、および開発中に変更される可能性のあるプロパティを識別する必要があります。

組織化されていないスパゲッティコードと絶えず戦わなければならないことがわかった場合、おそらく十分なアーキテクチャを実行していないか、高度なレベルにあります。アーキテクチャが頻繁に壊れていることがわかった場合は、おそらくあまりにも詳細なアーキテクチャを実行していることになります。

アーキテクチャとデザインパターンの使用は、机をペイントする場合のように、システムを単に「コーティング」できるものではありません。それらは、あなたが依存する必要がある制約が安定する可能性が高いレベルで、思慮深く適用されるべきテクニックであり、これらのテクニックは実際にアーキテクチャをモデリングし、実際の制約/アーキテクチャ/パターンを実装するのに苦労する価値がありますコードとして。

あまりにも詳細なアーキテクチャの問題に関連して、多くの価値を与えていないアーキテクチャに多くの労力をかけることもできます。参照用のリスク駆動型アーキテクチャを参照してください、私はこの本が好きです- ちょうど十分なソフトウェアアーキテクチャ、多分あなたもそうでしょう。

編集

私は自分が「アーキテクチャが多すぎる」と表現することが多いことに気付いたため、答えを明確にしました。あまりにも詳細なアーキテクチャは、「多すぎる」アーキテクチャと見なされることがよくありますが、アーキテクチャを適切なレベルに保ち、人類がこれまでに見た中で最も美しいシステムを作成したとしても、優先度が高い場合、これは依然としてアーキテクチャに多大な労力を費やす可能性があります機能と市場投入までの時間。


+1これらは、システムを調べる必要があると思う非常に高いレベルについて非常によく考えられていますが、あなたが言ったように、ソフトウェア設計の多くの経験が必要です。
サミュエル14

4

あなたの友人は彼の逸話に基づいて多くの逆風に直面しているようです。それは残念であり、働くのは非常に難しい環境です。困難にもかかわらず、彼はパターンを使用して生活を楽にする正しい道を歩んでおり、その道を去ったのは残念です。スパゲッティコードは究極の結果です。

技術面と対人面の2つの異なる問題領域があるため、それぞれ個別に対処します。

対人関係

友人が抱えている苦労は、急速に変化する要件と、それが保守可能なコードを書く能力にどのように影響しているかです。最初に、要件を1日に2回、このような長期間にわたって毎日変更することはより大きな問題であり、非現実的な暗黙の期待があると言います。要件は、コードが変更できるより速く変更されています。コードやプログラマが追いつくことを期待することはできません。この急速な変化のペースは、より高いレベルでの望ましい製品の不完全な概念の徴候です。これは問題です。彼らが本当に欲しいものがわからない場合、彼らはそれを手に入れるために多くの時間とお金を無駄にします。

変更の境界を設定することをお勧めします。変更を2週間ごとにまとめてグループ化し、実装中に2週間凍結します。次の2週間の新しいリストを作成します。私は、これらの変更の一部が重複または矛盾していると感じています(たとえば、2つのオプションの間で行ったり来たりする)。変更が迅速かつ激怒すると、それらはすべて最優先されます。それらをリストに蓄積しておけば、作業と生産性を最大化するために最も重要なものを整理して優先順位を付けるためにそれらと協力できます。彼らは彼らの変化のいくつかがばかげているか、それほど重要ではないことに気付くかもしれません。

ただし、これらの問題が原因で適切なコードを記述することを妨げることはありません。悪いコードはより悪い問題につながります。あるソリューションから別のソリューションにリファクタリングするには時間がかかる場合がありますが、それが可能であるというまさにその事実は、パターンと原則を通じて優れたコーディングプラクティスの利点を示しています。

頻繁に変化する環境では、ある時点で技術的負債が発生します。タオルを投げて、大きすぎて克服できないまで待つよりも、それに向かって支払いをする方がはるかに良いです。パターンが役に立たなくなった場合は、リファクタリングしますが、カウボーイのコーディング方法に戻らないでください。

テクニカル

あなたの友人は、基本的なデザインパターンをよく理解しているようです。ヌルオブジェクトは、彼が直面していた問題への良いアプローチです。実際には、それはまだ良いアプローチです。彼が挑戦しているように見えるのは、パターンの背後にある原則、それが何であるのを理解することです。そうでなければ、彼は彼のアプローチを放棄したとは思わない。

(以下は、元の質問では求められなかったが、説明のためにパターンをどのように順守できるかを示す一連の技術的ソリューションです。)

nullオブジェクトの背後にある原理は、変化するものカプセル化するという考え方です。変更箇所を隠すため、他の場所で対処する必要はありません。ここでは、nullオブジェクトがproduct.Priceインスタンスの分散をカプセル化していました(これをPriceオブジェクトと呼びます。nullオブジェクトの価格はになりますNullPrice)。Priceドメインオブジェクト、ビジネスコンセプトです。ビジネスロジックでは、価格がまだわからない場合があります。これが起こります。nullオブジェクトの完璧なユースケース。PriceにはToString、価格を出力するメソッドがあります。不明な場合は空の文字列を出力しNullPrice#ToStringます(または空の文字列を返します)。これは合理的な動作です。その後、要件が変わります。

nullAPIビューに出力するか、マネージャーのビューに異なる文字列を出力する必要があります。これはビジネスロジックにどのように影響しますか?そうではありません。上記のステートメントでは、「ビュー」という単語を2回使用しました。この言葉はおそらく明確に話されていなかったでしょうが、私たちは要件に隠された言葉を聞くために自分自身を訓練しなければなりません。では、なぜ「表示」がそれほど重要なのでしょうか?それは、変化が本当に起こるべき場所を教えてくれるからです。

余談:MVCフレームワークを使用しているかどうかはここでは無関係です。MVCには「表示」という非常に具体的な意味がありますが、プレゼンテーションコードのより一般的な(そしておそらくより適切な)意味でMVCを使用しています。

したがって、ビューでこれを修正する必要があります。どうすればそれができますか?これを行う最も簡単な方法は、ifステートメントです。nullオブジェクトがすべてのifを取り除くことを意図していたことは知っていますが、実用的でなければなりません。文字列をチェックして空かどうかを確認し、切り替えます:

if(product.Price.ToString("c").Length == 0) { // one way of many
    writer.write("Price unspecified [Change]");
} else {
    writer.write(product.Price.ToString("c"));
}

これはカプセル化にどのように影響しますか?ここで最も重要な部分は、ビューロジックがビューにカプセル化されることです。このようにして、ビューロジックの変更からビジネスロジック/ドメインオブジェクトを完全に隔離できます。ugいですが、動作します。ただし、これが唯一のオプションではありません。

価格が設定されていない場合にデフォルトの文字列を出力したいという点で、ビジネスロジックが少し変更されたと言えます。Price#ToStringメソッドに微調整を加えることができます(実際にはオーバーロードされたメソッドを作成します)。デフォルトの戻り値を受け入れ、価格が設定されていない場合はそれを返すことができます。

class Price {
    ...
    // A new ToString method
    public string ToString(string c, string default) {
        return ToString(c);
    }
    ...
}

class NullPrice {
    ...
    // A new ToString method
    public string ToString(string c, string default) {
        return default;
    }
    ...
}

そして今、私たちのビューコードは次のようになります:

writer.write(product.Price.ToString("c", "Price unspecified [Change]"));

条件はなくなりました。ただし、これをやりすぎると、ドメインオブジェクトに特殊なケースメソッドが増殖する可能性があるため、このインスタンスが少数しかない場合にのみ意味があります。

代わりに、ブール値を返すIsSetメソッドを作成できPriceます。

class Price {
    ...
    public bool IsSet() {
        return return true;
    }
    ...
}

class NullPrice {
    ...
    public bool IsSet() {
        return false;
    }
    ...
}

ロジックを表示:

if(product.Price.IsSet()) {
    writer.write(product.Price.ToString("c"));
} else {
    writer.write("Price unspecified [Change]");
}

ビューに条件の戻り値が表示されますが、価格が設定されているかどうかを伝えるビジネスロジックの場合はより強力です。Price#IsSet現在、他の場所で使用できるようになっています。

最後に、ビューのヘルパーで価格を完全に表示するというアイデアをカプセル化できます。これにより、条件を非表示にし、ドメインオブジェクトを必要なだけ保持します。

class PriceStringHelper {
    public PriceStringHelper() {}

    public string PriceToString(Price price, string default) {
        if(price.IsSet()) { // or use string length to not change the Price class at all
           return price.ToString("c");
        } else {
            return default;
        }
    }
}

ロジックを表示:

writer.write(new PriceStringHelper().PriceToString(product.Price, "Price unspecified [Change]"));

そこの変化を(我々は一般化可能性にするより多くの方法があるPriceStringHelperパターンの両方の文字列が空の場合はデフォルトを返すオブジェクトに)が、これらは(大部分は)保存いくつかの簡単なものです、原則として、そのような変更を行う実用的な側面も同様です。


3

設計パターンの複雑さは、それが解決するはずだった問題が突然消えた場合に噛みつく可能性があります。悲しいことに、デザインパターンの熱意と人気のために、このリスクが明示されることはほとんどありません。友人の逸話は、パターンが報われないことを示すのに大いに役立ちます。ジェフ・アトウッドには、このトピックに関するいくつかの選択可能な言葉があります。

要件の変動ポイント(リスク)を文書化する

より複雑なデザインパターンの多く(Nullオブジェクトはそれほど多くない)には、「予測される変動または不安定性のポイントを特定し、それらの周りに安定したインターフェイスを作成する責任を割り当てる」という保護されたバリエーションの概念が含まれています。アダプタ、ビジター、ファサード、レイヤー、オブザーバー、ストラテジー、デコレーターなどはすべて、この原則を活用しています。予想される変動性の次元でソフトウェアを拡張する必要がある場合に「支払い」ます。「安定した」仮定は安定したままです。

要件が非常に不安定で、「予測されるバリエーション」が常に間違っている場合、適用するパターンによって、苦痛が生じるか、せいぜい不要な複雑さになります。

クレイグラーマンは、保護されたバリエーションを適用する2つの機会について語っています。

  • バリエーションポイント -既存の現在のシステムまたは要件(サポートする必要がある複数のインターフェイスなど)
  • 進化点 -既存の要件に存在しない投機的な変動点。

どちらも開発者によって文書化されることになっていますが、おそらく、バリエーションポイントに対する顧客のコミットメントが必要です。

リスクを管理するために、PVを適用する設計パターンはすべて、顧客によって承認された要件の変動ポイントにトレースされる必要があると言えます。顧客が要件のバリエーションポイントを変更した場合、デザインを根本的に変更する必要があります(そのバリエーションをサポートするためにデザイン[パターン]に投資した可能性が高いため)。凝集、結合などを説明する必要はありません。

たとえば、顧客はソフトウェアを3つの異なるレガシーインベントリシステムと連携させたいと考えています。それはあなたがデザインするバリエーションポイントです。顧客がその要件を落とすと、当然、無駄な設計インフラストラクチャがたくさんあります。顧客は、バリエーションポイントに費用がかかることを知る必要があります。

CONSTANTS ソースコードでは、PVの単純な形式です

あなたの質問へのもう一つの類推CONSTANTSは、ソースコードでの使用が良いアイデアであるかどうかを尋ねることです。この例を参照して、顧客がパスワードの必要性をなくしたとしましょう。したがって、MAX_PASSWORD_SIZEコード全体に一定の広がりがあると、役に立たなくなり、メンテナンスや読みやすさの障害にさえなります。の使用をCONSTANTS理由として非難しますか?


2

少なくとも部分的にはあなたの状況の性質に依存すると思います。

絶えず変化する要件に言及しました。顧客が「このハチを維持するアプリケーションをスズメバチでも動作させたい」と言った場合、それは注意深い設計がそれを妨げるのではなく、進歩を助けるような状況のように思われます(特に、将来的に彼女はミバエも飼ってください。)

一方、変更の性質が「このミツバチ飼育アプリケーションでコインランドリーコングロマリットの給与を管理したい」のようなものであれば、大量のコードで穴を掘ることはありません。

設計パターンには本質的に良いことは何もありません。これらは他のツールと同様のツールです。中期から長期の作業でジョブを簡単にするためにのみ使用します。別のツール(コミュニケーション研究など)がより便利な場合は、それを使用します。

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