我正在寻找一些设计建议。例如,让我们说我想为CRUD操作创建一个抽象类。我有我继承该基类的具体实现。我的一些实现是只读的。有些人不允许删除。有些允许所有CRUD操作。但就其核心而言,所有这些方法在每个实现之间都是相同的。我希望其他调用这些类的类能够知道每个实现的功能。我能想到的选择是:
将所有代码和公共方法放入抽象类中。每个实现都存储一个列表,它可以做什么{创建,读取,更新}并公开一个公共方法,如AvailableMethods(),它将返回该列表。在这些方法的实现中,它检查该方法是否可用,如果不是则抛出异常。例如,当调用create()时,它会检查是否"创建"在可用方法列表中。出于多种原因,这样做似乎并不合适。对我来说,第一个问题是,我认为任何对象都不应该暴露出一种始终抛出异常的方法(假设它不是允许的方法)。
将所有实现放入抽象类中的受保护处理程序方法(handleCreate(),handleRead()等)。为每个方法创建接口,如ICanCreate有一个create()方法,ICanRead有一个read()方法。具体类实现所需的接口并声明调用处理程序的公共方法。调用类可以简单地询问类是否实现了所需的接口。这似乎是一个更好的解决方案,但我觉得有数百个对象,以及许多不同的组合,我将复制/粘贴数以千计的公共方法。有一点,我想要整合到更多的基类,如ReadOnly,NoDelete,FullAccess或类似的东西。这似乎没问题,但即使只有四个选择,也有很多组合。这只是一个例子。我可能有其他功能,其中有6或8种方法。
还有其他我忽视的设计方案吗?我用语言无关的方式询问,但是如果有更好的语言处理方法,我会使用PHP。
答案 0 :(得分:0)
从另一个角度看你的问题怎么样?而不是让这些类具有所有功能,每个功能只有一个类?
您可以将CRUD操作的责任和更多内容分离到自己的类中。该类只执行单个操作,即创建或更新并接受您的具体类。通过这种方式,您可以为每个操作使用单个方法,如果添加其他操作,则只需创建一个处理此操作的类。如果您有一个不允许此操作的课程,您可以先检查,或忽略它。