質問

最近のコードレビューで、クラスで複製されたロジックの数行(15行未満)を見つけました。著者がコードをリファクタリングすることを提案したとき、彼はコードがそのように理解するのがより簡単であると主張しました。もう一度コードを読んだ後、重複したロジックを抽出することで読みやすさを少し傷つけることに同意する必要があります。

私はドライがガイドラインであり、絶対的なルールではないことを知っています。しかし、一般的に、あなたは乾燥の名の下で読みやすさを傷つけようとしますか?

役に立ちましたか?

解決

リファクタリング:既存のコードの設計の改善

3のルール

初めて何かをするとき、あなたはそれをするだけです。 2回目
似たようなこと、あなたは複製でひるむが、あなたは複製をします
とにかく物事。似たようなことを3回目にすると、リファクタリングします。

3つのストライキとリファクタリング。


職場のコーダー

seibel: したがって、これらのXIIコールのそれぞれについて、実装を書いています。
非常によく似たコードのビットをたくさん蓄積していることに気付いたことがありますか?

ザウィンスキー: ああ、そう、間違いなく。通常、2回目または3回目までにカットして貼り付けました
そのコードの一部は、まあ、切断と貼り付けをやめて、それをサブルーチンに入れる時間のようなものです。

他のヒント

私は何も許容しません。時間の制約やその他のために、私はいくつかを持っているかもしれません。しかし、私はまだ重複したコードが本当に保証されているケースを見つけていません。

読みやすさを傷つけると言うことは、あなたが名前を選ぶのが苦手であることを示唆しているだけです:-)

個人的には、何よりもまずコードを理解できるようにすることを好みます。

乾燥とは、コードのメンテナンスを緩和することです。繰り返されるコードを削除するためにコードを理解しにくくすると、多くの場合、コードの繰り返し行があるよりも、保守性がより痛くなります。

そうは言っても、私は、DRYが実用的なときに従うべき良い目標であることに同意します。

問題のコードに明確なビジネスまたはテクノロジーサポートの目的Pがある場合、通常はそれをリファクタリングする必要があります。それ以外の場合は、クローンコードに古典的な問題が発生します。最終的に、Pをサポートするコードを変更する必要があることを発見し、それを実装するすべてのクローンを見つけることはありません。

一部の人々は、3つ以上のコピーがリファクタリングのしきい値であることを示唆しています。あなたが2つ持っているなら、あなたはそうするべきだと信じています。大きなシステムで他のクローン(またはそれらが存在する可能性があることを知っている)を見つけることは、2つまたは3つ以上があるかにかかわらず困難です。

今、この答えは、のツールを持っていないという文脈で提供されます 発見 クローン。クローンを確実に見つけることができる場合、リファクタリングする元の理由(メンテナンスエラーを回避)はあまり目立たない(名前付き抽象化を持つことの有用性はまだ現実的です)。あなたが本当に欲しいのは、クローンを見つけて追跡する方法です。それらを抽象化することは、(些細なことを見つけることによって)それらを「見つける」ことができるようにする1つの方法です。

クローンを確実に見つけることができるツールは、少なくとも障害のないクローンのメンテナンスエラーを作成することを防ぐことができます。そのようなツール(私は著者です)は Clonedr. 。 Clonedrは、ターゲットを絞ったランゲージ構造をガイダンスとして使用してクローンを見つけ、したがって、白人のレイアウト、コメントの変更、変数の変更などに関係なくクローンを見つけます(C、C ++、Java、C#、COBOL、PHPを含む言語で実装されています。 )。 Clonedrは、ガイダンスを与えられることなく、大規模なシステム全体でクローンを見つけます。検出されたクローンが表示されます 抗ウイアフ, 、これは本質的にあなたが代わりに書いたかもしれない抽象化です。そのバージョン(COBOLの場合)は、Eclipseと統合され、バッファ内のクローン内で編集しているときと他のクローンがどこにあるかを表示して、他のクローンをそこにいる間に検査/修正できるようにします。 (あなたがするかもしれないことの1つはそれらをリファクトすることです:)。

クローニングは完全に間違っていると思っていましたが、クローンが元のものとどのように異なるかわからないため、人々はそれをします。クローンを追跡でき、抽象化が明確になった後にリファクタリングを試みると、クローニングが良いと思います。

繰り返したらすぐに なんでも 間違いを犯し、拡張、編集、削除、またはその力に反対する他の数十の理由を削除する必要があることがわかった場合、編集を行うための複数の場所を作成しています。

ほとんどの言語では、ブロックを適切に指定された方法に抽出することで、読みやすさを損なうことはめったにありません。

それはあなたの基準であなたのコードですが、あなたの「いくらですか?」に対する私の基本的な答えはは なし ...

あなたはどの言語を言いませんでしたが、ほとんどのIDEでは、それは単純なリファクタル - >抽出方法です。それがどれほど簡単であり、いくつかの引数を備えた単一の方法は、2ブロックの重複コードよりもはるかに維持可能です。

抽象的に言うのは非常に難しい。しかし、私自身の信念は、複製されたコードの1行でさえ機能にする必要があるということです。もちろん、私はいつもこの高い水準を自分で達成するわけではありません。

リファクタリングは難しい場合があり、これは言語に依存します。すべての言語には制限があり、再現されたロジックのリファクタリングバージョンは、繰り返されるコードよりも言語的に複雑になる場合があります。

多くの場合、コードロジックの複製は、さまざまな基本クラスを持つ2つのオブジェクトが動作方法に類似点がある場合に発生します。たとえば、両方とも値を表示しますが、その値にアクセスするための共通インターフェイスを実装しない2つのGUIコンポーネント。この種のシステムをリファクタリングするには、必要以上に多くの一般的なオブジェクトを使用する方法が必要であり、その後にタイプチェックとキャストが続くか、クラスの階層を再考し、再構築する必要があります。

この状況は、コードが正確に複製された場合とは異なります。 2回だけ使用することを意図した場合、同じ関数内で両方の回数を使用することを意図した場合、必ずしも新しいインターフェイスクラスを作成するわけではありません。

乾燥のポイントは保守性です。コードを理解するのが難しい場合は、維持が難しい場合があるため、読みやすさを後退させると、実際にDryの目標を達成できない可能性があります。 15行未満のコードの場合、私はあなたのクラスメートに同意する傾向があります。

一般的に、いいえ。とにかく読みやすさのためではありません。重複したコードを本のように読み取る一般的な方法を明らかにする意図にリファクタリングする何らかの方法が常にあります。

依存関係の導入を避けるためにドライに違反するための議論をしたい場合、それはより多くの体重を運ぶかもしれません、そしてあなたはポイントを説明するためにコードとともにAyendeの意見を得ることができます ここ.

あなたの開発者が実際にはayendeでない限り、私はしっかりと乾燥させ、意図を通じて読みやすさを得るためにします。

bh

重複コードは受け付けていません。複数の場所で何かが使用されている場合、それはフレームワークの一部または少なくともユーティリティライブラリになります。

コードの最良の行は、書かれていないコードの行です。

この場合、コードのコピーが1つだけで、この方法で読みやすい場合は、コードの使用量、読みやすさなどに本当に依存します。ただし、同じコードを3番目の場所で使用する必要がある場合は、共通の関数にリファクタリングすることを真剣に検討します。

読みやすさは、コードが持つことができる最も重要なものの1つであり、私はそれについて妥協することを嫌がります。重複したコードは悪臭であり、致命的な罪ではありません。

そうは言っても、ここには問題があります。

このコードが同じであると想定されている場合、偶然にも同じであると想定されている場合、保守性のリスクがあります。私はそれぞれの場所に他の場所を指してコメントを持っています、そしてそれが3番目の場所にある必要があるならば、私はそれをリファクタリングします。 (私は実際にこのようなコードを持っています。適切なコードファイルを共有しない2つの異なるプログラムであるため、各プログラムのコメントが他のプログラムを指します。)

線が一貫した全体を作るかどうかは、簡単に説明できる機能を実行していません。もしそうなら、それらをリファクタリングします。コードが2つの場所により読みやすく埋め込まれていることに同意するため、これが事実であることはほとんどありません。ただし、より大きいまたは小さい類似性を探すことができ、おそらくコードを簡素化するための関数を考慮してください。コードの数十行が繰り返されるからといって、関数がそのダース行で構成されている必要があるわけではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top