界面模块和数据处理模块分开,但我常常有些疑惑,到底是把所有数据处理全部都封装到数据模块里面,还是程序启动后把数据都传递到界面模块,仍由界面模块来处理,直至程序即将结束,才把数据传回到数据模块里面
用第一种方法,接口很简单,就是一个读一个写,而且很灵活,能够适应不同的界面模块,因为跟界面相关的数据处理都有界面模块来处理,而且VCL不少控件都有TOBJECT属性,不需要对数据进行跟踪处理,但缺陷是没有将全部数据处理都封装,界面模块对数据处理的工作量仍相当大
用第二是方法,接口比较多,界面模块数据一变动,要立即在数据模块进行处理,而且更换了界面,不少接口要重写,另外数据模块有不少多余的代码,而且相当繁琐。
没有看懂的朋友,我举个简单浅显的例子
比如用一个stringgrid读入N条记录类型到表格中
第一种方式我是在程序启动后,就把这些记录类型传入到stringgrid的每行的TOBJECT中,然后无论界面部分对这些记录删除还是增加,我只要在程序结束前,把stringgrid的每行TOBJECT传回到数据模块就行了
第二种方式界面不处理任何数据,每增加1条或者删除1条记录,我就要调用数据模块的接口在数据模块中进行处理,在数据模块中要用一个数组或者TstringS来管理这些记录类型。
到底那一种跟符合界面和代码分离?

解决方案 »

  1.   

    通用的处理可以解决绝大多数的问题,对于一些特别复杂或特殊的应用开始的时候可能用通用的方式解决不了,
    就使用一功能实现的方式解决,然后回过头来进行抽象和整理.一般的应用都是以数据库为中心,界面也比较简单,数据层次可以都看成树和表两种,更一步说表也可以看成是树的一个特例.和数据库操作的部分当成持久层,业务数据都向持久层请求和提交数据.持久层的每个方法的参数和反回值一般变化莫化较少,方法的执行其实就是执行一个SQL语句,这个SQL语句可以保存在外部文本文件中.业务对象数据根据业务情况化分出层次,有的对象在系统中创建一个就可以了,直到系统关闭也不用FREE,有的业务
    数据因为数量从多,则只在操作的时候创建,操作完成后就FREE一个系统的所有业务对象可以成为一棵树.只是树上第个节点代表不同的业务对象.第个业务对象有自己的属性,也可以看成是字段. 所以所有的业务对象都可以这样定义.
    TOpObject=class
      FValues:TStrings;
      FChildList:TList;
    end;
    FValues保存这个对象的属性值
    FChildList保存这个业务对象的子对象.在从持久层得到业务对象数据的时候仅要将值写到FValues就可以了.
    界面上的树的显示在这种业务对象的组织下比较容易,表的显示默认是显示FValues的所有字段.但可以让用户
    编辑显示那些字段.业务对象如果单独编辑的话,如显示在象表单一样的一个个独立控件上.这个窗体则为每个业务对象独立设计.
    实现 表单To业务对象,业务对象To表单这两个方法.持久层对业务对象的操作一般就是 读子节点
    保存业务对象的一个字段值
    新建一个业务对象
    删除业务对象原则就是尽量的减少耦合,对业务相同的处理则只在一个处理方式下运行.不重复创建,读取.不写重复的代码.