初学时对于面向对象的一些思考

本文记录了作者从C语言转向C++学习时,对面向对象编程的思考。作者指出,C语言的面向过程思维方式在解决复杂问题时显得不足,而面向对象编程通过抽象现实世界来简化问题,更符合人类思维。作者强调学习C++的目的是理解和掌握面向对象思想,而不仅仅是语法。高校教学中缺乏对此深入探讨,使作者感到遗憾。

写在前面
首先我很难保证本文的准确性,因为一切都是自己的思考而已。更需要强调的是本文不是要去争论何为面向对象,只是想记录一下自己在学习过程中发生的思维转变。
本文写作背景
大一下期学习开展了C++的学习,并且期望通过五个星期的课(每周三节课)向我们讲授C++,而本人由于接触计算机的时间相对于同龄人要早些,应实验室部门要求在大一上期就开始学习C++了,期间读过《C++ primary plus》和《C++ primary》以及看完了一套和C++有关的视频,并且在寒假重温了一遍视频,写了贪吃蛇,五子棋等小项目,也就是说在实际动手编程中的的确确是利用到了类的。最开始教师的几堂课也是有听的,但是后来就一个字也不听,这并不是自己心高,而是实在觉得无法从课堂中获取更多的知识,而且在某些地方,并不同意教师的观点的,无奈这不是高中时期的课堂,很难展开“民主讨论”。当然我并不希望以这一篇文章来抨击高校计算机教育,这方面的问题在知乎上也已经有了,而且结果也很明确。
从C语言到C++
从C语言到C++,这是一条再正常不过的技术学习路线了。C语言也是我们大多数人所学习过的第一门语言,正因为此,所融入进C语言中的编程思想很大程度的影响到了我们思考问题的方式。站在课堂教学的角度来看,C语言的引入,让我们学会了怎么一步步的分析问题。而我们所遇到的大多少oj题,大致上都可以单一的拆解成先怎么做,再怎么做(忽略智商因素)。对于一个简单的问题,这种思维方式无疑是正确并且高效的,因为人思考问题的方式就是这样的,做一件小事情,第一步怎么做,第二步怎么做,第三步怎么做。。。。稍微复杂点也就是在每个步骤上多了循环和跳转,这些也在编程语言中的if,for等语句中体现出来了,而函数则可以看做将通用的步骤进行封装(原谅我使用封装这个词)。因而C语言是一种面向过程的语言,站在语言的角度来说,当我们使用C语言编程的时候,最直接的解决问题方式就是讲问题拆解成一个个小过程,然后将这些过程组合起来,成为一个问题的解决方案,由于解决一个问题的过程是不一样的,体现在代码中就表现为每个人的代码是不一样的。
结束了C语言的学习(用结束这个词是极其愚蠢的),我们迎来了C++的学习,其实在学校还没有开课时我就站在自己的角度思考过这个问题,学C++学什么?
最开始我对学校的预想是,开展C++的教学,最后的结果就是几个函数放在一起写成类,将scanf改成cin,将printf写成cout,这样一点我或多或少的说中了。自己通过自学,我认为掌握的第一个知识不是C++本身,而是知道C++是一门面向对象的语言,而C是面向过程的语言。现实课堂中,我苦恼的是为什么老师从来没有向我们提到过这样一个概念,从来没有讲解面向对象是什么,真是遗憾,因为自己在这方面也存在不少的疑问,我自己也将这个问题当做一个哲学问题,遗憾无法在课堂中展开讨论。
而按照面向对象的思想,怎么去思考一个问题呢,先怎么做,,,再怎么做。有人说这是面向过程的思维,但是自己的看法是,面向对象绝对没有摈弃这样一个思想。当问题更大了的时候,我们怎么思考一个问题。很显然必定有一个拆解的过程,而问题的关键在于怎么去拆解,这个时候面向过程与面向对象的作用就来了,我们先来看看面向过程。面向过程很难处理这样的一个大问题,原因主要体现再两点,这个问题不再是一个单纯的考试题,它是一个现实生活中的一个例子比如银行管理和图书管理等,这样的问题的特点是,它没有直接暴露出一个问题的具体实现过程,比如所我们要实现银行的管理系统,我们很难找到一个描述先怎么样再怎么样的过程,不信你可以考虑现实的银行,这些问题都是复杂而非单一的。另外,如果真的可以将这些问题拆解成小过程,这些过程也是极其复杂的,人也是很难理解的。那么关键的地方来了,为什么复杂的过程人是很难理解的,这和人的思维有关。比如说这么两个问题,如何吃饭,如何管理一家公司。对于吃饭这个问题我相信各位已经有了答案,这的重点在于如何管理一家公司,假如我是一个老板(当然这不现实),从公司成立那天开始我绝对不会要要求某个员工先干什么再干什么,另一个员工先干什么再干什么,我的第一件事情是根据不同员工的特点分成不同的部门,虽然我不清楚一个公司运营起来的步骤,但我知道每个部门应该干什么。对于部门来说,我知道部门有哪些人,这个部门做什么事情就可以了,这样在日后管理过程中,我只需直接管理某个部门而不是管某个人具体做什么事情。这样也是一个问题的拆解过程,这和面向过程有什么区别呢?第一点,在这里问题拆解是几个部分,每个部分对应的实际上是现实生活中的某个对象(这里就是部门),这样分完以后,我们该怎么思考问题呢,我只需用每个对象有什么组成,每个对象干什么即可,这里的组成不就是成员变量,做什么不就是所谓的方法吗。人大脑的特点就是容易进行现实生活中事情的处理,而面向对象的实质就是对现实世界的抽象。笔者在课堂中遇到过类似于银行管理的问题,许多人答案的的确确也实现了类似的功能,可唯一的缺点再与脱离了抽象现实,因而本人并不认可这些答案。我始终认为学习C++不是为了学习C++,而是为了学习其中面向对象的思想,事实上其中面向对象的思维也足够的复杂,并且有人认为其中的一些观念应该摒弃,目前本人开始java的学习,并且将会在java中花费长期的时间,就目前学习的过程中,给我的感触就是即使语言是不同的但是其中的思想真的是一样的,C++中的封装继承多态等观念在java中也出现了,如果掌握了思想,学起来也不再会是一头雾水了。而就目前高校上课的情况来看,一切似乎真的只是为学习而学习,老师所讲授的C++目前看来依然是面向过程的,而五周的时间也已经结束,于是可以声称会了C++了。但是真的是这样嘛,值得思考?
我忽然怀念起高中的时光,那个时候的一堂程序课,我可以学到很多东西,我记得那个时候我自己的老师和我说过,程序员的薪水和能力是呈金字塔形式分布的,大部分人的确会长时间停留在最底层,而通往高层的条件并不是知识的简单累积,而是思维方式的改变。因而我大概不会在课堂上去争谁更加优秀,我要的也许是境界的不一样,实验室有许多优秀的老师和学长,他们才是自己的榜样,而不是那些可以在课堂上靠着很丑的代码拿考试第一的人。


本人近期在学java,对面向对象思维进行了思考,于是顺手记录下来,当然我也深知这是一篇极其不成熟的文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值