您的位置:网站首页 > app开发 > 郑州软件开发公司 > 正文

软件编程中的重复程序代码

作者:知网科技 日期:2020/6/17 人气:
标签:

 郑州软件公司今天要谈的主题是重复程序代码的力量,

 
        在正式开讲之前先来解释一下何谓“重复代码”(duplicated code)常见重复代码的状况有:系统中有好几个函数(function或是method)有着完全一样或类似的内容与结构,或是同样的程序代码区块或表达式散布在不同的函数之中。产生重复代码最大的原因,就是开发人员采用"复制"与"粘贴"的方式来撰写程序——在开发新功能的时候,发现新功能跟旧有的程序代码很像,所以二话不说先把旧有的程序代码复制一份,然后再慢慢地修改。久而久之,系统便到处出现许多重复代码。
 


        

        系统中如果出现重复代码,不但会让程序变得冗长,更会造成维护与扩充上的问题。试想一下,如果有一段程序代码在乡民们的系统中重复出现了三次,假设这段程序代码中有一个bug,当乡民们要去修复这个bug的时候,就要记得同时改到这三个地方。如果需要修改程序的时候每次都能够记得改到每一份晕复代码也就算了,大不了开发人员累一点,做做苦工多改几次。但问题在于一般稍具规模的软件系统,程序代码好歹至少也是几万行。每次修改程序的时候,都要能够百分之百确定系统中所有受影响的重复代码都有被正确修改到,这并不容易。这种炎似大海捞针的要求,几乎是一件不可能完成的任务。因此,Kent Beck在《极限编程:拥抱变化》一一书中就建议开发人员,最好能够遵守『一次且仪一次(once and only once)J的原则。确定数据、程序结构、程序逻辑在系统中仪存在于一个地方,以免产生重复代码。

 
        重复代码会造成程序代码虚胖、程序不易修改、增加开发人员修改系统所需花费的州司与精力、增加系统产生缺陷的几率等。在Martin Fowler的名著《重构》中,就将“重复代码”列为程序代码坏味道(bad smells  in code)j:,也就是通缉清单中的首要通缉犯,必须除之而后快,方可确保软件的质量。

   
        看到这里,乡民们可能会想:奇怪了,既然重复代码是写程序应该要避免的一种坏味道,为什么这种坏东西还会有“力量”?别忘了在《星球大战》中,尤达(Yoda)大师也曾经说过要留意暗势力(the power of darkside)j,这种暗势力有时候比正义的力量更强大(不然黑武士为什么那么强)o

   
        那么,重复代码到底有什么力量?  Teddy发现,重复代码最大的力量就是可以让程序设计师看起来很忙且生产力很高。多么神奇的力量啊!
 

        


        讲讲从朋友那里听来的一个故事,真的是听来的,绝对不是发生在我周遭的人身上。故事是这样的,有一个小型的软件开发团队,在没有采用Scrum之前,团队里的每一位成员都各自负责若干个子项日(sub-proj ect),彼此也几乎不去看其他人所

写的程序代码。后来,这个团队不小心无缘无故被强迫中奖而实行了Scrumo经过若干sprint之后,闲闲没事的ScrumMaster突然有一天心血来潮去检视某一个子项目的程序代码。不看不知道,看了之后吓~大跳。这个子项目里面的程序代码虽然是用Java这个面向对象语言所写的,但是整个程序设计逻辑却是极端的非面向对象(迷之音:基本上就是c程序语言借尸还魂在Java身上),可理解度大概只有20%还不到吧。但是由于当时这个子项日的程序可以正常执行,ScrumMaster也就没有立即建议要重构该模块,反而是偷偷许愿,让老天保佑永远不需要改它。

   
        但是,如果真的不用修改,这个故事也就讲不下去了。某一天,该团队突然发现这个子项目在多线程(multiple-threaded)的情况会出错,而原本的负责人(在此称之为M先生)在事迹败露之前早已想办法厂逃j到其他项目中。为了解决此问题,ScrumMaster花了一点时间以面向对象的方式来重新设计该子项目,然后与其中一位稍微了解这个子项目的开发人员一起采用结对编程的方式重新写了这个子项曰。完成之后,原本在多线程执行环境所遇到的bug自然也就消失了。但这不是重点,重点是ScrumMaster很无聊地算了一下该子项日r改造前j和厂改造后的程序行数(line of code,LOC):

    .
          改造前:约1 0000行。

          改造后:约2000行。

  

 

         

 
        再仔细一看,原本的程序充满了重复代码,很明显可以看得出来,原作者当初就是用“复制”与“粘贴”这种不花脑筋的方法在开发程序。除了原作者,地球上可能找不到第二个人可以维护这个系统。改造后,由于采用良好的面向对象设计,不但程序行数大减,而且所有的团队成员也都有能力实际参与了这个子项目的开发。

    

   
        在真实世界中,有多少人(多少主管或同事)会帮你做“程序代码检视”(code review)j?在我们这里应该极少。冈此,谁说罩复代码是一种坏味道;从M先生的观点,重复代码可是又香又浓的“好味道”(good smell)j呢!要不是有这些晕复代码的帮忙,如何做到每天都有生产力呢?

   
        老板:我的员工每天都加班,工作好认真,好辛苦喔!

        Teddy:你确定???

   
        也许大部分的老板或主管都忙到只能对员工实施“形式管理”,无法了解员工每日实际工作内容的细节。此时,重复的程序代码很可能会被不肖人士给滥用,摇身一变从坏味道变成了好味道(Teddy内心独白:这箅是软件界的三聚氰胺吗?如果乡民们的公司奉行的是丰田生产系统(Toyota Production System, TPS)的精神,强调“现场管理”,那么,坏人将无处遁形。重复代码肯定是种坏味道,小可能像是黑道漂白一样,一夕之间变身为好味道。不过话说回来,在台湾,谁开发软件那么“精益”呢?

   
        因为文化因素,重复代码在中国,可能有90%以上的几率是属于good smell。


(())
顶一下
参与讨论
姓名: 验证码:看不清楚,换一个
最新评论

联系我们

软件开发: 15838307519(司经理)

网络营销: 13676968269(王经理)

网络建设: 13073737771(郭经理)

24小时服务电话: 0371-56683330

了解更多APP开发

+好友