DRYに関係なく、ほぼ同一のコード


34

ほぼ同一のコードがいくつかありますが、メイン変数ではまったく異なる型を使用し、それらの間には継承はありません。具体的には、C#およびVB.NET用のRoslynを使用して、次のタイプのアナライザーを作成しています。

Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax

コードは同じことをしているので、できるだけDRYのままにして、できるだけ別々の(ただしタイプ以外は同じ)メソッドに分割するか、2つのメソッドが完全に分離するのかどうか疑問に思っています関連しておらず、将来の変更が一方のバージョンの変更を強制する可能性がありますが、もう一方のバージョンは変更しない可能性はありますか?

編集: 1年ほど後、私はこの同じ問題にぶつかり、Roslynチームが解決に協力しました。ジェネリックを取り、TAttributeSyntaxほとんどの作業を行うパラメーターを持つ基本クラスを作成します。次に、特定の型を必要とする最小限のデータで派生クラスを作成します。


既存のクラスをラップするが、概念的にそこにあるはずの継承を提供する独自のAttributeSyntaxインターフェースを作成することはできますか?
ウィンストンイーバート

7
これが明らかな場合は申し訳ありませんが、ジェネリックが存在するので、タイプは同じですがコードを繰り返す必要はありません。それが意図したものでない場合は、無視してください。
デビスラー

@Lorehead通常はそれを行いますが、これは、制御できない内部メソッドからのペイロードとしてノードを含む型が渡される単一のメソッドです。
Hosch250

@WinstonEwertそれについて調べます。ただし、すべてのC#/ VB.NETタイプに対してこれを実行したいかはわかりません。
Hosch250

1
リファクタリングは多くの妥協をもたらし、時にはパラドキソンさえももたらします。例えば、疎結合対DRY、または短い機能、しかしその多く、対より長い機能、およびその少数。結局のところ、それは難しい獣です。あなたの目標は読みやすさと保守性です。コードを初めて見るアバターと考える必要があります。そして時々、あなた何が良いかを試してみます。残念ながら、完璧なリファクタリングは不可能です。
フレネル

回答:


111

誰かがそれを行うのが良い本のどこかに書いているので、あなたはDRYをしません実際に目に見える利益があるので、DRYをします。

具体的にはその質問から:

繰り返すと、保守性の問題が生じる可能性があります。doStuff1-3のすべてに同様の構造のコードがあり、1つの問題を修正した場合、他の場所で問題を修正するのを簡単に忘れることがあります。また、処理する新しいケースを追加する必要がある場合は、場所全体にコピーアンドペーストするのではなく、異なるパラメーターを1つの関数に渡すだけで済みます。

ただし、DRYはしばしば、賢いプログラマーによって極端に扱われます。自分自身を繰り返さないようにするには、抽象化を作成して、チームメイトがそれに追随できないように鈍感にする必要があります。2つのものの構造があいまいに似ているだけで、十分に異なる場合があります。doStuff1-4が十分に異なっており、リファクタリングを繰り返さないと、不自然なコードを記述したり、巧妙なコーディングバックフリップが必要になり、チームにグレアがかかってしまいます。私は不自然な方法で数回自分自身を繰り返さないように後ろ向きに曲がり、最終製品を後悔しました。

したがって、基本的には、「ああ、このコードはかなり似ている。自分自身をリファクタリングしないようにリファクタリングする必要がある」とは考えないでください。「このコードベースが共通の要素を再利用するようにリファクタリングすると、コードのメンテナンス性が向上するの、メンテナンス性が低下するのか」と考えてください。次に、より保守しやすいものを選択します。


ことで、与えられた、と述べたSRPそれがためにあなたのコードを分析することが意味をなすかもしれない、とちょうど一般的に小さく、柔軟なクラスを持ってしようとしているそのため、ジェネリック型を使用する行動のビットをバラバラに(あなたは彼らがタイプよりも同じで、他のと言われています)少人数クラス。次に、これらのクラスの一部が実際には完全に同一であることがわかり(ほとんど同一ではありません)、追加したい場合に備えてツールキットを構築できMicrosoft.CodeAnalysis.CPlusPlus.Syntax.AttributeSyntaxます。


32
TL; DR-DRYは目的を達成するための手段です。手段ではなく、目的に焦点を当てます。私がレゴマンに2回賛成票を投じることができれば、私はそうするでしょう。

重要な注意事項の1つ、自分自身を繰り返す場合は、繰り返されるコードが変更されたときにアクセスする必要がある他のすべての場所を常にコメントに記載することです。非同期化の可能性を減らすだけでなく、繰り返しによって引き起こされるメンテナンスの痛みの指標としても機能します。
Xion
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.