发信人: rampig(二十八亩田)
整理人: xiange(2002-08-29 15:44:15), 站内信件
|
改编自:www.umlchina.com
关于面向对象的执行效率
Q--------------------------------------------------------------------------------
面向对象方法设计的软件执行效率如何?
譬如有学生这样的对象,有一个“毕业”的方法。在传统的数据库设计中,我们都是采用直接对数据库中的数据进行操作,或者遍历,或者sql处理。
但是在面向对象的设计中,需要创建所有的“学生”对象,对每一个学生对象调用“毕业”方法!这样的执行效率比起C/S的结构来......
不知各位对此有没有相同的困惑
A----------------------------------------------
纵观历史的发展,硬件和软件工程的发展致力于让计算机可以更简单的解决问题。硬件执行效率呈指数级别发展,同时大小和成本则不断降低。而软件则在用户和硬件之间不断地提高抽象的层次,从punch cards,汇编,过程化语言到面向对象语言到基于构件的开发方式。从这个角度来讲,采用面向对象的解决比原先的单片汇编语言可能效率较低。
但是,性能优化的方式可以让我们进一步深入考虑。一种方法是无时不刻考虑程序的执行效率问题。事实上,这种方法没有得到表面上看来应当得到的报酬。一个程序的性能通常位于某些热点或者瓶颈上,如果你在所有的地方都进行性能优化,那么90%的工作是浪费的,同时极有可能没有对真正的瓶颈处进行最佳的优化。一个概念清晰,结构易于理解的程序更适合于性能评估工具对其进行最佳粒度的热点分析,从而把性能优化工具和时间真正花在刀口上,从而得到更好的性能优化结果。
另外一个问题就是,面向对象所导致的清晰的概念和相应的层次划分,可以使得不同的人更能集中精力处理自己专长的业务。虽然并不一定要在面向对象的方法下才能实现这些层次划分,但是OO确实被证明是层次划分和其他重要体系结构(如adapter,microkernel,broker)等最自然的表达和实现方法(这个问题我就不详述了,涉及到如何封装层次、如何确定粒度等等)。每个人集中自己的专长进行实现显然会得到更好地执行效率。另一个重要的技术就层次中的短回路技术,所谓的短回路(我自己的说法,没有考证),就是本来一件任务的完成需要从上倒下贯穿整个层次体系,然后再从下到上返回(如用户界面对数据库的存取需要从最高层一直到底层的数据库),好的层次划分可以提供自己能够处理的信息,从而大大缩短了信息转化和处理所需要的路线。很好的例子就是cache技术的发展,pool技术的应用。这些技术在当前分布式环境下明显地提高了程序执行的效率。
A----------------------------------------------
我是个学习UML的新手,在实践的过程中碰到了不少问题。主要原因是以前致力于coding,因此在发现对象的过程中不自觉的就会想到实现。大多数的烦恼自此而来,potian前辈的一番话很有启发,thanks!
A----------------------------------------------
假设一个学生在校的时候在档案馆里面保存了一份档案,毕业之后需要将这份档案消掉。
在一个学校里,有一个班X,学生ABCD,要毕业了。
星期一的早上,系统(调用学生.毕业()的对象)对A说,你可以毕业了,然后A高高兴兴的跑到档案馆的书柜里面找出自己的档案撕掉。下午,系统对B说,你可以毕业了,B也跑到档案馆翻书柜去拿出自己的资料,然后丢到厕所里面。如此这般,每个人都要这么捣腾一遍。这种情形是不是很可笑?
- 学校教坏了学生,让他们甚至知道怎么从档案馆里面的书架上找自己的档案。
- 学校机构不健全,档案馆连个干事的老大爷都不清。
而在另外一个学校,X班的学生毕业了,校长给档案馆打了个电话:“喂,档案馆吗?现在X班的学生毕业了,把他们的档案烧了吧!”档案馆的老大爷于是找出这个班的所有档案(我想应该在一个书柜里面),丢到一个火盘里,点把火丢进去......学生甚至不知道档案的事情,因为他们再也不需要这些东西了。
问题不是采不采用面向对象,而是怎么去运用了。
A----------------------------------------------
那么校长给档案馆老大爷打电话的时候会说:“那个叫maplestreet的有10门课不及格,不能毕业,把他的档案拿到下一年级去。”
或者说:“张大爷,你看看,如果学生没有成绩不及格的就可以毕业了,把这些学生的档案烧掉。”
A----------------------------------------------
其实我认为例子中的老大爷应该是一个对象,这些档案资料由老大爷来管理,而每个学生不能管理他个人的资料.
A----------------------------------------------
像以上问题,你可设立一个对象叫 "Batch", 于是你能执行 "毕业全部学生" 的方法。 这都属于软件设计的范畴, 与执行效率无关。
A----------------------------------------------
但这样似乎又有悖于面向对象的概念,因为“毕业”的责任者是学生,是否可以采用折衷的方法,既给学生定义“毕业”方法,又使用一个“学生管理类”批量操作学生。
我在实现模型时发现很多时候需要考虑的并不是组件、代码的重用问题,而是实现的效率,而对用户来说,这是评价你的系统的重要因素。
而所谓的控制类是否正好能在此功能上迎合用户的需求?
A----------------------------------------------
在现实中,学生也不能自己毕业自己吧?通常要经过某Athority的批准。而这个Athority就可以批处理大量的学生一起毕业以提高效率。
更何况毕业并不是一个简单的命令,牵连广泛,需要独立的类来运行.
A----------------------------------------------
面向对象设计方法的好处主要在于设计和分析的思路清晰,代码的可重用性和可维护性。对于小的项目,不用面向对象设计方法也许可以应付,但对于大的项目,不是一个人在做,而是多个人协作,用你说的那种方法就容易引起混乱和误解,一旦某个程序员离开或需求改变,那就是灾难的开始,而这些是经常发生的。相对于这些好处和目前硬件的发展水平来说,哪一种方法在整个项目中的效率高就不言而喻了
----------------------------------------------
---- SAVE TIME,SAVE LIFE.
GOT EFFICIENCY,GOT MONEY.
|
|