关于代码重复最著名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断--不管是一个算法,一个常量集合,用于阅读的文档或者其他东西--应当只出现一次。
软件重复出现至少会导致以下问题:
- 其中的一个版本会过期
- 代码的责任会四处散开,导致代码难以理解
- 当你修改代码时,需要重复修改很多地方,一不小心就会遗漏
- 你不能很好地进行性能优化
我们可以来看看DavidHooker提出的7个软件开发原则:
第一原则: 存在的理由(Pattern: TheReason)一个软件系统存在的理由就是:为它的用户提供价值。
你所有的决定都取决于这一点。在指定一个系统需求,在写下一段系统功能,在决定硬件平台和开发过程之前,问你自己一个问题,“这样做会为系统增加价值吗?“,如果答案是”yes”,做。如果是”No”,不做。这个原则是其他原则的原则。
第二原则 KISS (Pattern: KeepItSimple) 软件设计不是一个轻描淡写的过程。
在做任何一个设计时,你必须考虑很多因素。所有设计应当尽可能简单,但是不要再比这简单了。这样产生的系统才是可以理解和容易维护的。这并不是说很多由意义的特性,因为这种简单性也要被抛弃。确实很多更优雅的设计往往更简单,但简单并不意味着“quick and dirty."。事实上,简单是通过许多思考和一次一次的反复修改才达到的。这些努力的汇报就是更容易维护,代码错误更少。 (看看是否违反)
第三原则 : 保持远见(Pattern: MaintainTheVision) 清晰的远见是一个软件项目成功的基础。
没有这样的远见,项目开发最后就变成天天为一个不好的设计做补丁。Brooks说过: 概念的完整性是系统设计中最重要的问题。 Stroustrup 也说: 有一个干净的内部结构识构建一个可理解、可辨识、可维护 、可测试系统的基础。 Booch则总结道: 只有当你对系统的体系由一个清晰的感觉,才可能去发现通用的抽象和机制。开发这种通用性最终导致系统更简单,因此更小,更可靠 如果你不断地复制、粘贴、修改代码,最终你将陷入一个大泥潭(the Big Mud),你永远不可能对系统有一个清晰的认识。
第四原则: 你制造的,别人会消费 (Pattern: WhatYouProduceTheyConsume) 软件系统不是在真空中使用的。
其他人会使用、维护、文档你的系统。这依赖于对你系统的理解。所以,你设计、实现的东西应当能够让别人理解。要记住,你写的代码并非只给计算机看,你要时时记住,代码还要给人看。(Kent Beck) 如果到处泛滥似是而非的代码,别人如何能够辨别这些代码的相似和不同,如何去理解这些代码之间具有何种关系。
第五原则: 对将来开放( Pattern BuildForTodayDesignForTomorrow) 一个成功的软件有很长的生命期。
你必须能够使得软件能够适应这样和那样的变化。所以,一开始就不要软件设计到死角上去。请总是问一下自己“如果这样,那么。。?“这个问题,你要考虑到各种各样的可能性,而不光光是图省事。复制,粘贴一下即可。
第六原则:为重用做好计划
软件模式是重用计划的一种。不断重复的代码显然不是这样的计划。 (See CommentsOnSix)
第七原则: 思考!
在采取任何动作之前首先做一个清晰、完整的考虑,这样才能产生更好的结果。如果你考虑了,但还是产生错误的结果,那么这种努力也是值得的。在你学习或研究类似的问题时,更容易理解和掌握。
这些原则告诉我们轻松地复制、粘贴和修改代码不可能产生好的,也就是容易理解、维护、重用的代码。但请不要走极端。 我一直认为,一个好的软件系统是各种因素权衡的结果,也就是你如何把握一个度的问题。重复代码产生的另外一个主要原因就是做得太多,XP有一个基本原则叫做You Arent Gonna Need It,它是说“只实现你真正需要的东西,从来不去实现你预期需要的东西“。如果你去实现你现在认为将来需要的东西,不一定就是你以后真正需要的东西。你处于现在的环境中可能无法理解你要实现东西究竟是什么样子的。你会浪费大量的时间去构造这样不知道是否必须的可能性。同时,当你真正实现的时候就可能产生重复代码。
Martin Fowler在它的Refactoring一书中有很多用来处理代码重复,包括:
1.同一个类的两个方法中有相同的表达式,使用Extract method,然后大家都调用该method;
2.两个兄弟子类之间有相同的表达式,那么在这两个子类中使用Extract Method,接着使用pull up field,移到共同的超类
3.如果结构相似而并非完全相同,用Extract method把相同部分和不同部分分开。然后使用Form Template method.
4.如果方法使用不同的算法做相同的事情,那么使用substitute algorithm
5.如果在两个不相干的类中有重复代码,那么在一个类中使用Extract class,然后在其他类中使用该class对象作为元素等等。
分享到:
相关推荐
### 软件开发的201个原则 #### 一、概述 《软件开发的201个原则》是一本全面阐述软件开发过程中应当遵循的原则性指导书籍。该书内容丰富,覆盖了从项目启动到交付的各个阶段,旨在帮助软件开发团队提高产品质量、...
《软件开发的201个原则》是一本为程序员、项目经理以及任何参与软件开发过程的人提供指导的宝贵资源。这本书涵盖了从设计到实现、测试到维护的全过程,帮助读者理解和应用这些原则来提升他们的专业能力。 1. **敏捷...
在软件开发过程中,设计原则是指导开发者构建高效、可维护和扩展软件系统的重要准则。这些原则不仅提高了代码质量,还能确保团队之间的沟通清晰,降低维护成本。以下将详细阐述一些核心的软件开发设计原则。 1. **...
《敏捷软件开发:原则、模式与实践》是Robert C. Martin(简称Uncle Bob)的一部经典著作,这本书深入探讨了敏捷开发的理念、方法和工具,尤其针对C#编程语言进行了详细阐述。作为一本实践导向的技术书籍,它旨在...
技术设计原则是软件开发的基本原则,包括规范性原则、可靠性原则、扩展性原则、开放性原则、易用性原则、安全保密原则等。这些原则是软件开发的核心要求,决定着软件项目的质量和可靠性。 2.3 可靠性原则 可靠性...
软件开发要遵循的七大原则
7. 软件开发计划书的缺点: 软件开发计划书的缺点是需要投入一定的人力和物力,编写和实施需要一定的时间和资源。 8. 软件开发计划书的应用场景: 软件开发计划书的应用场景非常广泛,涵盖了软件开发的整个过程,从...
基于构件的软件开发技术 本文以某公司生产经营管理系统为例,探讨了基于构件的软件开发问题。该系统是一个集原料采购、生产管理、物流管控...7. 基于构件的软件开发技术在软件开发中的应用(某公司生产经营管理系统)
ChinaAdvancedConstructionMaterialsGroup公司的软件开发管理制度覆盖了软件开发的各个环节,从立项管理到系统设计等多个方面进行了详细的规定。通过对这些规定的学习和理解,可以帮助企业更好地管理软件开发项目,...
7. **单元测试与集成测试**:编写测试用例以验证代码的功能和性能,是软件开发中的重要环节。单元测试关注单个模块,而集成测试则关注不同模块之间的交互。 8. **代码审查**:通过同行评审代码,可以发现潜在问题,...
为了更好地理解如何避免重复代码,我们可以参考 David Hooker 提出的七个软件开发原则: 1. **第一原则:存在的理由 (Pattern:The Reason)** —— 所有的决策都应该围绕为用户创造价值这一核心目标展开。在做每一个...
《软件工程 软件开发成本度量规范》是中国电子行业标准SJ/T 11463—2013,旨在为软件研发过程中涉及的成本估算和度量提供一套规范和指南,适用于架构师、开发工程师和造价工程师等专业人员。该标准的发布和实施有助...
CMM是一种衡量软件开发组织成熟度的模型,它分为五个等级:初始级、可重复级、已定义级、已管理级和优化级。每个级别代表不同的管理水平和项目成功率,企业通过不断提升CMM等级,可以逐步改善其软件开发过程,降低...
软件开发安全管理规定 软件开发安全管理规定是为了加强软件开发的安全管理,保护软件开发中软件和信息的安全。本规定适用于软件开发过程中的需求分析、设计、开发及测试等阶段的安全管理。 第一章总则 * 软件开发...
精益软件开发的核心原则包括: 1. 消除浪费:识别并去除不增加价值的活动,如过度设计、等待、过度加工、过度生产、运输、库存和运动。这意味着只做必要的工作,并且尽可能减少无用的工作量。 2. 客户价值优先:...
在软件开发领域,基本原则是确保项目成功、代码质量高且可维护性良好的基石。这些原则指导着开发者在设计、编码、测试和维护软件时的行为。下面我们将深入探讨这些基本原则,并结合"软件开发基本原则.pdf"中可能涵盖...
《计算机软件开发规范_GB_8566-88》是一项国家标准,旨在为软件开发过程提供一套完整的指导原则。该标准详细规定了软件开发过程中各个阶段的任务、实施步骤、实施要求、完成标志及交付文件,旨在提高开发效率和质量...
总的来说,软件开发人员行为规范是为了建立一个高效、协作、安全的开发环境,确保软件产品的质量和团队的长期发展。每一个开发人员都应深入理解并实践这些规范,以此提升个人专业素养,同时推动整个团队的进步。
在软件开发过程中,文档起着至关...合理运用这些模板,可以有效降低沟通成本,提升项目管理效率,确保软件开发的每个阶段都有明确的方向。在实际工作中,应结合具体项目需求,灵活调整和定制这些模板,以达到最佳效果。