我已经在 Yii 框架上开发了一段时间(4 个月),到目前为止,我遇到了一些关于 MVC 的问题,我想与经验丰富的开发人员分享。我将通过列出它们的复杂程度来呈现这些问题。
[Level 1] CR(创建更新)表格。首先,我们有很多表格。每个表单本身都是一个模型,因此每个表单都有一些验证规则、一些属性和一些要对属性执行的操作。在很多情况下,这些表单中的每一个都使用单个活动记录对象在数据库中更新和创建记录。
-> 所以在这种复杂程度下,表单必须
打开时,
能够以人性化的方式显示来自数据库的数据库友好数据
能够显示所有具有活动记录对象属性的表单字段。从 db 表中添加、删除、更改列必须影响表单的显示。
保存时,能够在获取数据之前将对人类友好的数据格式化为对数据库友好的数据
验证时,能够执行活动记录对象强制执行的基本验证,它还必须执行其他验证来满足某些业务规则。
当验证失败时,能够回滚对属性所做的更改以及对数据库所做的更改,并向用户显示他们最初输入的数据。
[级别 2] 扩展 CR 表格。一种可以同时从不同表创建/更新记录的表单。不仅如此,表单是否会创建/更新其记录有时可能取决于其他条件(更多业务规则),因此表单有时可以更新表 A、B 但不能更新 D 中的记录,有时会更新 A 中的记录,D 但不是 B -> 所以在这种复杂程度下,我们看到一个表单必须:
能够满足[1级]
能够有条件地创建/更新某些记录,有条件地创建/更新某些记录的某些列。
[Level 3] 模型树。表单在应用程序中的角色,在许多方面,是一个让用户与您的应用程序交互的端口。为了满足请求,此端口将与许多其他对象交互,而这些对象又与更多对象交互。其中一些对象可以被视为模型。Active Record 是一个模型,但 Mailer 也可以是一个模型,RobotArm 也是如此。这些模型相互使用以满足用户的要求。每个模型都可以执行自己的操作,并且整个树必须能够回滚在错误/失败情况下所做的任何更改。
有没有人遇到或能够解决这些问题?
我想出了很多东西,比如将模型属性封装在 ModelAttribute 对象中,以解决它们在客户端、服务器和数据库层中的存在问题。
我还认为我们应该给模型树一个 Observer 来观察并通知观察到的模型在发生错误时回滚更改。但是如果可以存在多个观察者,如果一个节点使用其父的观察者但给它的孩子另一个观察者怎么办。
工程师、开发人员、Rails、Yii、Zend、ASP、JavaEE,任何 MVC 人,为了科学,请加入这个讨论。
--更新 teresko 的回复: ---
@teresko 我实际上打算将服务合并到工作单元内的执行中,并且让工作单元不用担心新/更新/删除。工作单元内的每个对象都将对其状态负责,并需要实现自己的 commit() 和 rollback()。一旦发生错误,工作单元将从最新注册的对象回滚到最旧的注册对象的所有更改,因为我们不仅处理数据库,还可以有邮件程序、发布者等。否则,树执行成功,我们从最旧的注册对象调用 commit() 到最新的注册对象。这样,邮件程序可以保存邮件并在提交时发送。
使用数据映射器是个好主意,但我们仍然必须确保 db 中的列与数据映射器和域对象匹配。此外,扩展的 CR 表单或具有依赖于其他模型的属性的模型必须在验证和数据类型方面匹配它们的属性。那么也许一个属性可以是一个对象并从一个模型运送到另一个模型?一个属性还可以判断它是否被修改,应该对其执行什么验证,以及它如何对人类友好、对应用程序友好和对数据库友好。对 db 模式的任何更新都会影响此属性,从而引发异常,需要开发人员对系统进行更改以满足此更改。