【问题标题】:Is this physical collection class that contains only static methods an Anti-Pattern?这个仅包含静态方法的物理集合类是反模式吗?
【发布时间】:2010-03-15 23:39:05
【问题描述】:

我正在尝试确定是否应该在我正在使用的应用程序中继续使用当前模式,或者将其重构为其他内容。

我有一组基于 List 的通用基础的集合类。这些类具有公共构造函数,但仅包含返回集合的静态方法。它们看起来像这样:

public class UserObjCollection : BaseCollection<UserObj>
{
  public static UserObjCollection GetAllUserObj()
  {
    UserObjCollection obj = new UserObjCollection();
    obj.MapObjects(new UserObjDataService().GetAllUserObj());
    return obj;
  }
}

这是模式还是反模式?与直接工厂模式相比,它的优点是什么?

编辑:我倾向于删除这些物理集合,并将它们的静态方法移动到数据访问层 (UserObjDataService)。有很多对象类型,所以我需要将代码保存在不同的地方,但它们几乎都在数据层中有一个 1 对 1 的工厂对象。

【问题讨论】:

  • 这看起来更像是存储库模式。在您的场景中,拥有一个静态存储库很可能是可以接受的。

标签: c# design-patterns


【解决方案1】:

UserObjCollection 不会向BaseCollection&lt;UserObj&gt; 添加任何内容,两个类的对象是相同的,功能方面。最好删除UserObjCollection 并将GetAllUserObj() 放入BaseCollection&lt;T&gt;(工厂方法)。您也可以将GetAllUserObj() 放在单独的静态类中。我认为这里不需要抽象工厂模式,因为您没有创建不同的对象系列。

我之所以要删除UserObjCollection,是因为这个类可能会导致其他开发人员不加思索地添加它。如果后来发现UserObjCollection 实际上与BaseCollection&lt;UserObj&gt; 有很大不同,因此需要一个单独的类,那么您可以重新添加UserObjCollection

【讨论】:

    【解决方案2】:

    我倾向于调用这种工厂方法模式(可能不正确)。

    因为这些天我只做测试驱动开发,我倾向于避免它,因为它很难测试。在您的静态方法中,您创建了许多具体的类,因此您不能真正模拟这些对象中的任何一个。此外,您也不能模拟整个静态方法,这使得所有类都相当紧密地耦合。直接的工厂模式至少允许模拟整个工厂对象,这使得测试更加容易。

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 2020-12-17
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多