【问题标题】:How to design classes with different combinations of common functionality如何设计具有不同通用功能组合的类
【发布时间】:2015-09-10 01:03:07
【问题描述】:

我正在寻找一些设计建议。例如,假设我想为 CRUD 操作创建一个抽象类。我有继承该基类的具体实现。我的一些实现是只读的。有些不允许删除。有些允许所有 CRUD 操作。但在它们的核心,所有这些方法在每个实现之间都是相同的。我希望其他调用这些类的类能够知道每个实现的能力。我能想到的选择是:

  1. 将所有代码和公共方法放入抽象类。每个实现都存储一个它可以做什么的列表 {create, read, update} 并公开一个像 AvailableMethods() 这样的公共方法,它将简单地返回该列表。在这些方法的实现中,它检查该方法是否可用,如果不可用则抛出异常。例如,当调用 create() 时,它会检查“create”是否在可用方法列表中。出于多种原因,这样做似乎不正确。首先,对我来说,我认为任何对象都不应该公开一个会持续抛出异常的方法(假设它不是允许的方法)。

  2. 将所有实现放入抽象类中受保护的处理程序方法(handleCreate()、handleRead() 等)中。为每个方法创建接口,例如 ICanCreate 有一个 create() 方法,ICanRead 有一个 read() 方法。具体类实现所需的接口并声明调用处理程序的公共方法。调用类可以简单地询问该类是否实现了所需的接口。这似乎是一个更好的解决方案,但我觉得有数百个对象和许多不同的组合,我将复制/粘贴一千个公共方法。有一点我想整合到更多的基类中,比如 ReadOnly、NoDelete、FullAccess 或类似的东西。这看起来不错,但即使只有四个选择,也有很多组合。这只是一个例子。我可能还有其他功能,其中有 6 或 8 个方法。

还有其他我忽略的设计选项吗?我以与语言无关的方式询问,但如果有任何语言特定的方法可以更好地处理这个问题,我正在使用 PHP。

【问题讨论】:

    标签: inheritance design-patterns interface


    【解决方案1】:

    换个角度看你的问题怎么样?不是让这些类拥有所有功能,而是每个功能只有一个类?

    您可以将 CRUD 操作和更多操作的责任与它自己的类分离。此类只会执行单个操作,即创建或更新并接受您的具体类。通过这种方式,您可以为每个操作使用一个方法,如果您添加另一个操作,您只需要创建一个处理此操作的类。而且如果你有一个类不允许这个操作,你可以先检查一下,或者忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多