3

私は大規模な「マネージャー」クラスを持っていますが、それはやりすぎだと思いますが、それをより論理的なユニットに分割する方法がわかりません。

一般的に言えば、クラスは基本的に次のメソッドで構成されます。

クラスFooBarManager
{
  GetFooEntities();
  AddFooEntity(..);
  UpdateFooEntity(..);
  SubmitFooEntity(..);
  GetFooTypes();
  GetBarEntities();
}

Manager クラスは私のビジネス ロジックの一部であり、すべてのエンティティのすべての CRUD 操作を含むデータ アクセス レベルで別の「Manager」クラスのインスタンスを含みます。

私はデータ アクセス レイヤーからさまざまなエンティティを取得しているため、データ エンティティをビジネス エンティティに変換するために Manager クラスの外部にコンバーターを配置しています。

マネージャー クラスの理由は、単体テストを行うときに、各 "マネージャー" クラスをモックアウトできるようにしたかったからです。各マネージャー クラスは 1000 以上の loc になり、それぞれに 40 ~ 50 のメソッドが含まれています。私はそれらが非常に肥大化していると考えており、すべてのデータ アクセス ロジックを 1 つのクラスに入れるのは厄介だと感じています。どうすればいいですか?

それらを分割するにはどうすればよいですか?使用すべき特定のデザインパターンはありますか?

4

4 に答える 4

1

汎用でない限り、すべてのデータ アクセスを 1 つのクラスにまとめるべきではありません。まず、データ アクセス クラスを、オブジェクトごとに 1 つのマネージャー、または関連するオブジェクトのグループ (CompanyManager、CustomerManager など) に分割することから始めます。1 つの「神クラス」を介してマネージャーにアクセスする必要がある場合は、各マネージャーのインスタンスを使用できます。あなたの唯一の真のマネージャークラスで。

于 2008-09-30T16:36:51.533 に答える
1

あなたは神のオブジェクトのアンチパターンFooBarManagerによく似ています。

あなたのような状況では、Martin Fowler 著の Patterns of Enterprise Application Architecture を掘り下げることを検討してください。一見、Data Mapperを作成したいように見えます。ただし、必要に応じて十分なActive Recordのような代替手段を検討してください。

また、プラットフォームにORM ライブラリ/ソフトウェアを使用することも検討してください。正当な理由なしに独自のものを構築すると、これらのツールによって多かれ少なかれすでに解決されている多くの問題に直面するだけです.

于 2008-09-30T16:45:58.077 に答える
0
       / FooManager
Manager                  (derive from Manager)
       \ BarManager

自明であるべき

于 2008-09-30T16:40:39.137 に答える
0

コンポジションを使用することをお勧めします。マネージャーが行っている機能について考えてみましょう。単一の責任の線に沿ってそれらを分割します。FooBarManager のほとんどは、Foo および bar エンティティのコレクションのようです。したがって、少なくとも、FooBarManager からコレクション ロジックを分割します。

public class EntityCollection<T> : IList<T> 
 where T : BaseEntity
{ /* all management logic here */}
public class FooCollection : EntityCollection<foo> {}
public class BarCollection : EntityCollection<bar> {}
public class FooBarManager 
{ 
public FooCollection { /*...*/ } 
public BarCollection { /*...*/ } 
public FooBarManager() : this(new FooCollection(), new BarCollection()){}
public FooBarManager(FooCollection fc, BarCollection bc) { /*...*/ } 
}
于 2008-09-30T16:42:55.200 に答える