設計とは、トレードオフの管理とバランスです。 YAGNI と SOLID は矛盾していません。前者はいつ機能を追加するかを示し、後者はどのように機能を追加するかを示しますが、どちらも設計プロセスを導きます。以下の、あなたの特定の引用のそれぞれに対する私の回答は、YAGNI と SOLID の両方の原則を使用しています。
- 再利用可能なコンポーネントを構築することは、使い捨てのコンポーネントを構築することよりも 3 倍困難です。
- 再利用可能なコンポーネントは、再利用ライブラリに受け入れられるほど一般的になる前に、3 つの異なるアプリケーションで試してみる必要があります。
— Robert Glass の3 つのルール、Facts and Fallacies of Software Engineering
再利用可能なコンポーネントへのリファクタリングには、最初に複数の場所で同じ目的を見つけてから移動するという重要な要素があります。このコンテキストでは、YAGNI は、汎用または再利用可能な機能 (クラスと関数) を追加する代わりに、重複の可能性を心配することなく、必要に応じてその目的をインライン化することによって適用されます。
初期設計において、YAGNI が適用されない場合を示す最善の方法は、具体的な要件を特定することです。言い換えれば、コードを書く前にリファクタリングを行い、複製が単に可能であるだけでなく、すでに存在していることを示します。これにより、余分な労力が正当化されます。
はい、すべてのビジネス ロジックを直接 GUI コードに入れることができます。はるかに簡単かつ迅速です。これは常に唯一の GUI であり、重要な新しい要件が発生する可能性はほとんどありません。
それは本当に唯一のユーザー インターフェイスですか? バックグラウンド バッチ モードの予定はありますか? ウェブインターフェースはありますか?
テスト計画はどのようなものですか? GUI を使用せずにバックエンド機能をテストしますか? 通常、外部コード (プラットフォーム ジェネリック GUI コントロールなど) をテストするのではなく、代わりにプロジェクトに集中したいので、GUI を簡単にテストするにはどうすればよいでしょうか。
機能 X と機能 Y の両方を同じクラスに入れても問題ありません。なぜわざわざ新しいクラスを追加するのか (つまり、複雑さ) は非常に単純です。
避けるべきよくある間違いを指摘できますか? 極端に単純な例の数の 2 乗 ( x * x
vs squared(x)
) など、単純なものもありますが、特にプロジェクトやチームのメンバーが犯した具体的な間違いを指摘できれば、クラスまたは関数は、将来それを回避します。
万が一、新しい要件が発生してコードが乱雑になった場合でも、新しい要件に合わせてリファクタリングできます。したがって、「後で必要になったらどうするか」という議論はカウントされません。
ここで問題になるのは、「可能性が低い」という仮定です。可能性が低いことに同意しますか?もしそうなら、あなたはその人と同意見です。そうでない場合、あなたのデザインのアイデアはこの人のものと一致しません。その不一致を解決することで問題が解決するか、少なくとも次に進むべき場所が示されます。:)