質問
最も頻繁に引数を伺いために付着しなかった 固体 原則オブジェクト指向設計 YAGNI がarguerくさん呼んでいる):
"でもOKという両方の特徴をX、Yが同じクラスです。シンプルなのはなぜわざわざを追加する新しいクラス(つまり複雑性)."
"はい、可能ですべて私のビジネスロジックに直接GUIコードです。これにGUIでは、非常に低いと考える重要な新規要件の来ました。
"もし万が一の新規要件の私のコードがもごちゃごちゃしたいrefactorのための新しい必要です。なおしてくれるかもしれない場合は以降が必要...'の引数でない。"
何が最も説得力を引数に対しそのような慣行?どのように思 ショー これは高価な実践を中心にかなっていくの経験におけるソフトウェア開発に従事。
解決
デザインは、トレードオフの管理とバランスです。 ヤニとソリッドは矛盾していません。前者は言います いつ 機能を追加するために、後者は言います どうやって、 しかし、どちらも設計プロセスを導きます。以下の私の回答は、特定の引用のそれぞれに対するYagniとSolidの両方の原則を使用しています。
- 単一使用コンポーネントのように、再利用可能なコンポーネントを構築するのが3倍困難です。
- 再利用可能なコンポーネントは、再利用ライブラリに受け入れるのに十分に一般的になる前に、3つの異なるアプリケーションで試してみる必要があります。
- ロバートグラス」 3つのルール, ソフトウェアエンジニアリングの事実と誤り
再利用可能なコンポーネントにリファクタリングするには、複数の場所で最初に同じ目的を見つける重要な要素があり、 それから それを動かす。これに関連して、Yagniは、一般的な機能または再利用可能な機能(クラスと機能)を追加する代わりに、必要な場合にその目的を挿入することによって適用されます。
最初の設計では、Yagniが適用されないことを示す最良の方法は、具体的な要件を特定することです。言い換えると、 コードを書く前にリファクタリングを行います 重複が単に可能であるだけでなく、すでに存在することを示すこと:これは余分な努力を正当化します。
はい、すべてのビジネスロジックをGUIコードに直接配置できます。これははるかに簡単かつ迅速です。これは常に唯一のGUIであり、重要な新しい要件がこれまでに登場する可能性は非常に低いです。
本当に唯一のユーザーインターフェイスですか?バックグラウンドバッチモードが計画されていますか? Webインターフェイスはありますか?
あなたのテスト計画は何ですか、そしてあなたはGUIなしでバックエンド機能をテストしますか?通常は外部コード(プラットフォーム遺伝子GUIコントロールなど)をテストしたくないため、GUIを簡単にテストできるようになります。代わりにプロジェクトに集中します。
機能Xと機能Yの両方を同じクラスに入れても構いません。新しいクラス(つまり複雑さ)を追加するのはなぜとても簡単です。
避ける必要がある一般的な間違いを指摘できますか?数字を二乗するなど、いくつかのことが十分に単純です(x * x
vs squared(x)
)過度にシンプルな例として、しかし、誰かが犯した具体的な間違い、特にあなたのプロジェクトで、またはあなたのチームの人々によって、共通のクラスや関数が将来それをどのように回避するかを示すことができます。
新しい要件のありそうもないケースで、私のコードが乱雑になりすぎると、新しい要件をリファクタリングできます。したがって、あなたの「後で必要な場合はどうすれば...」という議論はカウントされません。
ここでの問題は、「ありそうもない」という仮定です。ありそうもないことに同意しますか?もしそうなら、あなたはこの人と同意しています。そうでない場合、デザインのアイデアはこの人のものに同意しません。その矛盾を解決することで問題が解決するか、少なくとも次にどこに行くかを示します。 :)
他のヒント
レンガの壁で議論しているように聞こえます。私はYagniの大ファンですが、同時に、私のコードが いつも アプリケーションとテストの少なくとも2つの場所で使用します。そのため、UIコードのビジネスロジックのようなものが機能しません。その状況では、UIコードを分離するビジネスロジックをテストすることはできません。
しかし、あなたが説明している回答から、その人はより良い仕事をすることに単に興味がないように聞こえます。その時点で、彼らを助ける原則はありません。彼らは可能な限り最低限したいだけです。私はそれが彼らの行動を駆り立てるのではなく、むしろ怠lazであり、あなただけが怠lazを打ち負かすつもりはないと言っているところまで行きます(脅迫的なマネージャーや仕事の喪失を除いて、ほとんど何もできません)。
私は37代表からフレーズを借りるために、「半分は無関心ではない」という点でYagniについて考えるのが好きです(https://gettingreal.37signals.com/ch05_half_not_half_assed.php)。それはあなたの範囲を制限することです。そうすれば、最も重要なことをうまくやることに集中できます。ずさんになるのは言い訳ではありません。
GUIのビジネスロジックは、私に半分を抱きしめていると感じています。あなたのシステムが些細なことでない限り、あなたのビジネスロジックとGUIが数回独立してまだ変更されていない場合、私は驚かれることでしょう。したがって、SRP( "Solidで「S」)に従い、リファクタリング - Yagniは適用されません。
Yagniと不必要な複雑さについての議論は、仮想的な将来の要件に対応するために今日追加の仕事をしている場合、完全に適用されます。それらの「後で必要な場合は...」シナリオが実現できない場合、実際に持っている変更の邪魔になる抽象化からより高いメンテナンスコストに固執しています。この場合、範囲を制限することでデザインを簡素化することについて話している - 半分の攻撃ではなく、半分を実行している。
答えはありません。むしろ、あなたもあなたの対談者も好むかもしれない答えがあります。
経験の浅いチーム、または緊密な配信目標を持つチームと堅実に行こうとすると、高価で過度に設計されたコードの束になることが保証されます...それは堅実ではなく、単に過剰に設計されていません(別名、ようこそ現実世界に)。
長期プロジェクトのためにYagniに行って、リファクタリングがある程度まで機能することを願っています(別名、実際の世界へようこそ)。 Yagniは、概念の証明とデモ参加者に優れており、市場/契約を獲得し、より堅実なものに投資できるようになります。
両方が必要です。さまざまな時点で。
これらの原則の正しい適用は、多くの場合、それほど明白ではなく、経験に大きく依存します。あなたが自分でそれをしなかった場合、それは取得するのが難しいです。すべてのプログラマーは、それを間違ったことの結果の経験を持っているべきでしたが、もちろんそれは常に「私の」プロジェクトではないはずです。
問題が何であるかを説明してください。彼らが耳を傾けず、あなたが彼らに耳を傾ける立場にないなら、彼らに間違いをさせてください。問題を解決しなければならない場合が多すぎる場合は、履歴書を磨く必要があります。
私の経験なのですが、常に判断する。ありきいての実施、時にはこだわりの手法を既存のクラスが受入れ可能なも醜います。
それができrefactorます。私たちにとって重要なポイントは実際に なリファクタリング.その現実の問題はありませんが、時々デザインに妥協がオリファクタリングの回りにある問題です。実際通りまでの硬い部分のように多くのこと。).
としては、お客様の個人ポイント:
でもOKという両方の特徴X 特徴とYが同じクラスです。で しながら簡単なぜわざわざを追加する クラス(つまり複雑性).
いると指摘しているのも一つのクラスは、 より複雑な が実際に近いものであるかどうかとの関係により親しみや困難なものに理解).多くの少人数クラスは複雑です。がんのリストがないのは残念ですが、で整理してパッケージされます微細:-).個人的には思っただけで分割クラスの二三の授業でも読みやすさ、さらに変化します。
ことを恐れてはいけませんの少人数クラスなのにバ;-).
はい、可能ですべて私のビジネスロジック 直接GUIのコードであ をより容易に、かつ迅速.このことを常に のGUIで はsignifcant新 要件来ます。
誰かができる"ということでする可能性は低いと考えるsignifcant新しい要件ものです。"真顔だと思いる人っ 本当に のニーズを実現します。きを鈍らも優しい...
場合万が一の新しい 要件私のコードが ごちゃごちゃしたいrefactorの 新しい要件を満たす。ではどのようにす 以降が必要...'の引数な カウント
ることにはメリットがなされた場合にのみ、彼らは、実際には、refactorます。いさせて頂いた上で受付させて頂き、その約束:-).
確固たる原則により、ソフトウェアは変更に適応することができます - 要件と技術的な変更(新しいコンポーネントなど)の両方で、2つの議論は不変の要件に関するものです。
- 「重要な新しい要件が登場する可能性は非常に低いです。」
- 「新しい要件のありそうもない場合」
これは本当に本当でしょうか?
開発のさまざまな費用に関しては、経験に代わるものはありません。多くの開業医にとって、私はお粗末な、維持するのが難しいことで物事をすることは彼らにとって問題をもたらすことはなかったと思います(ちょっと!雇用セキュリティ)。製品の長期的には、これらの費用が明らかになると思いますが、事前にそれらについて何かをすることは他の人の仕事です。
ここには他にも素晴らしい答えがいくつかあります。
理解しやすく、柔軟で、修正と改善が可能です それは 必要になる。確かに、Yagniは、クラスでの無関係な機能性(そのクラスのYagni!)やUIロジックにビジネスロジックをプッシュするようなクレイジーなことをする人はいないので、比較的容易に必要であることが証明されたときに戻って新しい機能を追加できると想定しています。 。
過去に狂ったように見えるものが、UI対ビジネスの境界線、または別のクラスにあるべき異なる責任の間の境界線がそれほど明確ではなく、動きさえしない場合もあります。 2時間以内に3時間の作業が絶対に必要な場合があります。人々が正しい電話をかけない場合があります。これらの理由により、この点で時折休憩が起こりますが、彼らはYagniの原則を使用する邪魔になりますが、その原因ではありません。
高品質の単位テスト、および私は統合テストではなく単体テストを意味するため、固体に準拠するコードが必要です。必ずしも100%ではありませんが、実際にはめったにそうではありませんが、2つの機能を1つのクラスに詰め込むことで、ユニットテストを難しくし、単一の責任の原則を破り、チームの初心者によるコードメンテナンスをより難しくします(理解するのがはるかに難しいので) 。
ユニットテスト(適切なコードカバレッジを仮定)を使用すると、機能1をリファクタリングすることができます。リファクタリングはせいぜい危険で、せいぜい悲惨です。
結論:KISの原則に従ってください(シンプルに保ちます)、または知的The Kiss Principle(Kis Stumper)のために。各ケースをメリットで取得しますが、グローバルな答えはありませんが、他のコーダーが将来コードを読み取り /維持する必要があるかどうか、および各シナリオの単体テストの利点を常に考慮してください。
tldr;
堅実なことは、あなたが理解していると仮定します(少なくともやや)、将来はコードの変化、WRT SRPです。私はそれが予測する能力について楽観的であると言います。一方、Yagniは、ほとんどの場合、あなたが将来の変化の方向を知らないことを想定しています。これは、予測する能力について悲観的です。
したがって、Solid/SRPは、変更の単一の理由があるようにコードのクラスを形成するように要求することになります。たとえば、小さなGUIの変更またはServiceCallの変更。
Yagniは(このシナリオで強制的に適用したい場合)、何が変更されるのかわからないため、GUIの変更によりGUI+ServiceCallの変更が発生する場合(同様にGUI+SeviceCallの変更を引き起こすバックエンドの変更) 、そのすべてのコードを単一のクラスに配置するだけです。
長い答え:
「アジャイルソフトウェア開発、原則、パターン、および実践」という本を読む
私はSolid/SRPについてそれから短い抜粋を置いています。不必要な複雑さの匂いがするでしょう。
ここには廊下があります。変化の軸は、変化が発生した場合にのみ、変化の軸です。症状がなければ、SRPまたはその他の原則を適用することは賢明ではありません。」