web-dev-qa-db-ja.com

DRY無関係、ただしほぼ同一のコード

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

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

コードが同じことをしているので、私はそれをDRYとしてできるだけ保持し、可能な限り個別の(ただし、タイプ以外は同じ)メソッドに分割する)必要があるのか​​と思います。または、2つの方法が関連しておらず、将来の変更により一方のバージョンが強制的に変更され、もう一方は変更されない可能性があるため、完全に分離する(これはありそうもないことですが)?

編集: 1年ほど後、同じ問題が発生し、Roslynチームが解決に貢献しました。ジェネリックを受け取り、最も機能するTAttributeSyntaxパラメーターを持つ基本クラスを記述します仕事の。次に、特定の型を必要とする最小限のデータで派生クラスを記述します。

34
user113093

あなたはしませんDRY誰かがそれを良いことをどこかで本に書いたので、あなたはしますDRYそれは実際に tangibleメリット

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

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

ただし、DRYは、賢いプログラマーによって極端に解釈されることがよくあります。自分自身を繰り返さないようにするには、抽象化を作成しなければならず、チームメイトがそれをフォローできないようにする必要があります。2つのものの構造が漠然としているだけの場合もあります。 doStuff1-4が十分に異なっているため、リファクタリングを繰り返さないようにして、不自然なコードを記述したり、巧妙なコーディングバックフリップを行ったりして、チームをまぶしくさせる必要がある場合は、繰り返してもかまいません。不自然な方法で何度か自分自身を繰り返さないように後方に曲がり、最終製品を後悔しました。

したがって、基本的には、「ああ、このコードはかなり似ているので、自分で繰り返さないようにリファクタリングする必要がある」とは思わないでください。 「このコードベースで共通の要素を再利用するためのリファクタリングは、コードを保守しやすくするまたは保守しにくくするですか?」次に、保守しやすいものを選択します。


そうは言っても、 [〜#〜] srp [〜#〜] が与えられ、一般的に小さな柔軟なクラスを作成しようとしているだけなので、コードを分析してその理由、ジェネリック型(型以外は同じであると言った)を使用する動作のビットを小さなクラスに分解します。次に、これらのクラスの一部が実際には完全に同一(ほとんど同一ではない)であることがわかります。次に、Microsoft.CodeAnalysis.CPlusPlus.Syntax.AttributeSyntax

110
durron597