软件要越来越人性化,就要代替人干很多事情。软件干的事情越多,程序设计就越来越复杂。程序越来越复杂,Programer 就有义务使程序尽可能的 Simple。
当然,这个 Simple 并不是简化需求来使代码量减少,而是运用智慧,使代码达到“繁而不乱”的效果。
对,繁而不乱,这是艺术!
为什么要求代码“繁而不乱”?这要从代码的使用角度说起。
代码,说白了,是一种人与计算机交互的语言,它的使用对象有两个:计算机,和人。
语言的作用是传递信息,而语言最根本的原则就是便于理解。
做为计算机语言,特别是现在流行的这些高级计算机语言,能不能被计算机阅读和理解,强大的开发工具随时都会告诉你。而这些语言能不能被活生生的人类理解,这就是人们自己的事儿了。
有些人坚定的认为,代码写出来就是给计算机执行的,其它问题一概不管。这倒干脆,不过这是非常危险的。因为代码不只是给计算机运行的,还有一个重要的作用就是给人阅读的。至少,你写完代码需要自己 Debug 一下吧……
其实,自从有了面向对象语言,实现代码的繁而不乱已经非常的 Easy 了。不光 Easy,而且还显得是那么的优雅。
语言都是相通的,设计者们在设计计算机语言的时候赋予了它太多人类语言的特征。所以,设计一个优秀的程序,只需要好好理解我们平时所讲的话,直接用计算机语言表达出来,就绝对是非常棒的程序。
怎么把人类语言翻译成计算机语言?简单来讲,注意以下两点就行了:
- 所有名词(代词),翻译成属性
- 所有动词,翻译成方法
举个简单的例子,拿我们平时最常说的一句话,来翻译一下:“我操你妹”。简单的四个字,三个称谓(代词),一个动词。翻译成计算机语言,就是:
我.操(你.妹)
I.Fuck(You.Sister)
I 的行为 Fuck,对象是 You 这个对象的 Sister 属性。我不管 You 的 Sister 属性是谁,叫什么。当然,如果 You 的 Sister 属性为空,即你没有妹妹,那么 Fuck 这个方法就没法执行了,应该直接跳出。(**8.26 9:49添加该段**)
怎么样?是不是对整个业务逻辑一目了然?
基于这个思想,现实中的一切都可以使用面向对象的思想来武装。
属性的设计比较简单,许多人往往会纠结于程序中的方法的设计,比如代码过长的大方法,还有逻辑过于复杂的笨方法。下面拿一个稍复杂一点的业务来实现一下以人为本的方法设计。
比如,今天早上我一觉醒来,睁开眼,开始计划今天的安排。基于人类的自然使命,和我个人的社会责任感,今天我可能要干很多事情。首先我要起床、洗漱、吃早点、上班、工作、吃饭、工作、下班、吃饭,可能我还要下班回家的路上去一趟超市买点东西,晚上吃完饭再嗨一会儿(可以打打牌,上上网,看看电视),最后睡觉。这样,今天就结束了。所以,我的大脑里立刻就会出现下面这样一份“今日计划”清单:
- 起床
- 洗漱
- 吃饭
- 上班
- 工作
- 吃饭
- 工作
- 下班
- 买东西
- 吃饭
- 休闲
- 睡觉
如果,我把我今天的计划设计成一个程序,“今日计划”的执行方法里只写这 12 行代码,无论谁来看,都能一目了然的知道我今天都要干些什么事情了。至于你起床时是把被子用手掀开还是用脚蹬掉,起床穿衣服时是先穿裤子还是先穿内裤,这是你做“今日计划”的时候不去考虑的问题,也是跟本不用你详细考虑的问题,也是阅读你代码的人不会直接关心的问题,这些都属于“起床”这个子业务的任务,或者是“起床”这个业务的子业务。比如,我的“起床”方法就这样设计:
- 伸个懒腰
- 掀开被子
- 坐起来
- 穿衣服
- 坐到床边上
- 穿鞋子
- 下床
同样,如果谁想了解我起床的过程,看这几行代码,还是一目了然。同样,穿衣服的过程都设计到“穿衣服”方法里,有条有理。
另外,至于吃完晚饭的休息时间,我可能打牌,可能上网,可能看电视,具体的决定,是看到时我具体的心情,所以我做计划时安排的是一个“休闲”时间,在这个休闲时间里,可以获取我的心情状态,根据不同的状态,来执行不同的休闲方式。
不过,具体的打牌、上网、看电视,它们不是“休闲”方法的逻辑,所以也会单独的封装成一个方法来处理。
以这种方式来分的话,整个程序逻辑清楚,结构分明。更重要的是,让读者易于理解。根本不会存在难理解的“大方法”和业务复杂的“笨方法”。
最后,我极力的不赞成使用数字来限制程序,非常不喜欢有些人拿出一些所谓的“科学”数字来做为编码准则。例如:人类同时关注的事情不超过三个,人类同能够同时处理的信息不超过七个,以及过于滥用的二八原则,还有页面大小25行等等。人类的脑袋差别太大了,这世界上的特殊情况太多了,以及各个开发人员显示器分辩率也差别太大了,所以任何用固定数字来做为行为准则的,都有些失之偏颇了。真的完全不建议。(除非你是项目经理,在制定项目规范)