if…else…是一个伟大的发明程序员
if…else…就像当年的AK47,成本低廉,足够简单,简单到连小孩子都轻易理解;同时if…else…足够强大,就像AK47,一梭子扫过来,打得人抱头鼠窜。if…else…确实很强大,强大到你稍不留意,就能使一段代码被众多的if…else…搞得复杂无比。。。算法
如何正确使用if…else…是门艺术设计模式
if…else…本质来讲是条件控制语句,它能够用来实现强大的流程处理,这一点无可厚非。然而,不少时候,咱们把if…else…做为一种实现技巧,为提升减小代码量,提升所谓的“复用率”,或者说为了使程序更“精练”。架构
例如,A、B功能模块具备相似的业务流程,但输入数据不一样,某一个字段的处理不一样,因而聪明的程序员很天然的在A模块的业务方法中增长了一段if…else…,根据传入参数,来控制那个特殊字段的处理。这样实现是正确的,至少在当时的业务需求前提下能够很好的提升编码较率。但这么作的本质,其实是把不一样业务实体之间的条件控制,转移到了业务实体之中,把本来互相独立的模块,紧密地结合在了一块儿。很明显在咱们写这样的自觉得很精练、妙趣横生的代码时,咱们把每天挂在嘴边的“高内聚,低耦合”抛到九霄云外了。。。学习
好景不长,初版华丽的收尾了,第二版接踵而至,第二版增长了C模块,C模块的输入和A、B一致,但逻辑处理和输出与A、B差别较大。需求人员乐呵呵地描述了需求,心想C和A、B其实复杂度差很少,以前作A、B也没遇到什么问题,此次能有什么问题呢?但是实现人员对此愤愤不平:这乍改,谁说复杂度差很少了,C和A、B明显不同啊?!但他的话很明显是没有说服力的。他无奈地接受了这个纠结的命运——在以前A、B的那个if…else…后面再加了一个else,即便A、B、C真正共同复用的只有if前面那两行代码。。。测试
再后来的状况或许你们都猜到了,A、B、C、D……,终于加到了第十个模块,这个时候if…else…已经盘根错节。同一个字段承担了好几个模块场景下的不一样业务意义的数据,只由于这些数据都是date类型。。一个整型数据,在一个模块处理中是业务数据,在另外一个场景则变成了逻辑控制的一部分。。在无所不能的if…else…里,一切皆有可能,这个时候,程序员以经没法彻底按照本身的意愿去改这坨代码了,他们每每按照测试时的运行结果来调整各处代码。。客观的说,此时的代码,已经不按人类的意志来运行了!愚蠢的人类啊,他们一手创造了这一切,确发现他们没法掌控这一切,而当这些自觉得是的人类意识到问题的严重性时,结局已经难以挽回了。。编码
积极重构,合理使用设计模式破除if…else…spa
再回过头来看看,最开始时把A、B模块作如此高的复用,对仍是不对呢?固然是正确的,至少在当时是正确的:开发经理眉开眼笑,效率很高啊,来个效率之星表彰一下吧~复用是必需的,只是复用的方法不对而已。两个模块,咱们很容易发现其共性,三个或三个以上呢?其实也很简单,设计模式啊~好比大量类似的表单,能够用装饰模式、建造者模式,取表单数据能够和责任链、命令模式等。咱们一遍又一遍的学习设计模式,但很多人仍是对此不觉得意,认为咱们日常实现过程没机会用设计模式,致使各类模式看多少遍忘多少遍。其实不须要特地套用某个设计模式,能够借助其思想,咱们要用设计模式来实现业务,没有哪一个业务是为了某个设计模式而存在的。值得注意的是,没有哪个设计模式将条件控制语句做为其实现的凭仗。设计模式是为了解耦,而if…else…其实就是一种耦合。设计
功能点与功能点估算的准确性orm
功能点估算是比较先进的估算方法,功能点估算把各个功能当作互相独立的操做和文件来处理,所以才能达到不一样的人做出估算得出相近结果的效果。若是在实现过程当中利用功能模块内部的条件控制来实现不一样模块的复用,这样确定会使工做量小于估算,因而功能点估算时引入了“复用程度”的概念。但问题是,“复用程度”还比较好估计,“不复用程度”呢,估算的时候,谁能预测以前的代码会对现在的需求产生什么影响呢?由于这自己就是个笑话,以前代码怎么会影响将来的需求,本末倒置啊。但事实的状况是,它还真影响了,或者说是阻碍了新功能的引入。功能点具备不可控的工期,功能点估算就不许了。在功能模块内部使用if…else…是极不合理的复用方法,等若饮鸩止渴。
功能点估算法,客观上要求咱们不去糅合两个不一样模块,这与复用并不矛盾。正确的方法其实很简单,只要注意条件控制语句若是不可必免必定只能加在功能外部,把复用的部分抽取出来便可。引入其余功能时,也要极力避免在已抽取的方法内添加if…else…,随着复用的方法抽取愈来愈多,咱们就会慢慢意识到,这里有点像XX设计模式耶。因此说,好的代码、好的设计、好的架构,都是改出来的。
总结
没有人刻意去写烂代码,每每咱们嗤之以鼻的烂代码,每一坨都不是自然造成的。一坨烂代码的造成,是日积月累的结果,项目团队人员更迭,甚至是几批、几代程序员共同奋斗的结果。if…else…有一种神奇的魔力,它依靠else if这种神奇的特性,把一坨坨代码串在一块儿。正如破窗效应,程序员们每每不由自主地在if…else…后继续添加if…else…。做为优秀的程序员,咱们必定要有足够的定力,出淤泥而不染,拒绝if…else…的诱惑。一时爽一下,但终究仍是要还的。
记住,珍惜生命,预防猝死,远离if…else…