标签:
这篇博客我酝酿已久,但却迟迟未下笔,主要原因在于觉得自己目前还是难以驾驭这样宏大的命题,对我这样一个连入门级菜鸟都算不上的人而言,谈论这种话题难免会有纸上谈兵之嫌,以至于贻笑大方.但是我写技术博客主要的目的还是用记录、分享自己技术成长道路上的一些个人领悟,只要是有自己的思考,哪怕若干年后回头来看显得幼稚甚至有错误之处,也无妨嘛.
其实长久以来,说起编程我心里总是会犯怵,通俗点说叫有点虚,这并不是说我完全写不了程序,而是觉得自己对程序设计缺乏一种思考框架,就仿佛少了根主心骨.今天你让我写个PageRank算法,我能给你撸出来;明天你让我实现三维人体动画,我花点功夫也能搞出来.但是面对一些基本的问题,我却完全没有头绪,例如:
到底为什么需要类? 书上明明说用类来表示概念才是精华,可你看我什么类也不用不照样把PageRank,Hits算法实现的好好的嘛...
面向对象又是什么? 随手翻开一本教材书上一会说面向对象有三大特征:封装继承多态;一会又是说面向对象是对现实世界的模拟,一切都是对象,对象之间通过消息机制来沟通;然后再过几天看了个视频里面的老师讲的又是面向对象的终极意义在于减少重复代码啊......然后就各种凌乱了.
还有设计模式呢? 昨天才听人说设计模式和重构才是软件开发的倚天屠龙,今天一打开知乎然后发现怎么下面的回答清一色全是在喷设计模式呢?打开四人帮的书看看我靠一共23种模式呢,这尼玛对我这种记忆力差的人可该如何是好啊,难道我应该苦修数载把这23个设计模式都背的滚瓜烂熟,了然于心,然后用的时候在头脑中遍历一遍看看哪个适合?可23个还是太多了感觉自己记不过来啊......
你说这些问题有意义吗,感觉都是一些形而上的东东啊,跟实际的编程实践感觉不怎么搭界呢,好像也没见过周围人有过类似的困惑呢?
我的回答很明确,非常重要,而且是第一位的重要,至少对我个人而言.仿佛是黑夜里在无边无际的大海中绝望的漂浮,突然看见远方有一座灯塔的感觉.
之前说的思考框架,其实换做一种更专业的名词,叫做编程范式.
所谓编程范式,就是你在编程时对具体问题的抽象方式;而面向对象,则是编程范式的其中一种.
我们到底该如何理解面向对象呢,它的灵魂到底是什么?
拯救我于纷乱表象的是知乎上一位前辈invalid‘s的回答,http://www.zhihu.com/question/20275578/answer/26577791这篇回答我前后看了不下十遍,甚至在纸上写过好几遍,当时就有一种久旱逢甘霖的感觉,因为它实实在在的解答了困扰我心中的一些长久的困惑.当然现在回过头来看,这个回答有它自身的局限性,我后面会谈到,但是它却帮我建立了一个思考的起点.
从那之后我在心中明确了如下几点:
面向对象≠封装+继承+多态,而等于封装+(继承/多态);继承(接口继承)和多态是一枚硬币的正反面,而不是平等的关系,多态是目的,继承是实现多态的手段.
面向对象的好处是:
1.通过封装隐藏内部实现,暴露给用户接口,使得接口和实现分离,用户使用起类来更安全;
2.多态即归一化.归一化即简化用户的使用.通过继承的方式提炼出一个公共基类,基类提供接口,派生类负责实现,在C++中通过将基类的引用或指针指向派生类对象,就能获得使用简洁、一致的外在接口实现缤纷杂乱的内在执行逻辑的好处.
如果第二点让你觉得抽象不直观,我再举个生活中的具体例子你立马就能明白多态的好处了.例如插电插头,电插头的电器种类数量不计其数,接线板背后iude线路更是复杂无比,但是这些都无所谓,对与用户而言,只需要将插头对准孔插进去一切就OK了.什么是归一化,这就是归一化,一言以蔽之,简化用户使用逻辑.用户当然无需关注墙后面电路的走向,也无需关注抽头的内部电路机制,只需要这么一插(使用接口),就行了.
面向对象的好处就这两点.
未完待续......
标签:
原文地址:http://www.cnblogs.com/floristt/p/4700577.html