ない方がいいコードの重複していますsimple/読めるけど、やっていない複製をジェネリック医薬品が、より複雑な?
-
21-09-2019 - |
質問
総じてしまったころがいっぱいあるんです!私の人を好むとっても簡単に読みやすく授業をしてでもあるとコードの重複はいかに自分の力を避けるコードの重複る場合でも、このようにより複雑なのです。うの?私の専Java.
解決
私はいつも、コードの重複なしのソリューションを好みます。より複雑なアーキテクチャが最初に理解することが難しい場合でも、メンテナンスのメリットは、複数の学習曲線を上回るます。
他のヒント
は、私は読みやすさは、保守コードベースを持っている絶対的な最初の要件であると感じています。私は常にコードの重複の完全な排除にシンプルな、読みやすい、および保守性を好むだろう。
最良の実践例: コードが短く、複製ではない。
る場合でも、非常に類似のスニペットのコードのコピー/貼り付けが異なる3ヶ所、リファクタリング.
約への同意が必要となリファクタリングのない良い作りのコードが複雑化してきております。以下を考えます:
class IntStack
{
public int value;
public IntStack next;
}
class StringStack
{
public String value;
public StringStack next;
}
class PersonStack
{
public Person value;
pubilc PersonStack Next;
}
思いのスタックのための新しいdatatype,記述する必要があります新しいクラスです。重複コードに働きがいを追加したい新しい方法は、その国の"Push"を返します新しい攻略法は、ありませんか大丈夫、今だ強制的に添加できるようになっているbajillion異なるところがございます。またはを使用できる汎用オブジェクトのスタック、そんなタイプ。ジェネリック医薬品が簡素化され、建築
class Stack<T>
{
public T value;
public Stack<T> next;
}
カッコいいぞ!●
大丈夫、この例:
class Logger
{
int logtype;
public Logger(int logtype) { ... }
public void Log(string text)
{
if (logtype == FILE) { ... }
elseif (logtype == DATABASE) { ... }
elseif (logtype == CONSOLE) { ... }
}
public void Clear()
{
if (logtype == FILE) { ... }
elseif (logtype == DATABASE) { ... }
elseif (logtype == CONSOLE) { ... }
}
public void Truncate(int messagesToTruncate)
{
if (logtype == FILE) { ... }
elseif (logtype == DATABASE) { ... }
elseif (logtype == CONSOLE) { ... }
}
}
大丈夫ですの追加方法をご確認ください。どのようなロガーだ。痛がございます。通常はまっ因子のウインターフェイス(おそらくの方法でログを明確にし、切り詰め、その作成クラス(FileLogger,DatabaseLogger,ConsoleLogger).
夜間、週末などに開催される講座=ります。このやや困難なものに維持する。この例では、僕のコードは維持しやすくなるが、YMMV.
コードの重複を避けるために、主な理由は、保守性です。それは時間が来るとき、コードのセグメントは、複数の場所で表示された場合、あなたはどこにでもを<全角>それを変更することを忘れないように持って更新します。つのインスタンスを変更するには忘れることはあなたがすぐに気づかないかもしれないの大きいの問題を引き起こすことができます。
がありますが、複雑なメタプログラミング(Java用ではないので、多くの問題)や反射の過度の使用により、コードの重複を防ぐため、極端な例があり、それらのいくつかのケースでは、私は重複を許可好むと思います。これはまれです。だから、ロングコードはあなたではない合理的に熟練した開発者が理解しやすいままで、私は重複を排除するために行くと思います。
私はチームは、1つまたは2つの熟練した開発者や初心者は、彼らが一目で理解していないというアプローチをコーディングの使用を防止しようとする初心者の束を含んでいる状況全体を実行しています。これは、抵抗しなければなりません。
私はあなたの質問に関連しているか、「ジェネリック医薬品」は表示されません。それはあなたが求めているものをすることはできませんので、それは、CollectionOfFooとCollectionOfBarを表現するために別々のクラスを持つことが、自明明らかに間違っています。
あなたはおそらく、ビューの各点についての例を提供する必要がありますが、あなたはおそらくまだ主観的であることのため閉鎖しますよ。
これは審判の判定です。ほとんどのプログラマはコードの重複が多すぎる、と私は重複を打ち抜くことは絶対に良好であることを情熱的な開発者の間での態度にそのリードをと思いますが、そうではありません。読みやすいコードを作成優先であるべきであり、重複したコードを排除することは、常に通常は読みやすくするために良いことですが、ありません。
また、私はそれらを学習する目的のためになじみのない言語機能を使用する場として商業的に価値のあるコードを使用することはありません。その目的のために個別の学習プロジェクトを作成します。あなたは、修正ジェネリックとあまりにも空想を取得することにより生じた不具合、または任意の他の機能に時間外での仕事に呼ばなってしまうしたくない。
コードの重複を避けることは常に良いことです。あなたがある早期の汎化警戒する必要があることを一つのことA>。
この あなたが似ているコードの断片のカップルを取得するとすぐに急ぐ必要はありません。あなたは良いモデルを開発しているまで、後ろに座るために、そのOKます。
でもあなたは、[OK]をすることができます一般化する必要があるもののいくつかの例をさせる特に、物事が終わった少し複雑かつ/または開いているとき。むしろ、1つか2つ以上、あなたは3-5 +例を持っているとき、一般化することが容易にできます。
はありません。これらの状況のどちらも可能です。しかし、それだけであることが必要との複合体として、ジェネリックでそれを書いてます。
ドゥ重複しないコード。あなたは、二重修正のバグ、ダブル追加の強化、二重書き込みのコメント、二重書き込みテストする必要があります。あなたが作成したコードのすべての行は、あなたが長い間、あなたがそのコードベースで作業としてのために実行する必要があります小さな負担です。あなたの負担を最小限に抑えます。
により数多くの要因:
- どのくらいコードが複製されるのでしょうか?問題はない場合と同じ、五線に表示され回の提供にあjustfiableの理由です。上述のコードで実際に削減メンテナンス性ので、次の人のコードはないすべての微妙に建築や曲がりが厳しいです。
- どのように多数のコピーを同じコードについて教えてください。二悪くないが、10(点)しないことが分かっています
- なぜそのようなコードに複製されるのでしょうか?いくつかの"重複度によりさまの要求たが必ずしも複写で、いい成績をおさめています。
私の答えは、たぶん...
私の答えを与える前に、私は質問が本当に何であるか確認するために、いくつかのサンプルコードを見てみたいと思います。
そのために待っている間、、私はあなたのコードは、(例えば、の各クラスん一つだけと一つのことだけのように)ほとんど正気のOOの原則に構築されている場合は任意のコードがあってはならないと信じています複製の周り。確かに無用のクラスの巨大な山を作成して終了しますが、私はそれがここでの問題はないと思うどの抽象化などでナットを行くことが出来ます。
ジェネリック医薬品が読みにくいです主な理由です。これは、細心の注意を経由明快の輝きを作るために命名し、ドキュメントの選択に注意する必要があることを意味します。
このようなコアクラスは、よく名前が付けられていることが極めて重要です。設計者は、名前を選択する前に、ピアで十分にこれを議論したいことがあります。
優れた問題にの回答に合わないのではないかご状況です。多くの要因を判定選択
- 現在のコードの品質
- 貴社の製品、プロジェクト段階の早い成長と成熟
- 開発者の経験-スキル
- プロジェクト/製品の上市まで
これらの重要な要因を決定します。私の体験を実現複製ビジネスロジック(中間層コードは良くないが、プレゼンテーション層で重複コードです。
私はこのことを思い出条"は低成長と等しい死亡".文書の品質および非重複コードに時間をいただく場合があがるなボトルネックお気軽にお問い合わせください。
通常重複したコードへの唯一の理由は、言語の弱いテンプレート/マクロ/ジェネリックシステムまたはを克服するためにあるさまざまな種類を扱うさまざまな低レベルの関数名があり、最適化、ためています。
あなたがあなたを指摘ではC ++、のテンプレートシステムは、「カスタマイズ」が利用できるの専門ので、ゼロ・オーバーヘッドタイプと機能の生成を可能に、内の動作しません特定の型パラメータに対して生成されたコード。 JavaはC ++内で使用可能回避の両方-一般と固有の選択肢を削除、並べ替えの何もしています。
でCommon Lispの、一つの基本的なケースは、異なるコード拡張を生じる、特定のタイプのためにカスタマイズすることができるC ++テンプレートに類似農産物コードにマクロとコンパイラマクロを使用することができる。
Javaでは、私は汎用コードに反論したいだけ時間が数値型を使用して内部ループのためです。汎用コードで数値型のボクシングとアンボクシングのコストを支払うことはあなたのプロファイラは、コンパイラまたはホットスポットがボクシングを見送るために巧妙十分だったことを納得させることができない限り、これらの例では受け入れられない。
読みやすさについては、よく、あなたのコードモデルと同僚が上昇していたに挑戦してください。トラブルそれを読んを有するものを教育するオファー。欠陥のためにそれを確認するためにそれらを奨励します。彼らはいずれかを見つけた場合、あなたは1つだけと唯一のバージョンを修正することの利点を発揮することができます。
リレーショナル・データベースに正規化するにそれを比較 - あなたは、おそらくいくつかの種類のいずれかの場所にしたいです関数やデータの生活ではなく、多くの場所。これは、保守性とあなたのコードに関する理由に能力の面で違いの多くを作る。