数据库与面向对象是冤家
<DIV class=storytext><P>面向对象和数据库之间存在着矛盾。这正是我们学习了面向对象理论之后,信心百倍地要去做项目时,突然发现有很多问题的原因…… </P>
<P> 话说当年面向对象和数据库刚出道的时候,曾经引发过惊天动地的大讨论(当然,这里说的是关系型数据库,以下简称数据库)。两个阵营的人都试图说服对方,加入到自己的阵营里来(传说是都说了,你别做了那个了,没发展)。经过车轮式讨论,也没得到共识,只好分道扬镳了。。。。。。</P>
<P>
<P><BR>
<P>面向对象和数据库之间存在着矛盾。这正是我们学习了面向对象理论之后,信心百倍地要去做项目时,突然发现有很多问题的原因……</P>
<P> 话说当年面向对象和数据库刚出道的时候,曾经引发过惊天动地的大讨论(当然,这里说的是关系型数据库,以下简称数据库)。两个阵营的人都试图说服对方,加入到自己的阵营里来(传说是都说了,你别做了那个了,没发展)。经过车轮式讨论,也没得到共识,只好分道扬镳了。</P>
<P> 虽然,无法考证这个传说是不是真的,但确实,面向对象和数据库之间存在着矛盾。这正是我们学习了面向对象理论之后,信心百倍地要去做项目时,突然发现有很多问题的原因。</P>
<P> 要是世界上只有面向对象,或则只有数据库,那该多好啊?但这只是奢望罢了。既然矛盾并共存着,那就只能取长补短了。</P>
<P> 让面向对象和数据库,好好合作</P>
<P> 大家有没有觉得,类图和ER图画出来之后,是不是很像?矛盾就在这里,数据库阵营的人认为,面向对象做得是在内存中建立一个新的数据库,浪费了资源。而面向对象阵营的人认为面向对象更符合人的思维模式、可以开发出更健壮的系统。</P>
<P> 先看一下面向对象和数据库的优点吧。面向对象的优点在于模块化和处理复杂的业务逻辑,而数据库的优点在于数据存储、查询、统计。</P>
<P> 解决一个问题,不是只有一种方法,不能说哪一个方法是万能药。每一个方法都有它存在的意义。</P>
<P> 面向对象和数据库各有其特长,何不让它们发挥各自的特长呢?</P>
<P> 面向对象,你就处理复杂的业务逻辑~</P>
<P> 数据库,你就处理数据的查询、统计、简单的业务逻辑~</P>
<P> 好,首先大的方向已经明确了,但开始做项目之前还要明确以下几点,当需要时,才加载 ,类有属性和方法,下面定义了一个客户类,</P>
<P align=center>
<TABLE cellSpacing=1 cellPadding=0 width="80%" bgColor=#cccccc>
<TBODY>
<TR>
<TD bgColor=#f2f2f2><PRE>// 客户类 <BR> class Customer <BR> { <BR> Public int Id; //客户ID <BR> Public String Name;//客户姓名 <BR> // 取客户的销售额 <BR> public bool GetSaleAmount(); <BR> }</PRE></TD></TR></TBODY></TABLE></P>
<P> 我现在要查询客户的销售额,那么Id和Name对我来说是没有意义的。如果不是数据库编程,这都是无关紧要的,但数据库编程中,属性的数据保存在数据库里,所以每生成一个对象,都要去查询数据库的话,系统的性能肯定大打折扣。看一下修改后的类</P>
<P align=center>
<TABLE cellSpacing=1 cellPadding=0 width="80%" bgColor=#cccccc>
<TBODY>
<TR>
<TD bgColor=#f2f2f2><PRE>// 客户类 <BR> class Customer <BR> { <BR> // 取客户信息 <BR> public DataSet GetInfo (); <BR> // 取客户的销售额 <BR> public bool GetSaleAmount(); <BR> }</PRE></TD></TR></TBODY></TABLE></P>
<P> 类中把Id和Name属性去掉,然后加了一个GetInfo方法。现在好了,生成客户对象,不会进行数据库查询,当需要客户信息时,可以调用GetInfo方法来获得。这种方法看起来,不像是面向对象的,因为它没有属性,面向对象是思想、理论,理论要联系实际,根据实际情况取舍一些东西是无可厚非的,况且,这样做也不会丢掉面向对象的优点(还可以用,继承、多态等等)。</P>
<P> 用什么来传递数据 ,编程工具都有数据库控件,比如。NET有DataSet,Delphi有TTable、TQuery等等。那,是使用数据库控件还是使用对象?应该是从它们的优点去出发来决定用哪一个。对象结构简单,操作起来非常方便,而且直观。数据库控件虽然结构复杂,操作不方便,但处理大量数据是它的优势。所以传递单条记录时使用对象,传递一组记录的时候使用数据库控件是一个不错的方法。</P>
<P> 当然传递一组记录时也可以用对象,把对象装在容器里,然后传递。但要考虑一下几点,只是为了显示吗?那就大可不必,因为它的功能只是显示,数据库控件可以做得很好,而且不需要额外的工作。要用这些对象做统计操作吗?那就需要考虑效率问题了,数据传输和对象生成,需要消耗更多的资源。而且统计是数据库的强项,为什么放着能干的人,不用呢?</P>
<P> 一般常用的业务逻辑类编写方式</P>
<P> 用类把你的函数封装起来</P>
<P> 方法:声明一个static类,然后把函数放到类里。不要说这个太不像面向对象了,类是一个模块,能准确定义一个类是面向对象中最困难的事情。</P>
<P> 数据处理:手写SQL</P>
<P> 数据容器:编程工具提供的数据库控件。</P>
<P align=center>
<TABLE cellSpacing=1 cellPadding=0 width="80%" bgColor=#cccccc>
<TBODY>
<TR>
<TD bgColor=#f2f2f2><PRE>// 客户类 <BR> static class Customer <BR> { <BR> // 输入客户信息 <BR> static public bool Insert(int Id,int Name) <BR> { <BR> } <BR> // 更新客户信息 <BR> static public bool Update(int Id,int Name) <BR> { <BR> } <BR> //删除客户信息 <BR> static public bool Delete(int Id) <BR> { <BR> } <BR> //获得客户信息 <BR> static public DataSet GetInfo(int Id) <BR> { <BR> } <BR> //获得客户列表 <BR> public DataSet GetList() <BR> { <BR> } <BR> }</PRE></TD></TR></TBODY></TABLE></P>
<P> 优点</P>
<P> - 对面向对象理论方面要求不高,通过短时间学习,就可以掌握</P>
<P> - 代码简单易懂</P>
<P> - 代码效率高</P>
<P> 缺点</P>
<P> - 不能充分发挥面向对象的特点</P>
<P> - Update和Insert把数据库字段作为参数,当添加字段或删除字段时,需要修改函数。</P>
<P>
<P>发挥面向对象和数据库的特点</P>
<P> 方法:声明一个Entity类和一个业务逻辑类</P>
<P> 数据处理:手写SQL</P>
<P> 数据容器:插入、更新 、传递单条记录使用Entity对象,一组记录使用数据库控件</P>
<P align=center>
<TABLE cellSpacing=1 cellPadding=0 width="80%" bgColor=#cccccc>
<TBODY>
<TR>
<TD bgColor=#f2f2f2><PRE>// 客户Entity <BR> class CustomerEntity <BR> { <BR> public int Id; <BR> public string Name; <BR> } <BR> // 客户类 <BR> class Customer <BR> { <BR> *** int Id; <BR> //构造 <BR> public Customer(int Id) <BR> { <BR> this.Id = Id; <BR> } <BR> // 输入客户信息 <BR> public bool Insert(CustomerEntity CustEntity) <BR> { <BR> } <BR> // 更新客户信息 <BR> public bool Update(CustomerEntity CustEntity) <BR> { <BR> } <BR> //删除客户信息 <BR> public bool Delete() <BR> { <BR> } <BR> //获得客户信息 <BR> public CustomerEntity GetInfo() <BR> { <BR> } <BR> //获得客户列表 <BR> public DataSet GetList() <BR> { <BR> } <BR> }</PRE></TD></TR></TBODY></TABLE></P>
<P> 优点</P>
<P> - 能发挥面向对象和数据库各自的特点</P>
<P> - 代码效率高</P>
<P> 缺点</P>
<P> - 需要比较全面的面向对象理论</P>
<P> - 使用了Entity类,需要自动生成工具</P>
<P> 使用O/R Mapping 工具</P>
<P> 方法:使用O/R Mapping工具</P>
<P> 数据处理:O/R Mapping 工具自动处理</P>
<P> 数据容器:对象</P>
<P align=center>
<TABLE cellSpacing=1 cellPadding=0 width="80%" bgColor=#cccccc>
<TBODY>
<TR>
<TD bgColor=#f2f2f2><PRE>// 客户类 <BR> class Customer <BR> { <BR> public int Id; <BR> public string Name; <BR> // 输入客户信息 <BR> public bool Insert(CustomerEntity CustEntity) <BR> { <BR> } <BR> // 更新客户信息 <BR> public bool Update(CustomerEntity CustEntity) <BR> { <BR> } <BR> //删除客户信息 <BR> public bool Delete() <BR> { <BR> } <BR> //获得客户信息 <BR> public CustomerEntity GetInfo() <BR> { <BR> } <BR> //获得客户列表 <BR> public IList GetList() <BR> { <BR> } <BR> } </PRE></TD></TR></TBODY></TABLE></P>
<P> 优点</P>
<P> - 能发挥面向对象特点</P>
<P> - 可以自动把对象模型转换到数据模型</P>
<P> - 能自动处理,简单的CURD</P>
<P> 缺点</P>
<P> - 需要很高的能力和耐心</P>
<P> - 流行的O/R Mapping 工具都是开源出来的,没有保障</P>
<P> - 还不是很完善,存在不可预测的危险</P>
<P> - 对于处理复杂的对象关系,配置复杂</P>
<P> - 需要额外学习O/R Mapping 方面的知识</P>
<P> 那到底该用什么样的方式?</P>
<P> 采用什么样的方式,实际上说,主要还是在人,而不是在技术。确定使用哪种方式之前,可以考虑以下几个问题,</P>
<P> - 使用它的目的是什么?</P>
<P> - 对它了如指掌吗?如果出现问题,能马上解决吗?</P>
<P> - 它简单吗?初学的人需要多长时间,才能掌握?</P>
<P> - 跟所有人达成共识了吗?有没有抵触的人?</P>
<P> 不要让项目成为你练手的试验品,不要让底下的人每天处理80%的工具问题,只处理20%的业务逻辑。业务逻辑才是客户需要的东西。</P>
<P></P></DIV> thx a lot
页:
[1]