2009-06-09 73 views
0

我有一个类表示表中的一行。我想添加一个操作行中数据的函数。我应该在哪里添加该功能?我的方法应该去哪里

1)在班级里面,因为它和班级有关 2)在班级以外的班级里有单独的辅助班吗?

在过去,我会一直选择数字1.我开始认为数字2是一个更好的答案,因为它将逻辑分隔为它自己的封装类,并降低了数据类的复杂性。我认为数据类应尽可能保持裸露,并且只包含完全没有逻辑的数据成员。

什么是最敏捷/最好的方式来做到这一点?

回答

2

单一责任原则被称为“应该只有一个对象改变的原因。”使用选项1,对象可能发生变化的原因有两个:可以更改存储在对象中的数据,也可以更改为其他数据库系统(例如mySQL到PostgrSQL)。

当然,就像所有事情一样,这是一个折衷。把所有的代码放在一个地方是有好处的。如果将来不太可能会转用不同的RDBMS,那么将所有内容合并到一个类中可能是一个好的呼叫。但是,如果您确实希望将来切换到不同的数据库 - 或者甚至支持多个数据库后端 - 那么您最好将持久性放在单独的类中。

+1

除非你正在开发一个可重用的框架,不用担心改变数据库系统。大多数应用程序永远不会改变数据库系统,因此这通常是浪费的工作。当然 ,如果你是* *工作,其他人将无法预料的环境中使用可重复使用的框架,那么是的,这是有道理的花费实现这个时间。 – 2009-06-09 18:22:09

3

它取决于您是否更喜欢“活动记录”或“存储库”。我不确定是否有正确的答案,只是在您的代码库中有意义。我还会考虑其余代码的设计,以便如何设计这一点,因为一致性与优秀设计一样重要。

2

在纯粹的MVC意义上,2号是你最好的选择。创建一个数据模型并保持它不受所有实现逻辑的影响。这将允许您跨应用程序潜在地重新使用该模型。然后控制器可以容纳操纵数据的特定于应用程序的执行逻辑。

0

取决于功能是什么。一般而言,类的要点是封装函数和数据。

如果该函数特定于行类中保存的数据的类型,并且行类是通用的,那么您可以从行中继承子类并将该函数粘在那里。

帮助程序类对于打破类的复杂性非常有用,但您应该确保帮助程序与类的角色明确定义,以便将来的维护不会混淆该合同。

1

正确答案是“取决于”; “操纵行中的数据”可以证明任何一个答案是合理的。

就分离问题而言,您需要确定此函数操纵的抽象。它是数据库中一行的抽象吗?把它放在那个班上。它是数据模型中的对象,是根据数据库中的一行来实现的吗?把它放在那个班上。更一般地说,你应该把函数放在它们所应用的抽象层次上,这非常依赖于你的总体设计。