锁定老帖子 主题:面向对象之弊,面向过程之优
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-15
jasongreen 写道 ray_linn 写道 恩,Java不是OO语言的全部吧。回调函数在C#里就很处理并不尴尬,(当然用C++搞就更不尴尬了),从楼主的例子上看,只能说Java太固步自封了,在C#出来之前一直没有进步。
class A { public event ProcessDelegate ProcessEvent; } var a =new A(); a.ProcessEvent += new ProcessDelegate(t_ProcessEvent); 也可以这样搞 class A<T> { public void MethodA(Func<T> fun) { fun.Invoke(); } } 第二个问题就更简单了,C#中有扩展方法,我们给A,B做个伪接口 interface Fake{} Class A :Fake{} Class B :Fake{} static Class Ext { TypeA MehtodA(this Fake ojb, ParamA){} TypeB MethodB(this Fake obj, ParamB){} } 调用时 A.MethodA(...) A.MethodB(...), B.MethodA(...),B.MethodB(...); 如果问题再具体点,还有更多有趣的方法。 C#真神奇。C#加入这些特性,是件好事。 第一段通过 event关键字,+=操作符让ProcessEvent成为了一个event dispatcher,ProcessDelegate是否就是callback函数?ProcessDelegate是一个类? 但我们是否应该反思,是不是因为OO的设计模式出现了问题,所以才需要加入这些特性的呢?我们是不是更宁愿使用编译器带来的特性帮助我们————用简单的代码(event关键字,+=操作符)————编译出复杂的机制(基于OO的事件分发系统)————来实现简单的功能(其实就用函数指针或引用就行了),而不愿意偶尔改变一下思路,使用PO的方式来实现简单的功能呢? 第二段像反射。 发现越是牛逼的项目,反射用的就越多,反射的本质是什么?反射的目的是进入到OO的结构内部,挖掘所需信息,调用所需函数。对于PO来说,根本就不存在反射这个概念。反射的出现与流行证明了人们尤其是牛逼的人们受不了某种限制,虽然他们也许都没有意识到这种限制来自于OOP。 第三段像是根据this关键字在编译阶段注入方法。 什么叫编译阶段注入方法,就是OO在语法上不允许在2没有继承关系的类上通用的方法,通过在目标代码中由编译器强行插入函数指针的方式来实现无继承关系的2个类的通用。 类似的还有,AOP概念,mock object,其实在PO里面简单的HOOK就可以实现。 其实我们已经知道,总有那么一些情况,我们用类继承,多重继承,没有办法解决问题,所以有了 Adapter,Bridge,Decorator,Facade 等等这些设计模式来帮助我们解决问题,现在C#给了我们另一种选择,编译器增强“模式”,这些都是OO所带来的问题所引申出的概念。 C#带来的编译器增强“模式”,的确是个效率更高的好模式,但会带来语法越来越复杂的问题。 第一、二段都是委托,委托还是类,只是个特殊的类而已,这个类带有同步的invoke方法,和异步的BeginInvoke和EndInvoke方法,由编译器完成。 当然C#最犀利的地方就是dynamic object了,可以照样跑ruby的 a.find_name_all(). |
|
返回顶楼 | |
发表时间:2010-07-15
很难同意楼主的说法。
但是也不会给你 投新手贴。 不能为了OO 而OO。 OO是手段, 不是目的。 1。 我们需要全局变量和函数。 但是 这仅仅是一小部分。 2。 我们需要Callback函数。 我想 函数也可以是对象。不一定非得需要用PO来解决吧? JavaScript里面函数就是Object, 当然我还没有透彻的理解。正在学习。 OO的语言编译了以后还是 机器代码。 DOS里面都是中断, 其实Windows 最终还是中断, load。。。执行。。 中断。。。。。 压栈。。。。 执行。。。出栈。。。。回复。 继续执行。 有时学习的多了, 思考和疑惑就多了, 是因为 还是局限在一个小圈子里思考。 当然,浅薄的人不愿意 思考。 降低复杂度, 提高可读性, 以及代码的效率 有时是矛盾的。 常常需要折中一下。 OO 和 PO 也应该是这样吧。 |
|
返回顶楼 | |
发表时间:2010-07-15
楼主想要的语言是ActionScript3.0,比楼主想要的还要多。
|
|
返回顶楼 | |
发表时间:2010-07-15
fight_bird 写道 楼主想要的语言是ActionScript3.0,比楼主想要的还要多。
AS3挺好。 |
|
返回顶楼 | |
发表时间:2010-07-15
没有什么思想是万能的,融合各种思想才是王道,但是融合里面应该有个主次之分,举例来说持久层都用hibernate和持久层用hibernate为主+jdbc为辅这两种方案,后者更能提高app的性能。而以OO为主辅之PO现阶段来看比强行都用OO更适合现在的应用开发。
|
|
返回顶楼 | |
发表时间:2010-07-15
最后修改:2010-07-15
LZ把思维方式(OO PO)和语言模型搞得有些混乱啊。不过这种高难度问题,一般人也搞不明白,可以理解,我们都停留在背背概念的基础上。
|
|
返回顶楼 | |
发表时间:2010-07-15
OO是擅长解决实际生活中的业务问题。
PO是擅长解决机器的问题。 两个东西擅长的领域不同。不能比较谁好谁坏好坏。 如果是ERP系统,肯定要用OO,如果是算法那当然用PO 另外,只要是冯诺依曼体系,不管是面向方面、面向对象、模块化都是过程化编写出来的。 |
|
返回顶楼 | |
发表时间:2010-07-15
数据离行为更远绝对不是好事。
把你的灵魂抽离肉体,看你还能独立发贴不? |
|
返回顶楼 | |
发表时间:2010-07-15
支持一下lz
我很喜欢用C写PO那种畅快的感觉,这是用java难以体会的。 PO更容易去表达处理的流程,比如图像处理的算法等等 而OO编程有点像搭积木,设计模式是积木排列的一些经典结构。 |
|
返回顶楼 | |
发表时间:2010-07-16
抛开比较累人的原生类型,c++完美的结合了这些范式。还是用c++吧:D
|
|
返回顶楼 | |