7个软件开发原则

上传人:夏** 文档编号:559104114 上传时间:2023-03-01 格式:DOCX 页数:2 大小:15.78KB
返回 下载 相关 举报
7个软件开发原则_第1页
第1页 / 共2页
7个软件开发原则_第2页
第2页 / 共2页
亲,该文档总共2页,全部预览完了,如果喜欢就下载吧!
资源描述

《7个软件开发原则》由会员分享,可在线阅读,更多相关《7个软件开发原则(2页珍藏版)》请在金锄头文库上搜索。

1、7个软件开发原则关于代码重复最著名的单词是KentBeck的OnceAndOnlyOnce,也就是说软件操作的任何一个片断-不管是一个算法,一个常量集合,用于阅读的文档或者其他东西-应当只出现一次。软件重复出现至少会导致以下问题: 其中的一个版本会过期代码的责任会四处散开,导致代码难以理解当你修改代码时,需要重复修改很多地方,一不小心就会遗漏你不能很好地进行性能优化重复代码的产生有各种各样的原因,程序员把几行或一整段代码从这里复制到这里,然后少加修改,就变成了一份新的代码。这里的原因是程序员可以通过极少的努力就完成代码重用,但是我们可以来看看DavidHooker提出的7个软件开发原则:1第一

2、原则:存在的理由(Pattern:TheReason)一个软件系统存在的理由就是:为它的用户提供价值。你所有的决定都取决于这一点。在指定一个系统需求,在写下一段系统功能,在决定硬件平台和开发过程之前,问你自己一个问题,“这样做会为系统增加价值吗?“,如果答案是”yes”,做。如果是”No”,不做。这个原则是其他原则的原则。2. 第二原则(能简单就简单,愚蠢!)KISS(Pattern:KeepItSimple)软件设计不是一个轻描淡写的过程。在做任何一个设计时,你必须考虑很多因素。所有设计应当尽可能简单,但是不要再比这简单了。这样产生的系统才是可以理解和容易维护的。这并不是说很多由意义的特性,

3、因为这种简单性也要被抛弃。确实很多更优雅的设计往往更简单,但简单并不意味着quickanddirty.。事实上,简单是通过许多思考和一次一次的反复修改才达到的。这些努力的汇报就是更容易维护,代码错误更少。(看看是否违反)第三原则:保持远见(Pattern:MaintainTheVision)清晰的远见是一个软件项目成功的基础。没有这样的远见,项目开发最后就变成天天为一个不好的设计做补丁。Brooks说过:概念的完整性是系统设计中最重要的问题。Stroustrup也说:有一个干净的内部结构识构建一个可理解、可辨识、可维护、可测试系统的基础。Booch则总结道:只有当你对系统的体系由一个清晰的感觉

4、,才可能去发现通用的抽象和机制。开发这种通用性最终导致系统更简单,因此更小,更可靠如果你不断地复制、粘贴、修改代码,最终你将陷入一个大泥潭(theBigMud),你永远不可能对系统有一个清晰的认识。第四原则:你制造的,别人会消费(Pattern:WhatYouProduceTheyConsume)软件系统不是在真空中使用的。其他人会使用、维护、文档你的系统。这依赖于对你系统的理解。所以,你设计、实现的东西应当能够让别人理解。要记住,你写的代码并非只给计算机看,你要时时记住,代码还要给人看。(KentBeck)如果到处泛滥似是而非的代码,别人如何能够辨别这些代码的相似和不同,如何去理解这些代码之

5、间具有何种关系。5.第五原则:对将来开放(PatternBuildForTodayDesignForTomorrow)一个成功的软件有很长的生命期。你必须能够使得软件能够适应这样和那样的变化。所以,一开始就不要软件设计到死角上去。请总是问一下自己“如果这样,那么。?“这个问题,你要考虑到各种各样的可能性,而不光光是图省事。复制,粘贴一下即可。6. 第六原则:为重用做好计划软件模式是重用计划的一种。不断重复的代码显然不是这样的计划。(SeeCommentsOnSix)第七原则:思考!在采取任何动作之前首先做一个清晰、完整的考虑,这样才能产生更好的结果。如果你考虑了,但还是产生错误的结果,那么这种

6、努力也是值得的。在你学习或研究类似的问题时,更容易理解和掌握。这些原则告诉我们轻松地复制、粘贴和修改代码不可能产生好的,也就是容易理解、维护、重用的代码。但请不要走极端。我一直认为,一个好的软件系统是各种因素权衡的结果,也就是你如何把握一个度的问题重复代码产生的另外一个主要原因就是做得太多,XP有一个基本原则叫做YouArentGonnaNeedIt,它是说“只实现你真正需要的东西,从来不去实现你预期需要的东西“。如果你去实现你现在认为将来需要的东西,不一定就是你以后真正需要的东西。你处于现在的环境中可能无法理解你要实现东西究竟是什么样子的。你会浪费大量的时间去构造这样不知道是否必须的可能性。

7、同时,当你真正实现的时候就可能产生重复代码。MartinFowler在它的Refactoring一书中有很多用来处理代码重复,包括:1同一个类的两个方法中有相同的表达式,使用Extractmethod,然后大家都调用该method;两个兄弟子类之间有相同的表达式,那么在这两个子类中使用ExtractMethod,接着使用pullupfield,移到共同的超类如果结构相似而并非完全相同,用Extractmethod把相同部分和不同部分分开。然后使用FormTemplatemethod.4.如果方法使用不同的算法做相同的事情,那么使用substitutealgorithm5.如果在两个不相干的类中

8、有重复代码,那么在一个类中使用Extractclass然后在其他类中使用该class对象作为元素。等等。重复代码需要refactoring是毫无疑问的,关键在于,你如何找到重复代码,如果所有的重复代码都是死板的重复,那问题是很容易解决的。但是软件开发的复杂因素可能往往使重复代码表现为相似性而并非完全的重复。这些相似性可能并非一眼就能看出来。而是需要经过其它的Refactory步骤和一定的先见之明。另一个问题就是排除重复代码的粒度,只有大段的重复代码有价值去排除,还是即使是小小的2、3句重复代码就应该去排除。重复代码排除的基本方法是建立自己单独的方法,如果系统中许许多多的方法都很小,方法之间相互

9、调用的开销就会增加,它同时也增加了维护的开销。但是,这些开销是值得的。方法是覆盖的最小粒度,能够被覆盖的粒度越小,能够重用的范围和成都就愈广。但在这个问题上也不要走极端,只有当一个方法实现一个具体的可以用IntentRevealingName(揭示意图的名字)命名时,一段代码才值得称为一个方法,而不是考虑其代码的多少。MartinFowler在他的refactoring中描述了很多这样的例子,KentBeck则在SmalltalkBestPracticePattern中更基础地揭示了隐含在这些refactoing下的意图。下面是一个实际的例子,来自于MartinFowler在ACM上的设计专栏

10、:classInvoice.StringasciiStatement()StringBufferresult=newStringBuffer();result.append(“Billfor“+customer+“/n”)Iteratorit=items.iterator();while(it.hasNext()LineItemeach=(LineItem)it.next();result.append(“/t”+each.product()+“/t/t”+each.amount()+“/n”)result.append(“totalowed:”+total+“/n”)returnresult

11、.toString();StringhtmlStatement()StringBufferresult=newStringBuffer();result.append(“Billfor”+customer+“”)result.append(“”)Iteratorit=items.iterator();while(it.hasNext()LineItemeach=(LineItem)it.next();result.append(“”+each.product()+“”+each.amount()+“”)result.append(“”)result.append(“totalowed:”+to

12、tal+“”)returnresult.toString();asciiStatement和htmlStatement具有类似的基础结构,但是它们的实际步骤却有所不同。他们都完成三件事情:1打印发票头2循环每一个项目,并打印3打印发票尾部这种结构的相似性和意图马上上我们使用composedmethod(也就是MartinFowler的Extractmethod):interfacePrinterStringheader(Invoiceiv);Stringitem(LineItemline);Stringfooter(Invoiceiv);staticclassAsciiPrinterimple

13、mentsPrinterpublicStringheader(Invoiceiv)return“Billfor“+iv.customer+“/n”publicStringitem(LineItemline)return“/t”+line.product()+“/t/t”+line.amount()+“/n”publicStringfooter(Invoiceiv)return“totalowed:”+iv.total+“/n”象html则可以实现htmlPrinter.classInvoice.publicStringstatement(Printerpr)StringBufferresult

14、=newStringBuffer();result.append(pr.header(this);Iteratorit=items.iterator();while(it.hasNext()LineItemeach=(LineItem)it.next();result.append(pr.item(each);result.append(pr.footer(this);returnresult.toString();classInvoice.publicStringasciiStatement2()returnstatement(newAsciiPrinter();现在,statement包含

15、一个通用的结构,重复性已经被排除。更重要的是,你可以实现其它的Printer,XXXPrinter,从而能够轻易地扩展系统。BTW,MartinFowler在这里使用了DispatchedInterpretation模式statement隐瞒了内部的细节,它隐藏内部的数据和表示,当它需要Printer做一件事情时,它负责解码内部的数据结构,然后反过来把消息传给Printer.参见:MartinFowler:Refactoring:ImprovethedesignofExistingCodeKentBeck:SmalltalkBestPraticePatternACM:MartinFowlerDesigncolumn:ReducerepetationKentBeck:ExtremeProgrammingExplained

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号