生活中的OO智慧——大话面向对象五大原则

世间万物,以俗眼观纷纷各异,以道眼观种种是常。面向对象思想不仅是编程的智慧,同样也是人生的智慧。通过生活去领悟面向对象的智慧,以面向对象的智慧来指导生活。

(部分图片取自How I explained OOD to my wife

一·单一职责原则(Single-Responsibility Principle)

定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

生活中的OO智慧——大话面向对象五大原则

宿舍里并不能好好学习,自习还是得去图书馆。这是一条颠扑不破的真理!被无数学子千百次的实践所证明!我就想不通了,宿舍里有桌有椅,能上床小睡,能下床读书,饿了吃外卖,渴了喝奶奶,自个习,凭啥就不行?后来,由于我刻苦地学习,增涨了科学文化知识,这才搞明白,原来我们的宿舍违背了“单一职责原则”。除了不是厕所,宿舍既是卧室,又是餐厅,既是书房,又是厨房,还是游戏机室兼棋牌室,甚至还兼琴房及健身房。我勒个去!你想看书,甲在看球,乙在泡面,丙在泡脚,还有一大波同学随时准备过来串门,发小广告,送外卖。所以,“看书”这个“方法”还是得放在“图书馆”这个“类”,或者“自习室”这个“类”中,因为这是它们的职责,并且它们是职责单一的。并不是说宿舍里就绝对不可以看书,而是由于它承担了过多的职责,这些职责在并发执行的时候就会相互干扰。

“单一职责原则”其实也蕴含着深沉的人生智慧——任何事情要想做好就必须要专心致志地做——轩辕黄帝曰“守一”,尧舜薪传“惟精惟一”,《周易》曰“贞一”,老子曰“执一”,管子曰“专一”,都是在教导我们这个朴素的道理。学习也好,工作也好,要想取得成就,就必须要“惟精惟一”。社会生产之所以要分工,如今更是高度分工,同样也是因为这个道理。大浪淘沙,作为一名程序员,如何在激烈的竞争中站稳脚跟,甚至立于不败之地呢?没有别的办法,一个字:“精一”!如果你还在对各种技术泛泛地涉猎,却没有一样拿手好戏,那么赶紧依据“单一职责原则”重构一下自己吧!

二·开放封闭原则(Open-Closed Principle)

定义:软件实体应当对扩展开放,对修改关闭。

生活中的OO智慧——大话面向对象五大原则

如果你想让自己更好看,无非有两种办法。你可以穿花衣服,做头发,涂各种霜擦各种粉,可以戴帽子戴蛤蟆镜戴红领巾,这些都是“扩展”。另外,你也可以割双眼皮,开眼角,垫鼻梁垫眉弓垫下巴,祛咬肌磨腮,而这些当然就是“修改”。之所以要对扩展开放而对修改关闭,是因为修改常常是危险的,是需要付出代价的。因整容失败而惨死手术台的新闻早就不稀奇了,至于韩苗可、乔丝琳-威登斯坦、风扇大妈这样的例子我就不举了,不是怕吓着大家而是自己害怕。很简单的道理嘛,一修改就容易出现Bug,而且常常是些意想不到的Bug,Duang ~ ~,加特技的Bug!

生活中的OO智慧——大话面向对象五大原则       生活中的OO智慧——大话面向对象五大原则

说到这里,另外一件修改源代码的事就不得不提了——转基因!犹记得高中学生物的时候,一个令人闻风丧胆的名字深深地刻进了彼时我幼小的心灵,历久弥新,那就是——“BT毒蛋白”——我天!变态毒蛋白!这是有多毒!这变态毒蛋白本源自“苏云金芽孢杆菌”,后来,伟大的科学家们发现了它,并将它的基因片段拼切到了转基因水稻、转基因大豆,转基因棉花上(粮油棉全给占领了!),怎么看怎么像科幻片中的怪博士毁灭世界的节奏······虽然关于转基因作物安全性的问题至今仍有争议,但是这种修改造物主底层源代码的行为让身为程序员的我们倍感担忧啊!谁知道会出现什么样的Bug!也许某天Duang ~ ~的一下,就出现了一个加特技的Bug

扩展阅读:转基因辩论复旦教授落败于崔永元

三·依赖倒转原则(Dependency-Inversion Principle)

定义:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

生活中的OO智慧——大话面向对象五大原则

前些年我们经常听到一个说法,叫“一切向钱看”,的确是当今社会的某种真实写照。愤青朋友请稍安勿躁,关于现代性批判的话题后头我们会谈,这里还是先来肯定一下资本主义的巨大成就。假使我们是原始社会,并没有钱。好了,我想吃肉!可是咱家穷,没肉。而我的邻居养了几只野鸡,但是“偷来抢来做女婿换来”恐怕都不妥,好在我前些日用玄铁打了一只绝世好剑,于是我对邻居道:“拿我绝世好剑换君一只鸡,何如?”,邻居曰;“要得!”,于是我有了一顿豪华午餐。一个月后,我又想吃肉!这回我拿出刚炼好的一颗大还丹,对邻居道:“拿我起死回生大还丹换汝一只鸡,中不中?”,邻居白我一眼,道:“我—要—喝—奶—奶!”。没办法,为了吃鸡,我跑到七里之外的隔壁部落,先找一个老婆婆,用我起死回生大还丹换了她两个坛子,又拿其中一个坛子跟当地一个养奶牛的大伯换了一坛奶,刚好用另一个坛子装回去(还是蛮机智的!),然后把奶给邻居喝了,当然坛子还得还回来,我这才如愿以偿吃到了一只野山鸡。渐渐的,大家都觉得这样换东西实在太麻烦了!于是,大家交都愿意换最常用的东西,比如盐啊,布啊,斧子啊,因为这些东西基本家家都要用而且以后方便换成其他东西。可是,有些人口味淡不要盐,有些人阴虚火旺不要布,有些人老弱病残不要斧子,况且,盐容易撒,布容易破,斧子容易生锈,所以还是不方便。

生活中的OO智慧——大话面向对象五大原则

于是再后来,货币就诞生了,它的作用就是充当“一般等价物”任何商品都有其价值,所谓交换无非是按各自的价值量来交换,既然如此,那就找一个东西代表这个抽象的价值量,其他东西都来跟个它换就OK了!而这不正体现了“依赖倒转原则”吗?

四·里氏代换原则(Liskov-Substituent Principe.)

定义:所有引用基类的地方必须能够透明地使用其子类的对象。

生活中的OO智慧——大话面向对象五大原则

亚里士多德著名的三段论:“人都是有死的,苏格拉底是人,所以苏格拉底是有死的。”这不就是一个“里氏代换”吗?同样,你、我、他都is-a人,根据里氏代换原则当然也都是“有死的”。

  “人固有一死”这个道理大家都知道,但是不见得都懂得。托翁有篇小说叫做《伊凡·伊里奇之死》,讲的是一个小人物,半生庸庸碌碌,比上不足比下有余,突然有一天生病住进了医院,医生护士、亲戚朋友们都说“你会好起来的。”起初他自己也这样认为。可是没过多久他突然意识到,自己这回恐怕好不了了,于是陡然意识到“死亡”其实是一个相当严肃的问题!我们平时总是在逃避“死亡”问题,对其敷衍塞责。正如所有人不假思索地对伊凡·伊里奇说“你会好起来的”,就像你订外卖催单的时候客服永远不假思索地答复“已经送出去了!”。鲁迅先生有篇著名小说——某家生了个大胖小子,一人说:“这小子以后一定会发财!”,主人敬酒;一人说:“这小子以后一定会做官!”,主人致谢;一人说:“这小子以后一定会死。”,乱棍打出!我们逃避对死的思考,某种意义上就是在逃避对生的思考。

生活中的OO智慧——大话面向对象五大原则

中国人忌讳说“死”常换成说“百年之后”,而“百年”就好比“飞流直下三千尺”的“三千尺”,反正就是很长很长,我们总觉得“来日方长”。可是事实上,即便“寿终正寝”也无非就是“秋后问斩”。而剩下的人则随时会被自然灾害、交通事故、突发疾病、飞来横祸夺去生命!死其实离我们很近!就如同一把悬在我们头顶的达摩克利斯之剑。所以海德格尔这样定义死:“死是最本己的,无所关联的,确知而不确定的,超不过的可能性。”既然死是“可能性”,那我们就必须面向“可能性”筹划选择自己的人生。所以海德格尔主张“提前到死中去”亦即“向死而生”!*曾讲“中国人连死都不怕还怕困难?”,在“人终有一死”面前还有什么事情不能去做呢?还有什么事情不能去尝试呢?人生苦短,老病相催,真要在碌碌一生之后才发现“一失足成千古恨,再回首已百年身”吗?

      参考阅读本人另一篇博客清明时节欲断魂——未知死焉知生?——向死而生! 

五·接口隔离原则(Interface-Segregation Principle)

定义:客户端不应该依赖那些它不需要的接口。

生活中的OO智慧——大话面向对象五大原则   

  网络快速改变着人们的心智状态,让人们始终处于“在线(on-line)”状态。我们的思考是众包的、公布式的,不再有中心。我们总是看别人在发表什么观点,总是听别人在聊什么话题,于是转发、转发,再转发。你看姚晨做公益,你跟任志强骂房价,你学李开复做自己,你在方韩大战中站队……你的内心是由他们构成的杂拌儿。可你自己呢?我们为别人而活——为了父母的期待,领导的盼望,同事朋友之间的比较而活得争先恐后,可你有为自己活过吗?我们被各种刺激出来的欲望裹挟——我们想向别人一样住大房子,开豪车,想出人头地,有一百部想看的电影,想周游世界,想投资理财,想买各种看得顺眼的商品,可是你清楚自己究竟需要什么吗?

  生活中的OO智慧——大话面向对象五大原则  

  我们不应依赖于那些我们不需要的接口。当年,苏格拉底在看到摆卖的奢侈物品时,说道:我不需要的东西可真不少啊!叔本华曾说:“正如一个不需要或只需要很少进口物品的国家,才是最幸运的国家,同样,如果一个人内在充足、丰富,不需要从自身之外寻求娱乐,那么,这个人就是一个最幸运的人。因为进口物品使国家花费不菲,仰仗他人,同时又带来危险、制造麻烦。”老子说:“五音令人耳聋,五色令人目盲,驰骋田野令人心发狂。”庄子讲:“堕肢体,黜聪明,吾丧我。”孔子讲“反求诸己”,孟子讲“反身而诚”,曾子讲“一日三省吾身”,禅宗讲“明心现性”,王阳明讲“致良知”,脱离了对外物迷乱的追求,才能真正关照到内在的本心。

  所以请根据“接口隔离原则”重构一下自己! 

上一篇:JavaScript -- Navigator


下一篇:JavaWeb 后端 <八> 之 JDBC基礎(全)