delphi面向对象编程的思考与困惑,难难难(300分)

  • 主题发起人 polisnew
  • 开始时间
P

polisnew

Unregistered / Unconfirmed
GUEST, unregistred user!
1、数据库封装问题
DELPHI和其他RAD工具都没有记录对象,如一个组织机构表只能描述为一个DATASET,
实际上单一个机构就是一个对象,应该有自己的方法事件,还会有自己的记录对象集如
(机构中的人员),特别是这种嵌套对企业级的系统用DELPHI主从表来解决效率是个大
问题,我想了很久如果用面向对象来分析DELPHI提供的从界面到后台一整套数据库解决
方案除去数据访问组件外都用处不大。
2、三层架构的状态问题
大家都知道中间层最好是无状态,可是为了保证系统配置和便于维护一些对象又要放
到中间层,这样就出现两难,如有一个PERSON对象SAY方法今后可能改变想将它放到中
间层,为了无状态其NAME,SEX都不能保存,以便OBJECT POOLING,这样我每次使用就必
须传递一个PERSONID去调用其属性和方法(太别扭),而且PERSON对象必须每次到数据
库中现取数据,效率太低。并且还不能实现PERSON.CHILDREN来返回其孩子集(因为中间
层无状态,无法根据接口定位,只能根据PERSONID)只能设计一个PERSON.GETCHILDRENIDS
方法,这样要想客户端自然一点使用PERSON对象必须还要在客户端建立一个CLIENT_PERSON
来封装中间层的PERSON,天哪这个系统什么时候熬到头啊。
3、客户属性定制问题
一个商业化系统不可能适合每一个客户,对某个对象客户可能有自己的特别的描述,如人
在国企有政治面貌,外企就不一定有,这样系统编制时还必须留一个ORTHER_PROPERTIS用一
个通用的数据类型存储(一般是比较长的字符串),可如果客户要求的是图片怎么办,如果
又是一个对象怎么办,难道每一次扩展都需要重新继承一个新对象来二次开发吗?
我实在无法想出如何同时使用现在面向数据库编程的便捷和面向对象的种种好处的办法,
谁来救救我。
 
关于1.数据库封装问题,假设(其实现在就是)用的是关系数据库,那么主从表是不可避免的,
同时数据库的设计与实施是对性能影响最大的,delphi在这方面帮不了我们什么
只要是使用关系数据库,那么同时使用面向对象编程就必须作一些折中,不可能实现整套的
OOP解决方案
另外就是现在面向对象数据库只在起步阶段,还有很多问题,因此delphi不会对此作什么支持
 
什么东西都不可能绝对的,有时也需要一些非面向对象的东西的.
 
to polisnew:
对你说的第二点深有同感,我现在APPSERVER和CLIENT两端都实现对象和
对象管理机制,实在是烦。
 
我是学机械后改学编程的,所以常常不用常态来考虑问题。
VC用了二年,现因工作原因到大富翁上来换换脑筋。所以常常不用常态来考虑问题。
你提出这个问题,说明你对于delphi有了相当的了解,不过有可能形而上学了。
举个机械设计上的例子,也许能帮助你思维的跳跃。
我们过去学机械时,机器是从零件到总装而成的,现在为了工业的真正工厂化而不是小作坊的集合,在设计时
普遍采用零件、总成、总装的做法。
为什么?就是要在作出材料总价上升的牺牲后而换得工效的提高,从而使总体成本下降。就好像汽车工业,当
形成流水线生产,并达到一定的产量后,其总单位成本就必然下降了。但其牺牲就是为了配合流水线生产,而
大量采用总成,其材料总价也就上升了,但上升的幅度一定要小于集体工效的提升而带来的成本下降。
做软件(对于你的三个问题)也是这样。采用何种方式并不重要,重要的是这种方式或方式的集合是否适合你
开发团队的要求。也就是得根据你的开发团队的合作素质决定,同时又由这个软件的使用维护方案决定。
注意的是,这个团队的最小量是1个人。
以你的困惑看,你的团队的合作素质不会高。但也没什么,目前中国的软件业的团队合作素质与国外发达国家
相比,也就相当于我国的机械行业70年代时与国外发达国家相比的水平。
好在建一个软件工厂的资金投入要比机械行业投一条流水线的决心好下得多。
你一定会有机会参加到软件工厂的工作中去。
以你的困惑看,
 
一下子就有回应,太感谢了,我不是不知道如何实现客户的需求,而是总是想着如何提高
软件的质量,我所看到的很多软件都或多或少存在软件危机的影子,如何提高近期、远期
效率和软件的可扩展性、可维护性,是我不断追求的目标,有时在现实和理想之间的抉择
既是一门艺术,也是一种痛苦,现在面向对象、UML谈得沸沸扬扬,我看过很多uml的书和
实例谈面向对象分析的不少,面向对象设计我可一个也没看到,说现在还是理想吧,看看
人家MS的OFFICE可说是面向对象的经典,他的架构是如何实现的呢?不过人家一个软件是
多少人年,我们...,中国软件业如果还是这样低水平的重复结局会怎么样?!,十年后我
们还能干什么...?!想着我是寝食难安,可能有点杞人忧天,我真心期望面向对象的先行
者能够给我一点明示,我想这也是许多软件路上求道者梦寐以求的设计模式吧
 
精采!关注。
 
>>1.....
只有面向对象的数据库成熟,一切好办了!
>>2.....
同感,没办法!
>>3.....
同你说的,就是设计模式的问题,用visit+RTTI可以解决!
 
我想的问题都被你们说了!
我需要关注
 
3.功能扩展需要重新继承一个对象,.但不应视为二次开发,对类进行扩展相比2次开发
要轻松的多,而且性质属于软件的完善,而不是功能的再造。这应该是面向对象的好处吧。
 
太精辟了,收藏,同时关注,能看见更多的高论!
 
说得好,关注,希望有更多的高论
 
事实上,很多想法和对于理想状态的追求是这样的一个不断上升的螺旋状结构,
1市场-->2需求-->3由需求产生的技术进步-->4实践-->5由技术而产生的利润-->6由研究而产生的技术进步-->7推动市场
中国的需求使我们的软件企业少了第5环,其技术进步只能在一个简单满足需求的基础上。
希望这个覆盖中国大地的市场冰盾快快消退。
 
各位兄弟, 见到你们的精彩发言, 简直是太好了:
一个Delphi Programmer的pain是很多的,特别是Delphi Database programmer,尽管
Delphi被鼓吹为最佳的Database programming language——此话不假,但是我们的pain
并没有因此而减少。
任何一个delphi databsae programmer都会有这样的痛苦(当然fine structure的
Delphi databse application除外):我们不得不为我们的application添加一个
new feature,但是似乎却无从下手;我们的database structure结构改变了,所以我们不得
不花大量的时间去修改我们的program,即使前者是小量的改动;我们要离开公司了,
newbie来了,但是我们却无法清晰地告诉他(或她)我们程序的结构,甚至连我们自己也不
明白了;又接到客户的电话了,我不得不修改界面,但是,似乎改动的地方超乎我的估
计——糟糕,为什么这个button始终不变灰,终于在别人的代码里找到原因了;我们的程
序已经不能修改了,它们快爆炸了;我们不得不重做——于是再一次的噩梦开始了。
很羡慕Java programmer,他们是幸福的,至少他们获得幸福的机会远大于我们,他们
可以拥抱J2EE,后者可以说强制性地要求他们的Program呈现fine structure。还有很多
open source的工具在等着他们的选择(castor, jboss, enhydra等),这些工具也给他们
提供了设计fine structure的机会。
不用惊讶于二者之间的天壤之别,这是所有Delphi programmer应得的,除非我们从根本
上改变。在众多的Delphi programmer中,他们了解database有时甚至超过了解Delphi
本身,因为,几乎所有的Delphi programmer在进行database programming
的时候,他们面向的是data,是record,Field, Primary Key, Index这些数据库概念,很
可笑,在oop口号如此响亮的今天,我们却不得不面向数据。
 
to polisnew:
兄弟三个问题极为精彩。
>>数据库封装问题
关于数据库的封装问题, 这实际上牵扯到一个效率问题, 在J2EE的框架中, 提出了
真正面向对象的Session Bean与Entity Bean, 以及对应于此的许多工具, 比如像IBM的
sanfrancisco工程,Castor等,他们的出现标志着O/R mapping技术的成熟与走向实用,
但是在Java中, 使用它们的话,效率是比较低下的(每一个Ejb Container可以承受高达
几十万个的EJB,即使在这种情况下,效率也低下), 所以如果在Delphi中实现O/R Mapping
的话,其效率问题一定是一个瓶颈。(关于O/R Mapping,可以参见http://www.thoughtinc.com/
上面的cocobase); 另外一个实现的途径是面向对象的数据库(它就像O/R Mapping一样
可以直接从数据库中Query一个对象, 或将对象流进数据库), 可是这个方面的应用非常
生涩, 到目前为止, 它的应用还处在可以说是萌芽阶段,因为现有的关系数据库应用程式
要转向面向对象的, 需要很大的成本, 其次就是关系型的数据库及其对应的产品非常成熟
与丰富, 这也是面向对象数据库不足以流行的原因(参照http://www.odbmsfacts.com/object-database.html
以及面向对象的查询语言OQL——http://www.odmg.org/)。
目前小弟做了一个在Delphi上实现O/R Mapping的小框架, 可以说效率问题严重, 正在改
进中, 望各位来信指正。
>>三层架构的状态问题
这个问题的确比较让人头痛——在delphi的Midas情况下, 但是只要有了O/R Mapping存
在的话, 它就可以解决了。 必须记住的是,是不可能从逻辑上避免无状态的, 所以有状
态对象的存在是必然的,问题在于如何理清哪些对象应该是stateless, 哪些是state的。
>>客户属性定制问题
不错,这是一个非常头痛的问题。如果将它转化进技术领域, 那么它就成了这样一个问
题了——对象动态界面问题(所谓界面, 是指对象暴露给client的interface,比如在Delphi
中的Public及Published部分, 或者是一个接口), 换句话说就是如何动态的决定一个对象的
属性,在Martin fowler的《分析模式》中,有关于这个方面的详细论述,大家可以去参考一
下, 在Delphi里面的实现思路就像TField这个类的定义一样, 在TField中, 给定了一个属
性那就是Data Type, 另外就是Type Check,这些都可以被用来进行动态属性的设计。另外,
楼上有个兄弟说得好, RTTI与Visitor的合作也有异曲同工之妙!
 
to all:
在没有成熟的O/R mapping技术或不能应用Oriented Ojbect Database的情况下, 如何
解决上面的这些问题呢?
明白太极, 中庸, 统一对立的人明白, 在这种情况下, 不管是出于从商业利益上的
考虑,需要我们的数据库程式尽管完成(牺牲可扩展性、稳定性、维护性、理解性),还是
从艺术的角度(或者说是OOP的角度)考虑,延迟提交项目, 提高产品的可扩展性、稳定性、
维护性、理解性, 这些都是需要折衷的。
老实说, 关于O/R Mapping的实现决不是我们一般的人就能设计与实现的, 不要轻视
它,这里面的问题相当复杂(好的O/R mapping方案参照J2EE中的Session Bean及Entity Bean
),关于O/R mapping的设计与实现已经是系统级的问题的了,它再也不是应用级的问题,所
以,在国内应用程式公司满天飞的情况下,是不适合去做这种事的,当然,有人愿意造福大
众,我们也欢迎之致。另外,即使O/R Mapping的实现也只能解决一部分问题,还有一些问题,
它也无能为力。
考虑到这些情况,下面是我对这些问题的一些"答案":
(1)可能的话,开发过程中实施部分XP,主要包括pair programming与Unit Test及
frequent meeting及Frequent Iterate;
(2)仔细研究一下《Analysis Patter》与《Design Pattern》;
(3)慎重应用分析与设计思想(主要是考虑到主子的利益);
不好意思, 从具体方案上我也给不出来,但是,做到了上面三点的话,系统的可扩展
性、稳定性、维护性、理解性也不会差到那里去的,而这些又不是一言两语能说清的。
 
顶部