2016-09-28 50 views
3

私はプロジェクトに取り組んでいます。重複したコードがたくさんあることに気付きました。重複したコードを1つのメソッドに統合したいと思います。重複したループを回避する

foreach (var glider in gliders) 
{ 
    List<PriceDataModel_New> bestPrices = PriceService.GetBestPrices(prices, glider.Value.No, string.Empty, string.Empty, string.Empty, 1); 
    var priceGroups = bestPrices.GroupBy(p => p.SalesCode); 
    var salesCodePrice = priceGroups.ToDictionary(k => k.Key, v => v.First()); 
    AddEmptyines(fieldMapping, lines); 
    var last = lines.Last(); 

    foreach (var keyValuePair in fieldMapping.Postions) 
    { 
     int index = keyValuePair.Key; 
     var key = keyValuePair.Value.InternalHeading; 
     InsertInLines(last, key, index, "CODE_Id", modelNo + "_" + glider.Value.No); 
     InsertInLines(last, key, index, "ItemId", glider.Value.No); 
     InsertInLines(last, key, index, "CODE_OptionalName", (glider.Value.ComponentType + " " + glider.Value.ProductFamily).ToLower()); 
     InsertInLines(last, key, index, "Attr_Family name", family); 
     InsertInLines(last, key, index, "CODE_IsOptional", "true"); 
     InsertInLines(last, key, index, "Model", modelNo); 
     InsertInLines(last, key, index, "CODE_OptionalInfo", glider.Value.Size.ToLower()); 

     if (AddToLinePrice(salesCodePrice, keyValuePair.Value.InternalHeading, index, last)) 
      continue; 
    } 
} 

     //AppendLines(seatPads, prices, lines, fieldMapping, "", modelNo, family, "linking.Value.SimpleMaterial", ""); 

foreach (var seatPad in seatPads) 
{ 
    List<PriceDataModel_New> bestPrices = PriceService.GetBestPrices(prices, seatPad.Value.No, seatPad.Value.Variant.Substring(0, 3), string.Empty, string.Empty, 1); 
    var priceGroups = bestPrices.GroupBy(p => p.SalesCode); 
    var salesCodePrice = priceGroups.ToDictionary(k => k.Key, v => v.First()); 
    AddEmptyines(fieldMapping, lines); 
    var last = lines.Last(); 

    foreach (var keyValuePair in fieldMapping.Postions) 
    { 
     int index = keyValuePair.Key; 
     var key = keyValuePair.Value.InternalHeading; 
     InsertInLines(last, key, index, "CODE_Id", modelNo + "_" + seatPad.Value.No); 
     InsertInLines(last, key, index, "ItemId", seatPad.Value.No); 
     InsertInLines(last, key, index, "CODE_OptionalName", seatPad.Value.ModelNo.ToLower()); 
     InsertInLines(last, key, index, "Attr_Family name", family); 
     InsertInLines(last, key, index, "CODE_IsOptional", "true"); 
     InsertInLines(last, key, index, "Model", modelNo); 
     InsertInLines(last, key, index, "CODE_OptionalInfo", seatPad.Value.UpholsteryFabric.ToLower() + " black"); 

     if (AddToLinePrice(salesCodePrice, keyValuePair.Value.InternalHeading, index, last)) 
      continue; 
    } 
} 

     //AppendLines(linkingDevices, prices, lines, fieldMapping, "", modelNo, family, "linking.Value.SimpleMaterial", ""); 

     foreach (var linking in linkingDevices) 
     { 
      List<PriceDataModel_New> bestPrices = PriceService.GetBestPrices(prices, linking.Value.No, string.Empty, string.Empty, string.Empty, 1); 
      var priceGroups = bestPrices.GroupBy(p => p.SalesCode); 
      var salesCodePrice = priceGroups.ToDictionary(k => k.Key, v => v.First()); 
      AddEmptyines(fieldMapping, lines); 
      var last = lines.Last(); 

      foreach (var keyValuePair in fieldMapping.Postions) 
      { 
       int index = keyValuePair.Key; 
       var key = keyValuePair.Value.InternalHeading; 
       InsertInLines(last, key, index, "CODE_Id", modelNo + "_" + linking.Value.No); 
       InsertInLines(last, key, index, "ItemId", linking.Value.No); 
       InsertInLines(last, key, index, "CODE_OptionalName", linking.Value.ComponentType.ToLower()); 
       InsertInLines(last, key, index, "Attr_Family name", family); 
       InsertInLines(last, key, index, "CODE_IsOptional", "true"); 
       InsertInLines(last, key, index, "Model", modelNo); 
       InsertInLines(last, key, index, "CODE_OptionalInfo", linking.Value.SimpleMaterial); 

       if (AddToLinePrice(salesCodePrice, keyValuePair.Value.InternalHeading, index, last)) 
        continue; 
      } 
     } 

のみ数行に異なる上記foreach文:

これは、重複コードのサンプルです。私はこれを一般的にする方法を理解できません。私はReflection、Func <>と代議員と一緒に試しましたが、どんな提案も大歓迎です。

+2

。これは特定のリファクタリングのリクエストですが、私はそれを「あまりにも広すぎる」とは考えていません。 –

+0

@ Jean-FrançoisFabre[this](http://meta.codereview.stackexchange.com/q/5777/31562)を読んでいますか?また、移行ターゲットとしてCRを追加することの提案は新しいものではありません。しかし、それは多くの理由で問題のあるものです。私は必要以上にここにコメントを記入したくないので、あなたがそれについて私にここで私を見つけることができるチャットしたい場合:http://chat.stackexchange.com/rooms/8595/the2nd-monitor –

+0

はい、私は私は私の質問のためにバサッシュになったときにそれをお読みください。ご覧のとおり、質問は終了しました。 CodeReviewで私はそれに答えるつもりだったでしょう。だからそれがSOかCRのどちらかにあるべきかどうかは基本的には意見に基づいています:) –

答えて

0

まず、グライダー、seatPad、およびリンクする子クラスの基本クラスを用意してください。

内側のforeachの本体をxtractし、独自のメソッドに移動します。渡されるパラメータは、基本クラス型である必要があります。したがって、コードはすべての子タイプに対して機能します。

残りは、前方にあるべきである。

3

グライダー、seatpadsとlinkingdevicesオブジェクトについては、以下のと同様のインタフェースを実装:modelNoのように(製品の外にあるものは何でも受け入れ

private void Generic<T>(IEnumerable<T> products, string modelNo) 
     where T: IProduct 

public interface IProduct 
    { 
     string No { get; } 
     string CodeName { get; } 
     string Family { get; } 
     string ModelNo { get; } 

     string CodeInfo { get; } 

     IDictionary<string, string> FieldMapping { get; } 
    } 

をしてからのような汎用的な機能を作ります製品に固有のものを入れてください(ここでは「製品」が正しくない場合は名前を変更してください)。

必要に応じて、私は(私も根本的な複雑さのわからない)理にかなっている場合にはその性質を平坦化し、同様のようにしFieldmapping辞書を変更します

public interface IProduct 
    { 
     string No { get; } 
     string CodeName { get; } 
     string Family { get; } 
     string ModelNo { get; } 

     string SalesCode { get; } 
     string CodeInfo { get; } 

     IEnumerable<IProductAttribute> Attributes { get; } 
    } 

    public interface IProductAttribute 
    { 
     string InternalHeading { get; } 
     int Index { get; } //not sure what this is for. 
    } 
+0

@Blorgbeardこの回答が役に立ちましたか?はいの場合は、他者を助けるための回答としてマークする必要があります。 –

0

まあ、それはするのは難しいですそれは非常に主観的なので、最高の解決策を提案します... Func<>は、違いが未成年者である場合や、わずかな違いがある場合があります。

ここでは、共通のインターフェースを使用しています(元のオブジェクトを変更したくない場合は、アダプター/ファサード/ブリッジを使用している可能性があります)。

また、希望のフィールドを持つ別のクラスを作成し、元のデータをその新しいフォーマットに変換することもできます。

どちらのソリューションが理にかなっていますか?さて、評価するのはあなた次第です。私は、スタックオーバーフローのため、このオフトピックを考慮していないジャンFranç[email protected]

Class adapter pattern

ます。また、関連する他のデザインパターンに見えるかもしれません...

関連する問題