欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

面向对象编程的重要性在哪?

程序员文章站 2022-04-19 09:26:17
...
对于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满天飞项目’的人,也能明白。
相关标签: Python sharp java