正确看待数据感知控件(原创,欢迎讨论)(0分)

  • 主题发起人 主题发起人 Traveller
  • 开始时间 开始时间
T

Traveller

Unregistered / Unconfirmed
GUEST, unregistred user!
提要:本文主要论述MIDAS对数据感知控件缺点的弥补,以及数据感知控件体系的合理性。
什么是数据感知控件
数据感知控件就是能够“自动”在数据库与用户之间交换数据的控件。它能够将用户的输入存入数据表,也能接收数据表的变更通知并刷新显示。
数据感知与设计模式
从设计模式的角度讲,数据感知控件主要应用的是中介者(Mediator)模式和观察者(Observer)模式。
中介者:
如果没有数据集的存在,用户对某些控件的值进行修改之后就必须负责更新其他所有相关控件,这个时候,控件之间的关联复杂度是n*n;通过引入数据集,使所有控件都只需要知道数据集的存在,而不需要知道其他控件,这样控件之间的耦合度就降低到n。
观察者:
数据集是实体数据,而控件都是观察者,计算、业务逻辑校验与存储由数据集来完成,而显示和格式化以及基本的输入校验则由数据感知控件来完成。数据敏感控件作为观察者注册到数据集的通知列表中,在数据变化的时候数据集就根据注册进来的通知列表逐个通知观察者刷新显示。
数据感知与OO
数据显示与输入两个职责可以分成:读取数据库、数据加工、格式化、接收输入、缓存、字段有效性校验、记录有效性校验、刷新显示、写入数据库等一系列操作,在纯OO方式下,需要一系列的类(这里最少得3个类才够)来配合完成,而传统的不用数据感知控件的编程方式下,这些操作其实全都在窗体里或者一个单独的单元里面写代码,这种方式完全是过程式的编码,最多只能说基于对象,离面向对象还有很大的距离。各种操作全都写在一个类里面,内聚度很差。
根据通用职责分配模式(GRASP),读取、缓冲和写入数据库应该分配给一个对象(具体应用中,缓冲也可以单独分配一个对象);校验应该分配给一个或两个对象;格式化、接受输入、显示需要分配给一个对象;数据加工(业务逻辑)需要分配给一个对象。
而在数据感知控件体系中:读取、写入是由数据集来完成的;缓冲是由内存表(比如ClientDataset、kbMemTable等)来完成的;数据校验作为数据集的一个事件来完成(复杂系统中必须改进为单独的类);格式化、接收输入、显示则由数据感知控件来完成;数据加工没有提供具体支持,不过这本来就属于业务逻辑的范畴,控件体系中并非必须提供。
数据感知与复用
如果和Frame配合使用,则数据感知控件的复用程度是非常高的,一个信息表单可以作为一个元素进行复用,它能够完成数据显示和数据输入两项主要功能,而通过事件,可以对具体的行为进行定制。
数据感知的优点
数据感知的优点就是不用写太多对状态进行控制和对数据进行解释的代码,这些都可以由数据感知控件来完成,我们所要写的就是数据校验和数据加工两个和业务逻辑紧密相关的部分。而Delphi也提供了灵活性,让你可以自由掌握使用事件还是使用单独的类来完成,不过,我倾向于写单独的类,这样才够“专业”。
数据感知的缺点
数据感知的缺点其实主要是由于传统的数据感知控件体系中缺乏缓冲功能的导致的,表现在:1.直接连接数据库导致支持的用户数量有限;2.修改数据之后就会自动存入数据库,缺乏进行自己处理的机会;3.受数据库结构限制,往往无法提供必要的灵活性。
而基于MIDAS技术的ClientDataset控件提供了数据缓冲功能,可以先将数据下载到客户端、断开连接、修改、批量提交,这样问题1已经不复存在。在ClientDataset将数据提交到物理数据库之前,程序有机会对ClientDataset中缓冲的数据进行处理,并且可以自由选择是更新到数据库还是暂时存储在本地(即公文包),问题2也得到了解决;ClientDataset可以作为一个完全不连接物理数据库的自定义内存数据集,相当于在内存中提供了一个通用的结构来缓冲数据,应用程序可以从数据库读取数据,并且进行加工,然后存储到这个内存表中,而由于这个内存表也是数据集,数据感知控件并不需要知道他们之间的差别,当数据处理逻辑发生变化的时候,对数据感知控件完全影响,有效的阻止了变更的扩散。
数据感知的前景及应用
事实上,在C#等新型的语言及其类库中,数据感知是最受欢迎的特性之一,而基于Java的B/S结构很少有数据感知控件是因为系统的分布性很高,而浏览器的客户端又无法提供足够强大的功能,这也是B/S结构不适合进行大量数据录入的重要原因之一。
 
其实,要使用数据感知并克服你所指的数据感知的缺点,并非只有Midas技术。
用ADOExpress系统的数据集及工作在缓冲更新状态也可以。
BDE也同样?但我未试过。
 
另外,我认为有些贴子把OO与数据感知完全对立的提法也不恰当。数据感知其实是
OO设计的一种精妙体现!
 
好帖子!
 
ADO以及ADO.NET的设计思想其实和MIDAS很相似,功能也差不多,不过ADOExpress不知道有没有类似MIDAS的提交前进行自己的处理的机会,对ADOExpress我不熟。
 
有了数据感知,Delphi的数据库功能才得以胜过VC,和PB等数据库工具相提并论
数据感知是Delphi数据库开发的重要基础,有了它,一切才那么简单
 
请教各位,数据感知控件有时因为类型问题报英文错误,各位怎么解决,
汉化错误?还是自己写数据感知控件
 
具体是什么错误呢?
一般来说这两种方案都可以,不过如果报错首先应该查查是否是逻辑存在问题。
 
譬如,数据库是10位字符串
然后用户输入12位,这是数据感知控件会报英文错误,来说明输入字符串太长了
或者,在整数字段,打'E10',因为数据感知控件支持科学计数法输入,然后因为
不是整数,报英文错误
 
自己封装或者汉化数据控件即可,而且数据感知控件会自动取得类型、长度等数据,从而在输入的时候就进行了限定,比如整型输入框就是不允许输入字母的。而且你还可以对它的EditFormat进行限定,达到类似MaskEdit的效果。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
D
回复
0
查看
926
DelphiTeacher的专栏
D
后退
顶部