我应该如何将大型和肿的班级拆分为较小的班级?

时间:2020-03-06 14:55:58  来源:igfitidea点击:

我有一个很大的'Manager'类,我认为它做的太多了,但是我不确定如何将其划分为更多的逻辑单元。

一般来说,该类基本上由以下方法组成:

class FooBarManager
{
  GetFooEntities();
  AddFooEntity(..);
  UpdateFooEntity(..);
  SubmitFooEntity(..);
  GetFooTypes();
  GetBarEntities();
}

Manager类是我的业务逻辑的一部分,并且在数据访问级别上包含另一个" Manager"类的实例,该类包含所有实体的所有CRUD操作。

我有来自数据访问层的不同实体,因此在Manager类外部有一个转换器,可将数据实体转换为业务实体。

使用经理类的原因是,当我进行单元测试时,我希望能够模拟出每个"经理"类。现在,每个管理器类的位置都超过1000个,并且每个类都包含40-50个方法。我认为它们非常膨胀,并且将所有数据访问逻辑都放在一个类中很尴尬。我应该怎么做?

我将如何拆分它们,应该使用任何特定的设计模式吗?

解决方案

除非是通用类,否则我们实际上不应该将所有数据访问都放在一个类中。首先,将每个对象或者相关对象组(即CompanyManager,CustomerManager等)的数据访问类拆分为一个管理器。如果我们需要通过一个"上帝类"访问管理器,则可以为每个管理器提供一个实例在我们真正的经理班上。

/ FooManager
Manager                  (derive from Manager)
       \ BarManager

应该是不言自明的

我建议使用合成。考虑一下经理正在执行的功能。按照单一职责划分它们。看起来大多数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) { /*...*/ } 
}

FooBarManager看起来很像God Object反模式。

在像我们这样的情况下,请考虑研究Martin Fowler撰写的《企业应用程序体系结构模式》。乍一看,我们似乎想创建一个数据映射器。但是考虑一下Active Records之类的替代方案,这些方案可能足以满足需求。

另外,请考虑为平台使用ORM库/软件。在没有充分理由的情况下构建自己的解决方案只会使我们面临许多已经被这些工具或者多或者少解决的问题。