如何使我的模型尽可能DRY(相同的表联接和字段选择)


How to make my model as DRY as possible (identical table joins and field selections)

在我的模型中,我通常至少有两个'get'例程$model->get_one()$model->get_where(),我的模型通常扩展一个处理数据库记录版本的version_model,并具有类似get_record_history()的例程。

所有这些例程都选择相同的数据库字段并执行相同的表联接。因此,为了使连接DRY,我在每个模型$model->create_joins()中定义了一个例程,然后由$model->get()和上面提到的其他模型使用。

我也在考虑添加$model->select_fields()以使字段选择DRY,但我想我应该在这里发帖,看看其他人是如何处理的,或者是否有更好的方法?

编辑:问题是:对于在我的模型中选择具有不同条件的相同数据的例程中不重复表联接,是否有比上述方法更好的方法。这是像PDO这样的库所处理的吗?

关于这一点,有一条经验法则,称为"三条规则",由Martin Fowler介绍,并归因于Don Roberts。来自维基百科:

它规定代码可以复制一次,但当同一代码复制三次时,应该将其提取到一个新过程中。

在应用DRY原理时很容易迷失方向,抽象出您能找到的所有内容,从而导致应用程序过于复杂。

在进行抽象以应用DRY时,最好考虑成本/效益比。

抽象公共逻辑需要时间,并使代码更加复杂(在某种程度上)。但结果是,您得到了更干净的代码。

如果你正在开发一个不需要维护的快速修复程序,只需复制粘贴即可。但如果你正在构建一个需要维护的复杂应用程序,请尝试进行必要的抽象,因为这可能会在未来为你节省更多时间。

进一步阅读:

你不需要它。

KISS原则。

DRY也适用于设计,但您写道,您的模型有时会从关心版本控制的类扩展而来。

也许您应该将处理持久性和版本控制的所有内容从模型中移除,这样您就可以创建其他可以处理这一问题的对象,这样您的代码就更干燥了。