ベストアンサー
はい、同じ種類の検索と文字列処理関数を何千回も書くことになりますが、それぞれがマイナーです。前回のバリエーション。
これは非常に真実であるため、同じコードを上書きしない方法があるふりをする「Do nt Repeat Yourself」と呼ばれる学界で、それを否定する正気を保つ哲学が生まれました。
このばかげたマントラは本当に人から打ち負かされる必要があります。
スマートなデザインとは、毎回ゼロから始める必要がないことを意味し、スマートなコーディングとは、いつ何かを書くべきかを知ることを意味します。新しいコードをいつ再利用するか。
時間とデバッグを節約する手段としてのコードの再利用には、利用可能な場合にメリットがあります。これは、ジェネリックやテンプレート、継承やユニバーサルAPIの概念などの便利なツールに進化したため、すべてのタイプの配列やリストに対して新しい検索関数を作成する必要がなく、並べ替えや検索がジェネリックになります。
コードテキストのコピーは、バグや肥大化したコードをコピーするため、最悪のエラーと見なされ、主に冗長と見なされます。
これは、コード削減戦略として継承が優れているところです。すべてのサブクラスに共通する機能のほとんどが基本クラスに組み込まれている場合、サブクラスは基本クラスのコストのかかる書き直しである必要はありません。多くの場合、サブクラスは、関数全体を再実装するのではなく、基本クラス関数を呼び出してから、それ自体でいくつかの変更を実行できます。それが彼らが話していることです。
しかし、「Do nt Repeat Yourself」は、このようなフォーラムで、コーディングと設計の理想的な方法としてカルト的な地位を獲得しており、それは真実ではありません。または実用的または主要な実世界のコード本体の一部。
過剰設計は、言語開発者、理論家、およびフレームワーク作成者向けです。実用的なコーダーは、機能するコードを書くだけです。プログラムに2つのクラスがあり、どちらもバイナリ検索を実装している場合はどうでしょうか。他の2つのデータクラスのバイナリ検索を処理するために、サブクラスを持つ3番目のクラスが本当に必要ですか?たぶん、しかしそれは二分探索を必要とするデータクラスの規模を拡大することであり、データクラスのニーズを処理するためにサブクラス化できるそれを正しく行うクラスを持つことはリアルタイムでバグセーバーになります。参照してください。
大規模なプログラミングでは、小さな仕事やツールをプログラミングするよりも、分業の計画と分析に多くの時間がかかります。したがって、1000行を超えるコードを含むプロジェクトがある場合は、設計を調べて冗長なアルゴリズムと関数を見つけ、それらを1つまたは2つの関数ユーティリティクラスにまとめて、すべてのデータオブジェクトのコードを共有できるかどうかを判断します。しかし、それを究極の冗長性除去のための宗教的な探求にしないでください。そして、そうする人を信じないでください。
答え
それが最も効率的な選択肢であるなら、それは悪い習慣ではありません。 よりシンプルでエレガントなソリューションがすぐに利用できる何かを実行することは、悪い習慣ですが、 。
この場合、巨大なスイッチをインターフェースに置き換えたり、クラスに独自の責任を持たせたりすることができます。
たとえば、次のようなものがある場合:
このは機能します。値が追加され、編集されない限り、コードはある程度堅牢になります。ビット比較にかかる時間は実質的にゼロであるため、実際には非常に効率的です。しかし、これは制御不能になり、ナビゲートするのが難しくなります。すでにこれらの車のクラスを定義する必要があります。
代わりに、始めましょう。
繰り返しになりますが、numberOfCylindersメソッドがなくても、おそらくこれがあったので、最初のメソッドは次のようになります。
ここで、私たちが全国の自動車部品店であると想像してみてください。文字通り、さまざまなメーカー、モデル、トリムなどの何千台もの車。それ以外の場合、巨大なモンスターになり、読むことができず、安全に追加または削除するのが非常に困難になるなど。
繰り返します。 、常に悪い習慣ではありません。大きなスイッチなどが必要になることもありますが、通常そこに隠れるためのより簡単な方法があります。
編集:持っていることについて多くのコメントがありますn非常に多くの車の組み合わせ(歴史上数百万の可能性がある)と車を実装するクラスがここで失敗します。もちろん、ある時点でクラスが機能しなくなり、フラットファイルをデータベースに保存してアクセサーを使用することになります。
私の答えは、非常に長い間使用することの落とし穴を示すことを目的としていました。自動車部品店アーキテクチャを構築するための実際の試みとしてではなく、条件付きステートメント。大手自動車小売店で働いている場合は、ソフトウェアアーキテクチャの基礎として私の簡単な答えを受け取らないでください:)