我有一个表示表中一行的类。我想添加一个操作行中数据的函数。我应该在哪里添加功能?
1)在课堂内因为它与班级有关 2)在一个单独的帮助类中的课外?
在过去,我总是会选择数字1.我开始认为数字2是一个更好的答案,因为它将逻辑分离到它自己的封装类中,并降低了数据类的复杂性。我认为数据类应该尽可能地保留,并且只包含绝对没有逻辑的数据成员。
最敏捷/最好的方法是什么?
答案 0 :(得分:3)
这取决于您是否更喜欢“活动记录”或“存储库”。我不确定是否有正确的答案,只是在你的代码库中有意义的。我还会考虑设计其余代码的设计,因为一致性和良好的设计一样重要。
答案 1 :(得分:2)
在纯粹的MVC意义上,2号是你最好的选择。创建一个数据模型,并将其保留为所有实现逻辑。这将允许您跨应用程序重用模型。然后,Controller可以存放操作数据的特定于应用程序的实现逻辑。
答案 2 :(得分:2)
单一责任原则已被陈述为“只有一个理由可以改变一个对象”。使用选项1,对象可以更改有两个原因:您可以更改对象中存储的数据,或者您可以更改为其他数据库系统(例如mySQL到PostgrSQL)。
当然,就像所有事情一样,这是一种权衡。将所有代码放在一个地方有一些好处。如果您将来不太可能切换到不同的RDBMS,那么将所有内容组合到一个类中可能是一个很好的调用。
但是如果您确实希望将来切换到不同的数据库 - 甚至支持多个数据库后端 - 那么您可能最好将持久性放在单独的类中。
答案 3 :(得分:1)
正确的答案是“它取决于”; “操纵行中的数据”可以证明答案是正确的。
在关注点分离方面,您需要确定此函数操作的抽象。它是数据库中一行的抽象吗?把它放在那个班里。它是数据模型中的对象是按照数据库中的行实现的吗?把它放在那个班里。
更一般地说,您应该将函数放在它们应用的抽象级别,这在很大程度上取决于您的整体设计。
答案 4 :(得分:0)
取决于功能是什么。一般来说,类的意思是封装函数和数据。
如果该函数特定于行类中保存的数据类型,并且行类是通用的,那么您可以从该行继承并将该函数粘贴在那里。
帮助程序类对于分解类的复杂性非常有用,但是您应该确保帮助程序与类的作用是明确定义的,以便将来的维护不会使该合同变得混乱。