什么是面向对象编程思想

上次看到一篇博客上解释面向过程和面向对象在实现需求上的区别:

需求:吃饭

面向过程:买食材,洗菜,切菜,炒菜,吃

面向对象:老板来份鱼香肉丝,吃

总结下来,面向过程就是把需求分化为一个个的步骤,然后按照步骤调用方法,实现需求;

面向对象为将事物抽象为对象,将数据和方法进行封装整体获取。

以此上可见,面向对象将事物看作一个个的抽象整体,更助于开发出高内聚,低耦合的程序,更加的易于拓展和维护。

不过不论是面向过程还是面向对象都是一种编程思想,与具体的语言无关,而说java和php等语言为面向对象语言,是其语言本身即支持封装、继承、多态等特征,而常被认为是面向过程的C语言也可以实现面向对象的程序,只是在使用面向对象的特性上需要麻烦一些。

抛开表象看本质。从本质概念上讲,面向对象大致有两个层次的内涵:

1、基于对象。就是题主所说的,只要把数据和函数放在一起就可以了。(外加普通的“继承”,不考虑多态的简单继承还算是基于对象的。)

2、多态。首先,方法可以在子类中重写;调用对象方法的时候,调用父类还是子类还是孙类的方法,能否自动选择到合适的呢?解决这个问题的设计就是“多态”。

实际上“基于对象”最重要、最常用、最根本。讨论问题本质的时候,甚至可以先不管多态。多态虽然很有用,但是如果把二者放在一起讨论,反而只会捣乱。

也就是说,要想理解透、用好面向对象,关键要理解透、用好基于对象 ,而这恰恰就是题主所说的,只要把属性和方法正确封装好,事情就成功了大半。

1、面向对象思想,有它很朴素、很自然的一面

我们常习惯说C语言是面向过程的语言,其实这话不大对,C语言完全可以写出面向对象的代码。因为C语言至少满足“把数据和方法封装在一起”这个基本要求,也有稍微高级点的写法实现继承和多态。

只要是写过一些实际代码的人应该都知道,无论编程语言如何简化,有一个基本功能肯定会用到——那就是把数据打包在一起。比如2D坐标需要把x和y放一起,复数需要把实部和虚部放一起,网购订单需要把单号、内容和价格放一起。

甚至退一步,回到1980年代的某些古老版本的C语言(结构体里不放函数),依然能写出符合面向对象思想的代码:


也就是说,基于对象本质是一个非常非常自然的概念。有了class或者struct,才能把数据放在一起,才能创建多个同类型的对象。没有struct,以上代码就没法很方便的表示多个学生。

无论谁来设计新的编程语言,几乎都会设计出类似的东西。

所以 基于对象 的概念十分容易掌握,只要合理定义了类的变量,事情就成了大半;再加上合理定义的操作(也就是方法或函数),就已经足够写出足够好的程序出来。

世界上有很多非常重要的程序,从操作系统到火控雷达,从火箭上天到载人登月,都就是用这种很朴素的思想写出来的。

2、现代的“面向对象”语言,到底干了些什么?

随着软件的进步,人们写的代码越来越多越来越复杂,不得不对语言规范做出更严格的控制,才能让软件规模进一步扩大。

这也是自然的过程,现在不管什么日常用品,都要考虑安全性、实用性、美观性,这是发展的趋势。

为了增强规范性,增强可读性,还要防止程序员犯傻,编程语言做了哪些事呢?举几个例子:

为加强权限管理,防止手滑修改变量,打造了一系列关键字,包括访问权限控制的public、private等。

Java和C#等语言,要求几乎所有的代码必须写在class内部,让面向对象更加纯粹。

继承和多态,为了它打造了一系列配套设施,比如C#至少就有virtual、override、new、protected、abstract、is、as等等有关的关键字。

static关键字,用于把属性和方法绑定到类本身,而不是对象。

“接口”的概念也和面向对象紧密相关,用它可以实现更灵活、更广泛的多态系统。当然相关的概念也多出来一堆。

因为需求是多变的,要想更好的满足需求,就要为语言不断添加新的特性。而解决问题的同时会带来另一些问题,让问题更加复杂。比如C++的const关键字就是一个典型的例子。

3、面向对象思想,只是众多程序设计思想之一

现代的“面向对象”思想发展到了一个很深入的程度,比如“设计模式”正是面向对象思想的典型例子。

设计模式的主要目标是让程序更易于扩展,“对修改封闭,对扩展开放”。也就是说理想情况下,任何新需求都能通过添加新模块解决,而不用修改老的代码。(虽然现实上有种种困难,但是这种做法在某些大型软件系统中也发挥了相当作用。)

但是要知道,越是接近现在,各种不同的设计思想越是百花齐放,各种思路也是平起平坐的关系。更多编程思想比如:

数据驱动编程(Data Driven Programming)。将程序架构的复杂度转移为结构化的数据表示,实现极其灵活的设计。

组件式编程。Unity采用了这种方式设计且获得了很大成功。组件式尽量用类的组合代替类的继承,但是依然保留了一些多态的特性。

Actor模型。与传统面向对象有良好兼容性,充分利用多核性能,在需要高性能并发的场合大放异彩。

函数式编程。比较古老的理念也焕发了新生。

当然,这些思想与面向对象并非对立,而是互为补充

总之,退一步看。“面向对象”的种种高级特性,有时很有用,有时会被其它方式取代。而“基于对象”这一思想由于是极端朴素的,所以拥有不可替代性。无论一百年后代码怎么写,你可能都需要把相关的数据和方法打包在一起。

要去学习、去探索正确的方法,而不必拘泥于方法的名字和形式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容