2017-05-31 8 views
-2

私はクラスDataManipulationの3つの関数ExtractData,Validate、およびFinishFormsを持っています。
すべてのメソッドは、クラスのプライベート変数にアクセスする必要があります(読みやすさのために、ほんの少しの例があります)。多くの共有変数を持つクラスメソッドをリファクタリングするためのデザインパターン

実際のクラスは非常に長く、3つのクラスに分けていきたいと思います。
私はクラスをインスタンス化するために依存関係注入を使用し、3つのメソッドを3つのクラスに分けるだけでかなりの変数を渡すことになります。これは読みやすさには役に立たないと思います。

TL; DR。メソッドが多くの内部変数を操作する非常に長いクラスがあります。メソッドは3つの別々の責任領域にグループ分けできますが、クラスを3つに分割することは多くの内部変数を渡すことを意味します。

私は自分の問題に使う正しいデザインパターンを探しています。

public class DataManipulation 
    { 
     private readonly IUnityContainer unity, 

     private ImportModel VarUsedEverywhere; 
     //VarUsedEverywhere1 to 10 also defined here 

     private List<string> _errorMessages = new List<string>(); 

     public DataManipulation(IUnityContainer unity) 
     { 
      _unity = unity; 
     } 


     public async Task<ImportLogModel> Process(Stream importFile) 
     { 

      ExtractData(importFile); 

      await Validate(); 

      await FinishForms(); 

      return VarUsedEverywhere1; 
     } 
    } 

 private bool ExtractData(Stream importFile) 
     {     
      for (var row = 1; row <= importFile.MaxDataRow; row++) 
      { 
       foreach (var header in importFile.headerMap) 
       { 
        var value = importFile.Cells[row, header.Value.Item1].GetUnmergedValue(); 
        VarUsedEverywhere1.rows[row].add(value);   
       } 
      } 
      //Extract more data into VarUsedEverywhere 
      //Add to _errorMessages if operations do not succeed. 
     } 

 private bool Validate() 
     { 
      if (!VarUsedEverywhere1.Headers.Contains(VarUsedEverywhere2.sourceHeaderKey)) 
      { 
       _errorMessages.Add(string.Format("Could not find header in Excel file: [{0}]", importMap.sourceHeaderKey)); 
       success = false; 
      } 
      //validate data in VarUsedEverywhere1 to 10 
      //Add to _errorMessages if operations do not succeed. 
     } 

。要求されたよう

 private bool FinishForms() 
     { 
      foreach (var importMap in VarUsedEverywhere1.importMap.Where(m => m.sort != 0).OrderByDescending(m => Math.Abs(m.sort))) 
      { 
       if (importMap.sort > 0) 
       { 
        rows = rows.OrderBy(r => r[importMap.sourceHeaderKey]); 
       } 
      } 
      //Order all the values in VarUsedEverywhere 
      //Add to _errorMessages if operations do not succeed. 
     } 

EDITは、メソッドにコードを追加しました。

+1

あなたが表示したコードには3人のメンバーしかいません。私たちが完全なコードを見ることができない場合、何を示唆するべきかを理解するのは少し難しいです。あなたは[mcve]を投稿できますか? – Enigmativity

+0

これは設計上の質問ですが、私のコードが実際にどのように見えるのかがどうして重要なのかはっきりしません。 私はメソッドから実際のコードをいくつか含めることを試みました。 – Jeppe

+0

だからこそ、私は完全なコードを見たいのですが、私はそれが見えるまでどのように重要かどうか分からないからです。 – Enigmativity

答えて

2

変数の代わりにプロパティを持つクラスを作成し、このプロパティのコンテナを3つのクラスに渡すことができます。コードを減らす(クラスからすべてのフィールドを移動したため)将来的には、新しい変数を追加することに決めたら、このコンテナクラスに追加するだけで、他のすべてのクラスにはアクセスでき、複数のメソッドでこのパラメータを追加する必要はありません。

+0

私は、データコンテナを作成して渡すことが考えられています。これは、コードをもっときれいに見えるようにします。問題は、さまざまな変数に多くのデータがあり、そのデータが関数に必要かどうかにかかわらず、私がそれをすべて渡してしまうことです。 – Jeppe

+0

申し訳ありませんが、あなたのコードが見えない/わからないので、私はあなたを助けることができません。しかし、ほとんどの場合、懸念を適切に分離するために、少なくともグループ化(コンテナクラスをほとんど作成しない)または機能を小さなクラスに分割することは可能です。たとえば、Validatorクラスを作成してそこに移動し、コンストラクタのパラメータとしてDataManipulationクラスを渡すと、バリデータが設定できるいくつかのプロパティが公開されます。これはアイデアの一つに過ぎませんが、あなたのコードは分かりません。 –

関連する問題