最熟悉的陌生人——你真的了解面向对象吗?

简介: 最熟悉的陌生人——你真的了解面向对象吗?

一、引言

当我们打开招聘网站时,通常看到职位要求的第一条便是“有面向对象编程思想”,但往往这一条会被大多数人忽视,心想“不就是写几个类吗,我将具体的事物抽象一下就是喽!”,对,你说的一点都没错,但我要说,你对面向对象的思想还只停留在表层。

当我们遇到一个问题或者是接触一种新的思想时,往往只关心其字面上的意思,并没有真正的去深究这其中的道理,这种浅尝辄止的思维方式已经根深到大多数人的思维习惯中。科学之所以诞生 在西方,与西方人刨根问底的精神是离不开的。

当芝诺提出飞矢不动论(飞着的箭在任何瞬间都是既非静止又非运动的)时,所有古希腊人都

芝诺问他的学生:“一支射出的箭是动的还是不动的?” “那还用说,当然是动的。” “确实是这样,在每个人的眼里它都是动的。可是,这支箭在每一个瞬间里都有它的位置吗?” “在这一瞬间里,它占据的空间和它的体积一样吗?” “有确定的位置,又占据着和自身体积一样大小的空间。” “那么,在这一瞬间里,这支箭是动的,还是不动的?” “不动的,老师” “这一瞬间是不动的,那么其他瞬间呢?” “也是不动的,老师” “所以,射出去的箭是不动的?”

会参与到这个看似无稽的问题中,但正是因为这样的探索和质疑之声才促进了文明的发展。在我国,甚至比芝诺更早,就已经有人提出了类似的问题,例如“飞鸟之影,未尝动也”等言论,但这都仅仅停步于此,如果谁去探讨这样的问题,会被当作是不学无术。

二、一个实验

好,请你耐住性子,在引入主题前,我先请你做个实验:

假设存在一片虚无空间,里面完全为空,现让你创建一个适宜人类居住的生活环境,那么请问,你会如何做,如何创建?这里,请你先思考三分钟再往下看。


01ebd755782e4c909dad0843d3544acf.jpeg


思考三分钟哦

好,我想没有人的想法会脱离下面的这些:

1. 温度,空气,水,土壤,光等生命要素。

2. 山川,河海等地理环境。

3. 森林,各种动植物,微生物。

4. 各种自然规律。

5. 生活要素。

6. 其他。

三、面向对象

好,以上这些都是我们根据自身的认知模型所创造出来的具体事物,而你自己也默默的充当了一次造物主的角色,那么提出今天的问题:在计算机的世界里,什么是面向对象呢?

所谓面向对象,即:计算机世界是人类真实世界的映射,而真实世界中的人类认知模型概念,我们在计算机编程中把它统称为类,而以类的方式构建程序模型,我称之为面向对象编程。

也许你还不太了解,就拿上面的实验比喻:

那块虚无空间在计算机中,可类比计算机中的内存;

你所创造出的物体,在面向对象编程中称之为实例;

你的认知模型(猫,狗等概念)在编程中称之为类。

讲到这里,你可能就会体会到不管是Java,C++亦或是其它语言的书籍当中,你见到的第一句话就是“万物皆为类”,这么五个字,它恰恰也诠释了什么叫面向对象编程,也许你现在还不明白,但等你有足够多的编程经验后,终会发现这五个字的深刻含义。

四、如何创建类

既然知道了面向对象就是面向类,那么我们应如何来创建类呢。要知道一只猫之所以区别于一只狗,是因为它有着不同于狗的特性,例如,它的声线可以使它的叫声为“喵”,它的胡子可以帮它抓到老鼠,它发达的肌肉系统可以帮助它跳的很高等等,一切属于猫的属性,都决定了它是一只猫。所以当一个物体具有了某方面的属性后,它便获得了相应的能力,所以我们在创建类之前,必须明确这是个什么类,它应该具备哪些属性,如果它多了某种属性,它就不再是猫,那么这个属性就是不能要的。所以创建类的思维方法,我总结如下(希望重点牢记):

1.计算机中要尽可能的还原真实世界,所以要提高自己对真实世界的认知水平,为类赋予它应有的属性,去掉那些本不属于它的属性。

2.属性决定了类所具有的能力,能力反映了类所具有的属性,如果这个类只有get和set方法,那么这便不是个类,只是存储数据的一个结构罢了,那这个类的设计也是失败的。

3.打破思维惯性,尝试寻找类与类的差异与共性,将共性升华,使其变成抽象类,在你自己的认知水平上构造连接虚拟与现实的模型框架。抽象类之所以不能实例化对象,是因为如果一名美术老师让你画一只哺乳动物,那你知道要怎么画吗,唯独他说让你画猫,你才会画。

4.类不仅仅包括我们看得到摸得到的实物,还包括诸如管理制度,自然规律,社会礼法等,所以类是开放的,多元的,所以你的思维要保持广度和深度。

5.时刻以造物主的身份,创造并设计你的软件构成,让它符合真实世界的认知。

好,今天便讨论到这里,如有疑问或不同意见,欢迎大家一起讨论,只有各抒己见,我们才会越接近真相。

文章最后,我提出一个问题,如果一只猫,多了一条腿变成五条,那它还是猫吗,如果变成6,7,8。。。无穷尽条腿,它还是猫吗,这个我会在下次的分享讨论中给出我的看法。

如果你对我的文章感兴趣,就感激关注吧,你的支持就是我的动力。


更多分享请关注微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。

相关文章
|
3月前
|
算法 安全 uml
【 第十三章】软件设计师 之 面向对象程序设计
软件设计师 之 面向对象程序设计备考资料
【 第十三章】软件设计师 之 面向对象程序设计
|
3月前
|
存储 数据处理
|
6月前
|
前端开发 JavaScript PHP
【软件设计师备考 专题 】类程序设计语言主要特点和适用情况
【软件设计师备考 专题 】类程序设计语言主要特点和适用情况
122 1
|
6月前
|
前端开发 JavaScript Go
写了2年前端从来不用面向对象?
写了2年前端从来不用面向对象?
|
Java 程序员 开发者
优秀程序员的学习习惯和方法你都不知道,还学什么编程
好的学习习惯和方法会让你的工作事半功倍,快来看看你还差哪些
69 0
优秀程序员的学习习惯和方法你都不知道,还学什么编程
|
存储 机器学习/深度学习 算法
给编程初学者的一封信
给编程初学者的一封信
86 0
|
前端开发 JavaScript Go
🤔写了2年前端从来不用面向对象?
对比错误实现和正确实现的代码示例,展示了面向组合的设计方式如何使代码更加干净、可复用,并提升了维护性和灵活性。
134 1
|
存储 算法 Java
我该如何学好行为型模式(上)
我该如何学好行为型模式(上)
51 0
|
Java 程序员
我该如何学好行为型模式(下)
我该如何学好行为型模式(下)
63 0