TL; DR:解決しようとしているものによって異なります。
私はこれについてGrampsと同様の会話をしましたが、C#のFuncとActionがいかに素晴らしいかについて話していました。My Grampsは非常に古いタイマープログラマーであり、ソフトウェアが部屋全体を占有するコンピューターで実行されて以来、ソースコードを使用しています。
彼は人生で何度か技術を変えました。彼はC、COBOL、Pascal、BASIC、Fortran、Smalltalk、Javaでコードを書き、最終的に趣味としてC#を始めました。IBMのSideKickの青いエディターでコードの最初の行を削りながら、彼と一緒にプログラミングする方法を学びました。20歳になるまでに、外で遊ぶよりもコーディングに多くの時間を費やしていました。
それらは私の記憶のほんの一部ですので、それらを語っているときに正確に実用的でない場合は、すみません。私はそれらの瞬間がいくらか好きです。
それは彼が私に言ったことです:
「問題を一般化するのか、それとも特定の範囲で解決するのか、尋ねますか?それは...質問です。」
グランプスは、一時的にメガネの位置を顔に固定しながら、少し考えて考えました。彼はコンピューターでマッチ3ゲームをプレイし、古いサウンドシステムでDeep PurpleのLPを聴いていました。
「まあ、それはあなたが解決しようとしている問題に依存するだろう」と彼は私に言った。「すべての設計選択に対する単一の神聖なソリューションが存在すると信じがちですが、それはありません。ソフトウェアアーキテクチャはチーズのようなものです。」
「...チーズ、おじいちゃん?」
「お気に入りについて何を考えても構いません。常に臭いがあると思う人がいます」。
しばらく混乱してまばたきしましたが、何か言う前にGrampsが続きました。
「車を作るとき、部品の材料をどのように選ぶのですか?」
「私は...コストと、部品が何をすべきかによると思います。」
「部品が解決しようとしている問題に依存します。スチール製のタイヤや、革製のフロントガラスを製造することはありません。手元にある問題を最もよく解決する材料を選択します。一般的な解決策?それとも特定の解決策?どのような問題に、どのようなユースケースに?一回だけ使用されるコードに最大限の柔軟性を与えるために、完全に機能的なアプローチを採用すべきか?非常に専門的で脆弱なコードを書くべきか?システムの多くの用途と多くの変更、そしておそらく多くの変更を見ることができますか?それらのようなデザインの選択は、車の部品に選ぶ材料や、小さな家を建てるために選ぶレゴのレンガのようなものですどんなレゴブロックが最高のものですか?」
高齢のプログラマーは、続行する前に自分のテーブルにある小さなレゴの列車モデルに手を伸ばしました。
「あなたはそのレンガが必要なものを知っている場合にのみ答えることができます。特定の解決策が一般的な解決策よりも優れているかどうか、どのような問題かわからない場合はどうでしょうか解決しようとしていますか?理解できない選択を過去に見ることはできません。」
「.. マトリックスを引用しただけですか?」
"何?"
「何もしないで。」
「まあ、National Invoice Systemに何かを構築しようとしているとしましょう。その地獄のAPIとその3万行のXMLファイルが内部からどのように見えるか知っています。そのファイルを作成するための「汎用」ソリューションはファイルにはオプションのパラメーターがいっぱいで、特定の事業部門だけが使用すべきケースがいっぱいです。ほとんどの場合、それらを無視しても問題ありません。唯一の場合は、一般的な請求書システムを作成する必要はありません。靴を販売するシステムを作成するだけで、靴を販売するシステムを作成して、最高の靴売りの請求書システムにすることができます。独立した一般的な販売システムとして再販されるたとえば、今では、ガス、食物、またはアルコールにのみ使用されるオプションを実装することは興味深いです。今、それらは可能なユースケースです。彼らはただ、いくつかの仮説的だった前に使用しないでください例を、あなたは実装しない使用しないでください例を。使用しないでくださいは、必要ありませんの弟です。」
Grampsはレゴトレインを元の場所に戻し、マッチ3ゲームに戻りました。
「そのため、特定の問題の一般的な解決策または特定の解決策を選択するには、まずその問題が何であるかを理解する必要があります。それ以外の場合は推測であり、推測はマネージャーではなくプログラマーの仕事です。 ITのすべて、それは異なります。」
だから、あなたはそれを持っています。"場合によります"。これはおそらく、ソフトウェア設計について考えるときに最も強力な2語の表現です。