[解決済み] 抽象度はどれくらいがいいのか?
質問
オブジェクト指向のプログラムでは どの程度の抽象化が多すぎるのでしょうか?どの程度がちょうど良いのでしょうか?
私は常にナットアンドボルトのような男でした。高レベルのカプセル化と抽象化の背後にある概念を理解していましたが、いつも直感的に、あまりに多くを追加するとプログラムを混乱させるだけだと感じていました。
私は常に、空のクラスやレイヤーを残さないような抽象化の量に挑戦していました。また、疑問がある場合は、階層に新しいレイヤーを追加する代わりに、既存のレイヤーに何かをはめ込もうとしました。
しかし、最近、私はより高度に抽象化されたシステムに遭遇しています。 階層構造の後半で表現を必要とする可能性のあるすべてのものが、最初に表現されるようなシステムです。これは、多くの空の層をもたらすので、最初は悪い設計のように思えます。しかし、よく考えてみると、空のレイヤーを残しておくことで、将来、リファクタリングなしでフックできる場所を増やすことができるのだとわかってきました。古いものを調整するための作業をほとんど行うことなく、古いものの上に新しい機能を追加する能力をより多く残すことができます。
この方法の2つのリスクは、必要なレイヤーを間違えてしまうことです。この場合、コードを拡張するためにかなりのリファクタリングが必要になり、使用されないレイヤーが大量に残ってしまうことになります。しかし、最初の抽象化を考え出すのにどれだけの時間を費やすか、それを失敗させる可能性、そしてそれを正しく行うことで後で節約できる時間によっては、試してみる価値があるかもしれません。
私が考えるもうひとつのリスクは、それをやりすぎて、すべての追加レイヤーを必要としなくなるリスクです。しかし、それは本当に悪いことなのでしょうか? 余分なレイヤーは本当に高価で、一度も使用されなかったとしても、それほど損失にはならないのでしょうか? レイヤーを作るのに必要な時間が失われることが最大の損失でしょう。しかし、その時間の多くは、より低レベルのコードではなく、抽象化されたコードで作業できるようになったときに、まだ節約できるかもしれません。
では、いつから過剰になったのでしょうか? どの時点で、空のレイヤーと余分な抽象化が過剰になるのでしょうか。どの程度少ないのでしょうか? スイートスポットはどこなのでしょうか。
これまでのキャリアの中で、必要な抽象化の量を判断するのに役立つ、信頼できる経験則はありますか?
どのように解決するのですか?
<ブロッククオートでは、どのような場合に過剰になるのでしょうか?どの時点で 空のレイヤーと余分な "必要かもしれない need"抽象化が過剰になるのはどの時点でしょうか? どの程度までが少なすぎるのでしょうか?どこが スイートスポットはどこですか?
これらの質問に対する明確な答えはないと思います。何が多すぎで何が少なすぎるか、その感覚を身につけるには経験が必要です。測定基準や品質管理ツールを使うことも有効かもしれませんが、一般化するのは難しいです。ほとんどの場合、個々のケースに依存します。
答えを求めているあなたを刺激するようなリンクがいくつかあります。
- あなたはそれを必要としないでしょう
- 使用/再使用のパラドックス
- プロジェクトの三角形:良い、速い、安い
- コンピュータサイエンスにおけるすべての問題は、別のレベルの間接的な方法で解決することができる (David Wheeler)
開発とは、あらゆるソフトウェア工学の取り組みに存在するさまざまな緊張感の間で正しいバランスを見つけることがすべてです。
関連
-
[解決済み] ハッシュコードとチェックサム、その違いは?
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] JavaScriptのオブジェクトのクラスを取得する方法は?
-
[解決済み] πの値を最も早く求める方法は何ですか?
-
[解決済み】ビットシフト(bit-shift)演算子とは、どのようなもので、どのように機能するのですか?
-
[解決済み】ビット演算子の実際の使用例【クローズド
-
[解決済み] イーガーローディングとは何ですか?
-
[解決済み] カプセル化と抽象化の違い
-
[解決済み] なぜ「ハンガリー記法」を使ってはいけないのですか?
-
[解決済み] 例外処理とリターンコードのどちらが好きか、またその理由は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] グリーンフィールド・アプリケーションとブラウンフィールド・アプリケーションとは?
-
[解決済み] セッションとは何ですか?どのように機能するのですか?
-
[解決済み] イーガーローディングとは何ですか?
-
[解決済み] 2つの角度の差を求めるにはどうすればよいのでしょうか?
-
[解決済み] スタックオーバーフローを引き起こす最短のコードは何ですか?[クローズド]
-
[解決済み] パワーメーターの赤と緑の間の色を生成する?
-
[解決済み] 浮動小数点数の比較はどのようにすればよいのですか?
-
[解決済み] 例外処理とリターンコードのどちらが好きか、またその理由は?
-
[解決済み] メモリマップドファイルの利点は何ですか?
-
[解決済み] レキサーの書き方の基本はどこで学べますか?