精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-06-27
多态,是 模板重用 的情况。如那篇OOAD/Basic帖子所述。
过程语言,如C,依靠Callback Function 实现多态。或者麻烦一点,通过structure pointer实现多态。如那篇OOAD/Basic帖子所述。 C++, 依靠 纯虚父类,父类实现多态。 Java 依靠 interface, 父类实现多态。 这些都是语法支持。OO语言缺少了继承语法,很多重用就无法自然的做到。至于 is a, has a. 那些东西,是为了自成体系搞出来的方法论。 另外: 关于函数式编程语言,我看了Trustno1的经典教程帖子,和SICP推荐。 有些很矛盾的感觉。 函数式编程语言 既象一门最原始的汇编指令(操作符号、或者函数名 都在 数据的前面),又象一门很高级的解释语言(函数体可以如同数据那样,运行时候产生,可以作为参数使用)。 |
|
返回顶楼 | |
发表时间:2005-06-27
庄子,你抽象例子不利于讨论。来点实际的例子。嘿嘿
|
|
返回顶楼 | |
发表时间:2005-06-28
helloworld 写道 庄表伟 写道 OO主导软件开发的时代已经持续得太久了,对于OO的迷信更是根深蒂固!OO就是先进,OO就是正统,OO就是时尚,OO就是每一个程序员的“每日灵粮”! :lol: 你说的不是我想的,有很多东西并不矛盾。我认为, OO首先是一种思想,即以Object来西分和分析命题,所谓Object,是一个很简单的而且富有哲理的命名:1)Object 有形但又无形,每个人的定义可以不一样;2)Object可以无穷细分。 其次,我认为OO是一种可以宏观和微观使用的方法学,可以用OO来对系统规划,也可以用于细节设计。 其它思想和方法,可以互为补充 如AOP 简单的可以视为:存在一种规则或法则,对一群Object发生效率。 如IOC 可以理解为通过一种设计使一个Object更加适应于未知的Object,这种设计就是IOC。 如SOA SOA的关注的不在是否OO,如果要和OO一起讨论,可以如下。 很多Service生活在SOA里,但是,这些Service的出生于哪里,那就是分析的结果,可以是OO分析,也可以是其它,如果是OO分析的产物,那么,必然可以将这些service分组,某几个Service可能是某个你定义的Object向外提供的服务,当然,service的实现本身还是可以调用若干个Object的方法实现的。 但是,不要在此问题上钻牛角尖,SOA就像设计模式或分析模式一样,是被提出来用来解决业务开发中的一些问题,提出这个方法的人也许根本就没有去想是否OO这个问题。 等等 OO与结构化方法是很重要的一个思想的两个实现——分而治之 结构化试图以数学的方式来实现,而OO试图以认知的方式来实现。各有利弊,全在使用者的能力和悟性。 不存在是否要中止OO时代的问题,所谓迷信也是迷信的人的迷信,思想不会限制人学习,而是人在限制思想进步。 比较同意这种观念,OO知识一种编程的思想,就像是在这之前的OA,OP等,并没有因为OO的出现而死亡了。等多的时候OO是一种继承。需要的是人的一种更高的思想。不想信会有灭亡的说法。 |
|
返回顶楼 | |
发表时间:2005-06-28
看这些贴看得好累啊!花了一个小时才看完!:)
我提下我的看法!(看上去和目前得讨论不是很相关) 0. 由于计算机本身的计算过程是线性的。决定了不论是OOP还是AOP的最终结果都是一个线性的流程。即都是提供线性流程模板。 1. OOP解决的问题是线性模板的封装问题。即它在不同层面上封装不同的线性流程细节。为此它提供了重载机制来实现流程细节的差异性。 (接口在java下的实现是对abstract封装 。利用javap看到。) 2. AOP是利用代码生成解决方案。为避免因为OOP实现的差异性带来的巨大开发负担,它在OOP上提供了线性流程生成能力,典型的如AspectJ。(反编译它生成的代码,可以看到它改写了程序执行线性流程),利用cglib或者DynamicProxy不过是在内存中生成代码,依然是改写了线性流程(采用模板的方式)。 所以OO本来就不是万能了,因为从来没有人证明过这个世界是OO的。OO不过是帮助我们对线性流程进行结构化封装的过程。 AOP是来帮助我们简化封装的复杂度问题! |
|
返回顶楼 | |
发表时间:2005-06-28
yimlin 写道 看这些贴看得好累啊!花了一个小时才看完!:)
我提下我的看法!(看上去和目前得讨论不是很相关) 0. 由于计算机本身的计算过程是线性的。决定了不论是OOP还是AOP的最终结果都是一个线性的流程。即都是提供线性流程模板。 1. OOP解决的问题是线性模板的封装问题。即它在不同层面上封装不同的线性流程细节。为此它提供了重载机制来实现流程细节的差异性。 (接口在java下的实现是对abstract封装 。利用javap看到。) 2. AOP是利用代码生成解决方案。为避免因为OOP实现的差异性带来的巨大开发负担,它在OOP上提供了线性流程生成能力,典型的如AspectJ。(反编译它生成的代码,可以看到它改写了程序执行线性流程),利用cglib或者DynamicProxy不过是在内存中生成代码,依然是改写了线性流程(采用模板的方式)。 所以OO本来就不是万能了,因为从来没有人证明过这个世界是OO的。OO不过是帮助我们对线性流程进行结构化封装的过程。 AOP是来帮助我们简化封装的复杂度问题! 那面向过程与面向对象,在你看来,区别何在? |
|
返回顶楼 | |
发表时间:2005-06-28
引用 0. 由于计算机本身的计算过程是线性的。决定了不论是OOP还是AOP的最终结果都是一个线性的流程。即都是提供线性流程模板。
这话听着感觉似乎有问题。 引用 1. OOP解决的问题是线性模板的封装问题。即它在不同层面上封装不同的线性流程细节。为此它提供了重载机制来实现流程细节的差异性。
你是想说“覆盖”而非“重载”吧? 多态的目标是为了封装么?“实现流程细节的差异性”原本就可以封装,多态只是使用了自定义数据类型(即对象)之后的使这种封装无法重用了,然后又想出来的一个workaround吧? |
|
返回顶楼 | |
发表时间:2005-06-28
我说过了啊!结构化的封装过程。
比如面向过程中我们用if else来实现流程。在面向对象中我们会用event加listener来实现,代码上看我们消除了if else。题外话:还有些地方我们无法消除if else。比如在web app的页面层,我们始终无法绕开if else,大量得模板语言支持if else。martin fowler在PoEAA中就很无奈的说,如果有人有好建议请告诉他。 庄表伟 写道 yimlin 写道 看这些贴看得好累啊!花了一个小时才看完!:)
我提下我的看法!(看上去和目前得讨论不是很相关) 0. 由于计算机本身的计算过程是线性的。决定了不论是OOP还是AOP的最终结果都是一个线性的流程。即都是提供线性流程模板。 1. OOP解决的问题是线性模板的封装问题。即它在不同层面上封装不同的线性流程细节。为此它提供了重载机制来实现流程细节的差异性。 (接口在java下的实现是对abstract封装 。利用javap看到。) 2. AOP是利用代码生成解决方案。为避免因为OOP实现的差异性带来的巨大开发负担,它在OOP上提供了线性流程生成能力,典型的如AspectJ。(反编译它生成的代码,可以看到它改写了程序执行线性流程),利用cglib或者DynamicProxy不过是在内存中生成代码,依然是改写了线性流程(采用模板的方式)。 所以OO本来就不是万能了,因为从来没有人证明过这个世界是OO的。OO不过是帮助我们对线性流程进行结构化封装的过程。 AOP是来帮助我们简化封装的复杂度问题! 那面向过程与面向对象,在你看来,区别何在? |
|
返回顶楼 | |
发表时间:2005-06-28
gigix 写道 引用 1. OOP解决的问题是线性模板的封装问题。即它在不同层面上封装不同的线性流程细节。为此它提供了重载机制来实现流程细节的差异性。
你是想说“覆盖”而非“重载”吧? 多态的目标是为了封装么?“实现流程细节的差异性”原本就可以封装,多态只是使用了自定义数据类型(即对象)之后的使这种封装无法重用了,然后又想出来的一个workaround吧? 这个是我的笔误!sorry! |
|
返回顶楼 | |
发表时间:2005-06-28
yimlin 写道 0. 由于计算机本身的计算过程是线性的。决定了不论是OOP还是AOP的最终结果都是一个线性的流程。即都是提供线性流程模板。
计算机本身计算过程的实现原理是基于简单的顺序,分支和循环。并不能推导出构建在其上的OO本质上也是这个过程。 音乐由声音构成,但音乐的本质并不等同于音符所代表的声音的总和,它具有了声音所不具备的特性。 |
|
返回顶楼 | |
发表时间:2005-06-28
partech 写道 计算机本身计算过程的实现原理是基于简单的顺序,分支和循环。并不能推导出构建在其上的OO本质上也是这个过程。
音乐由声音构成,但音乐的本质并不等同于音符所代表的声音的总和,它具有了声音所不具备的特性。 我提下我的看法。就这个比喻来说! 音乐是声音,这个没有问题吧。音乐的本质并不等同于音符所代表的声音的总和,它具有了声音所不具备的特性。我可不可以认为音乐具有了在声音之上的美感。 计算机本身计算过程的实现原理是基于简单的顺序,分支和循环。同样的是在业务的过程中是否也线性的过程。比如财务报销过程,网上的交易过程。对于客户来说,只管系统实现其业务过程。你是用面向过程还是面向对象他并不关心。但对于我们来说用面向过程和面向对象是差了很多的。因为用面向对象比面向过程有更强的结构化描述能力。 |
|
返回顶楼 | |