Delphi的最初的设计者们对现代OOP理论的贡献是巨大的。但是,在数据库编程方面,有几个问题,我四五年都不得起解:1、TDataSource的作用和必要性到底何在?许多第三方的GUI构件,包括Delphi自身带来的TDBChart、QuickReport等,为什么都直接用TDataSet? Delphi官方资料没有给出任何让人感觉TDataSource有真正用处的说明。2、DataModule除了放象TDatabase/TADOConnection之类的连接构件以外,到底有什么用途?如果真的按Borland所倡导的,把一切DataSet都放这里,一切DataSet的事件处理代码也都放这里,达到所谓的“业务规则和界面的分离“,试想这样的分离的后果:
    1)所有的数据访问窗口,都要和这个DataModule关联,OOP的封装性将被严重破坏,这样的窗口代码重用性何在?例如一个要设计一个通用的TFrame,实现一个基于数据库的TreeView,那么,所有使用这个Frame的Project都要包含一个名字相同、而且放置了同样、同名的DataSet和TDatabase(或其他连接构件),也就是说,你的Frame不可能做到“接口”和“实现”的分离。更严重的是,这样的Frame还对其使用者选择什么数据库访问方案施加了强制性。
    2)切DataSet的事件处理代码也都放这里,达到所谓的“业务规则和界面的分离”:在实际的编程中,DataSet的Event许多都和界面有关,这样DataModule就不得不引用所有的引用它的Form。
    3)大型项目,数以百计的DataSet/DataSource都一锅粥放在这里,你的代码甚至DataModule的设计期外观的可读性何在?本人粗浅意见:这些东西,都折射出Borland在探索分层计算(也就是“业务规则和界面的分离”)这个现代架构理念方面所走过的歧途。尤其是DataModule,干扰了许多人的正确思路,至今仍有数不清的Delphi新手试图在把Data Acess构件和“业务规则”封装在里面!所言乃一己浅薄见解,欢迎方家斧正!
批评意见请致[email protected]

解决方案 »

  1.   

    1)研究过VCL源码的人就会意识到TDataSource的重要性,如何实现DataWare控件和数据库的联动,完全是TDatasource的功劳。TDBChart、QuickReport都是一把抓的东西,不需要联动,当然无所谓了。
    2)TDataModule是轻量级的Form,主要是节省资源,也可以用TForm的。它的设计就是遵从数据与显示分离。实际上,要做到数据和显示分离并不是一件非常困难的事情,只要设计的好,数据和显示是完全可以分离的,当然不如混在一起方便。
      

  2.   

    关于第二个问题的一点观点:我觉得在一个工程中要让每一个form成为独立的是不可能的,因为无论怎样的情况,我们都需要form只见的通信,但是如何实现通信的则是保证form独立性的关键,举一个简单的例子,mainform和tableform,其实我们完全可以只让mainform访问datamodule,在通过mainform打开tableform的同时将tableform需要的datasource交给这个tableform,我想这样处理避灾tableform里加一些数据组件更具有独立性。关于数据控件的事件我觉得还是大部分和数据处理有关,而我常用的也是和处理有关的事件,希望搂主能举出几个与界面相关的事件在详细讨论。在大型项目中最好对datamodule也进行分组,我见过国外开发的一个项目,其中包含三个datamodule,也没有什么混乱的,其实如果命名好一些的话不会混乱的效果。我在已往的项目中通常只放两个query,一个用来查询,一个用来更新。不过使用table也有它的好处。
      

  3.   

    不怎么明白DataSource倒底有什么用,VS编程语言中的 DataSource一般就是 Recordset.可能Delphi中的界面与数据集的互动就是通过 DataSource进行的吧!
    关DataModule的用处:我一般是放连接与少量使用量较大的记录集。
      

  4.   

    我使用ADOExpress,一般在DM里放一个TADOConnection一个TADOCommand (name: cmdHelper)一个TADODataSet(name: adsHelper) (仅用于返回单行只读数据)若干全局公共变量(因为一般单元都引用DM,故比放在主窗口里放全局变量方便。)
      

  5.   

    业务规则 和 界面 的分离,根本不是说的把简单地DataSet和DataControl分离到两个Source Code文件里,然而Borland过去就是这么宣传的。我最初所言“这些东西,都折射出Borland在探索分层计算这个现代架构理念方面所走过的歧途”就是这个意思。当然MIDAS框架中,通过Provider将数据库访问组件分离到应用服务器里面,是真正意义上的多层体系。
      

  6.   

    各种不可视化控件放在一起?你不会动态建立吗?说明你还是不了解什么是OO。你还是个初级的delphi程序员而已。高级程序员,组件声明,然后动态建立,动态销毁。你怎么不深入研究一下呢。包括vcl代码?
    Tdatasource干了什么,你可以用debug来看看它到底干了什么。请不要随便提出质疑。就像对一些现在看起来毫无用处的行业提出质疑一样。比如当初人们对华罗庚教授他们的工作一样。它们真得毫无用处吗?深入了解之后再说话,在评论。如果你对TDataSource有什么质疑,请提出比它更好的方案。我们拭目以待!
      

  7.   

    唉,不知道如何是好。基础几乎一点都没有就妄加评论delphi不知道你对VCL了解多少。不再多说。
      

  8.   

    另外,一般的delphi好手几乎不用全局变量,甚至不用。请你注意。你所谓的在DataModule里面的混乱只是你在乱用一些优点而已。看电视去了。《大染坊》
      

  9.   

    如果你对TDataSource有什么质疑,请提出比它更好的方案。
    我们拭目以待!
    ===================================================
    看看原生ADO与其编程语言的方案吧!
    动态建立对像也不是什么高深的东东。
      

  10.   

    动态建立。当然不是高深的东西,但是是个好习惯而已。DataSource有什么优势,劣势都没有说明……我不知为什么这么说。
      

  11.   

    任何东西都存在阴阳两面,但是关键是如何合理的利用。有一点不顺心就全盘否定。我不知道borland的那些牛人他们吃的盐比我们吃的米还要多,他们开发的代码比我们多百倍。我不知道他们真的这么傻。让你如此的不尊重,你真正的了解了吗?看了你的话,我想起孩子们穿这所谓的“军装”舞刀弄枪也像当兵。学了一点皮毛就想批判一些东西的。唉,少说话,多干事!我真得不明白,放着好好的Vcl得代码不去研究。干吗弄这个?去找错的,不足的地方。你怎么不去看看vcl的魅力所在,它的一些处理手法是多么的优秀。叫Mfc自叹不如的地方?????????唉……只能叹息。。
      

  12.   

    Edsger Dijkstra经典言论    myan(原作)  1. 编程的艺术就是处理复杂性的艺术。2. 优秀的程序员很清楚自己的能力是有限的,所以他对待编程任务的态度是完全谦卑的,特别是,他们会象逃避瘟疫那样逃避 “聪明的技巧”。——1972年图灵奖演讲3. 计算机科学是应用数学最难的一个分支,所以如果你是一个蹩脚的数学家,最好留在原地,继续当你的数学家。4. 我们所使用的工具深刻地影响我们的思考习惯,从而也影响了我们的思考能力。5. 实际上如果一个程序员先学了BASIC,那就很难教会他好的编程技术了:作为一个可能的程序员,他们的神经已经错乱了,而且无法康复。6. 就语言的使用问题:根本不可能用一把钝斧子削好铅笔,而换成十把钝斧子会是事情变成大灾难。7. 简单是可靠的先决条件。
     楼顶的。我很喜欢这些话,孟岩大哥总结得很好。我送给你。请你明白这些话的含义。特别是第五条。嗬嗬,还好,我没有学会basic,包括visual basic。哈哈。其实第五条只是这位大师针对当时也就是几十年前乱用goto来说的。没有恶意。请你保持谦卑,不要尝试批判什么,等你明白了一些道理,你会知道你的话很幼稚。
      

  13.   

    程序无法用语句创建数据库对象,必须用控件,到现在C#差的太远了,难怪现在有很多人转到C#了能,连delphi8=delphi7+delphi.net,borland 已经准备放弃win32 了
      

  14.   

    to reallike(认真学习Cpp用Cpp考虑delphi)
    很不同意你的这句话:“他们吃的盐比我们吃的米还要多,他们开发的代码比我们多百倍。”肯定不对,他们吃得盐肯定没有我们吃的米多,他们开发的代码,肯定不止别我们多百倍。borland的的确都是牛人。
      

  15.   

    假如楼主先花一两年时间深入了解一下Delphi,可能就不会再发表这样的言论了,呵呵。
    楼上各位的回复都蛮有意思的。
    Borland真是软件界的一个“传奇”啊
    不过Borland牛人很多,M$却是最会挖别人的牛人的公司
      

  16.   

    TO 满腹精轮的 reallike(认真学习Cpp用Cpp考虑delphi) :1、有个老汉背着箩筐往返于太行、王屋二山,问:此老作甚?有生答:拿个放大镜看看不就得了?老汉在移! 年轻人:移山就只有用箩筐一个办法吗?
    2、“Tdatasource干了什么,你可以用debug来看看它到底干了什么。”请回答:你用过DEGUB看过JVM到底干的什么吗?你用过DEBUG看过CLR到底干了什么吗?
    3、世界其实比聪明的年轻人们想象的大。TO 其他人
    本不想作感情化的评论。本人保证:最后一次!