落魄青年,挨踢民工,已经转行
分类:
2007-10-19 15:12:28
把业务规则放进事件里面
一个问题我们必须意识到,当我们在Datamodule中把一个控件放进去的时候,这个控件的指针就是公共的(本来是published,是另外稍有点不同public,译者),其它引用了这个单元的方法都可以访问这个控件,有可能会避开我们潜心设计的访问方法,为了防备这一点,我们要尽可能地把业务规则放进数据集控件的事件中.
比如有一个地址类,其中有邮政编码一栏,假设业务规则规定这一栏必须不能为空,并且只能用正确的格式书写.这个地址对象本身如果仍被其它的对象引用的话,它也不能被删除.另外当一个新的地址增加时,应该提供一个默认值.我们最好将这些规则放到地址类的事件中.
使用约束
Delphi给我们一个新的地方来存放业务规则-约束.约束是当数据被提交到数据集的时候的一个检验. 检查约束包含了从数据字典或者远程数据库服务器导入的check constraint 的SQL语句.在Delphi企业级开发中,需要使用远程数据模块,而约束在远程数据模块中扮演一个很重要的角色.后面还会讲到.
约束被写在SQL中,当违反时能给自定义的信息.这里有一个Ttable对象的约束屏幕(译者在来源文章中没看到图片).
约束确保这个邮政编码不为空,如果为空,则不能post到数据集中.
数据验证
使用Tfield 对象来做数据验证.Tfield对象提供了一个理想的地方来验证数据和执行业务规则,因为所有的字段值的改变都必须通过Tfield对象来进行.当字段的值被改变时, OnValidate事件将被触发.如果你在OnValidate事件中写下”abort”的代码,那么改变将被放弃,当值一旦改变时,这个事件就被激发了,因此是一个提供验证绝好的地方.不过,还是会有些问题.举例来说,用户在OnValidate中输入一个非法值,OnValidate事件被调用了.你已经知道这个值是非法的了,然后通知用户放弃并退出编辑,但是实际上限制了用户离开这个字段.当另外一些字段的值在某个错误的范围时,当前这个字段的值是正确的,但是用户只能傻傻地定在当前字段,想去改变错误的字段都没法离开.你不能改变另外的字段,因为另外的字段依赖于当前的字段的值.
你知道这个值是错误的,你也通知了用户但是没法终止.用户没法回头更正这个问题,然后错误的值被存到了数据库中.
你知道这个值是错误的,你也通知了用户.在你post之前,你设置了一个全局变量来终止OnValidate事件.然后你再调用OnValidate事件.如果它发现验证通不过,给用户一个信息然后放弃post.这个方法提示用户一个正确的处理方法,让用户可以继续运行程序,在再次调用post前再验证.已经调用过验证码了,再次验证会带来一些性能上的影响.同样,当用户再次post时,被提示的还是第一次的信息,它们更正了这个问题又可能碰到另外类似的问题.
你知道这个值是错误的,你也通知了用户.然后你在这个类中设置了一个私有变量来表示你在post之前还要回头验证这个变量.这个方案是最好的,但是在所有的业务对象中都做到这一点要多做不少的工作.