对于OO我是菜鸟,目前也只是大致了解C sharp和Python的语法。至于C++、java没学过,我不是cs相关专业的。
RT,起先看到知乎上很多人说OO的好处就是提高程序可维护性。后来又有人说OO抽象封装层数一多会导致难以修改和维护。
百度百科是说【......更利于人理解的方式对于复杂系统的进行分析、设计与编程,来提高编程的效率】
我现在的感觉是OO除了图形界面必须要用,貌似没有必要用到别的地方。
OO的重要性到底体现在哪?
回复内容:
没什么只有OO能做到,OO更多的是给了你一种能力,一种
忽略细节的能力:忽略的越多,人类有限的智力就可以容纳越多越复杂的问题,并由此提高生产效率。
任何抽象的本质都是忽略,OO刚好是其中一种。
OO只是一种解决问题的方法
封装,继承,多态...是面向对象的基本特征
但是没有一把钥匙可以打开世界上所有的锁...
Barney Stroustrup说过,C++能有现在的发展,胜利的并不是语言本身,而是一种思想。在做程序设计的时候,OOD这种思想指导你除了思考一个task的完成需要哪些过程,哪些资源,还推动你去思考完成这个task需要的对象(额,我这不是废话么。) 换句话说,
OOD更好的映射(抽象)了现实与程序设计,而程序设计在解决现实问题的时候本身就是把现实问题最终映射(抽象)成了数学逻辑来运算。当然,一些OOD相关的特性,例如继承、封装、多态、接口等等除了提高程序的抽象能力,还提高了课维护性。
最后,发个纯属搞笑的(zz):
Scheme 大法好
天灭过程式 退C保平安
人在做 天在看 赋值语句留祸患
指针乱用天地灭 赶紧重写保平安
诚心诚念SICP好 Scheme大法平安保
众生都为函数来 现世险恶忘前缘
Scheme弟子说真相 教你编程莫拒绝
早日摆脱面向过程 早日获得新生
上网搜“九评丹尼斯·里奇” 有真相
2016-5-10 16:03:补充
个人觉得,相对于面向过程的思维和编程,优点是直接,编程直奔主题和结果,早期的开发,设计成本低。对于规模小的功能和实现,一次性开发和使用的程序,以及对于很多不确定的程序的开发初期,很自然的会采用这种方法。在初学 c 语言时,尤其是采用和强化了这种思维模式。
缺点是通常没什么层次,很容易使得“可复用”的部分和具体的“逻辑”耦合在一起,使得里面的复用部分往往也难以复用。所以,面向过程的代码,容易被淹没在没有层次感的大量代码之中。对于项目的维护和可重构来说,是不利的。
而面向对象编程,就封装性来说,对算法,数据做了一些分类。对外暴露了经过设计的接口。这使得业务逻辑也被划分的更清晰和更有层次感,使得程序员可以每次专注于一个整体中具体的细分局部来工作。因此,有利于多个人协同合作。
如果仅仅使用了封装性,继承性,那么就仅仅是基于对象。面向对象最重要的特性,是利用其多态性(也就是说,使用 OO 时,你只有使用虚函数,并且通过祖先的接口来操作它们,你才能感受和发挥出 OO 语言的威力和优点,以及 OO 的美妙之处),最终对项目的层次定义的更加清晰合理。在不影响整体设计框架的情况下,你可以通过多态性,随时定义,调整和定制某一个具体对象的个性化行为。
当然,要做到这一点也不是很容易,最终结果通常不可能是你最早就能预见的。往往需要随着开发的进行,不断的调整各个接口的定义,才能逐渐达到最终的合理状态。因此,开发过程中初期开发成本还是略高的。等到这些定义成熟以后,它的易用性,和可维护性上面,都要比面向过程的代码更有优势。
此外,编译器对 OO 编程语言的辅助作用,对程序员来说是一个很重要的帮助。例如,编译器承担了析构临时对象的责任(程序员只需要专注于把析构函数写好就行了)。这使得我们在使用对象时,减轻了一些内存管理和资源维护的负担。例如,在 c 语言的一个函数中,如果申请和打开多个资源,你需要认真的追踪,负责它们的回收和关闭(尤其是当函数在中间就 return 的情况)。在 c++ 中则可以很轻松的随时定义一个临时对象就够了(因为编译器会在适当的时候析构它们)。
在下面的原答案中,我主要是提出了对曾经我看到的一些观点的不认同,一些人对于 OO 的理解过于僵化,以及把非 OO 视为洪水猛兽,这些看法太绝对。就和一些人套用设计模式一样,太生硬太形式化就不好了。
你有两种选择:OO 的,非 OO 的。
----
面向对象最重要的功能,是在语言层面,做出一些归类和划分。这给出了额外信息,有助于提高程序的可维护性,和可控。
也就是说,传达出,数据之间,函数之间,数据和函数之间的疏密和逻辑关系。通过对复杂任务,化整为零,实现分工协作和任务简化,这类似分治法。
同时,在编程模型中建立了对象的概念,通常更加切合人类的思考习惯,通过合理的封装,设计良好的对象接口,从而帮助人们更容易开发和管控自己的代码。
关于楼主提问,我补充下,OO 的选择 和 GUI 是完全独立无关的。GUI 也可以以面向过程的方式开发。在适合 OO 的各种场合(不一定是 GUI),采用 OO 来编程当然也是十分有益的。
然后面向对象的使用,人们很容易僵化,要谨防:
(1)过度OO。不必要的加深对象关系网络深度,会降低程序的可维护性和可控性,最终失控而导致项目失败。
(2)一些人对面向过程才去完全对立,这是一种教条主义和僵硬呆板的理解。实际上绝对的 OO,必然不是最正确的。不管强行 OO 只能是弄巧成拙的愚蠢人。意识不到,OO 并不是适用所有模型,或者说,很多场合,没有必要 OO和没有 OO 的特别收益。
实际情况,一般是 OO 和 面向过程两者的合理结合组合,来解决问题。而不是非此即彼的关系。
以前我经常在技术论坛看到有人说,这不 oo 呀,他们要是看到 oo 语言的汇编结果,只怕要痛苦自杀了。。。。
基础是封装:信息隐藏,简化形参设计;OOP使得Reactive Programming (Actor模型,消息通信,事件机制,异步)的实现变得自然。
相比初代纸带程序与未来自然语言的模块化编程模型,面向对象只是一小步,它在思维上帮助越来越多的人学会编程和喜欢编程,很明显,只要编程还没正式进入小学课本我们就还不满足。
减少全局变量。。。
当然是对象了~
对于初学者来说, oo的最明显的好处可能不是在你写代码的时候感受到的.
而是在你用别人的库的时候发现的...
OO三大件 :封装,继承,多态。
封装是为了‘去除全局变量’。
继承是为了‘去除代码dup’。
多态是为了能让‘继承’得以成立(巨汗)。
由此可见,OO重要性也就两点,“1.去全局变量, 2.去代码dup”。
那么为什么这两点这么重要?
亲手写过并且跟踪维护过大规模应用的人自然明白,
或者接收并维护过‘全局变量,代码dup满天飞项目’的人,也能明白。