`

如何提高代码质量二 可维护性

    博客分类:
  • Java
阅读更多
2. 可维护性
  软件的可维护性有几层意思,首先的意思就是能够适应软件在部署和使用中的各种情况。从这个角度上来说,它对我们的软件提出的要求就是不能将代码写死。
  1)代码不能写死
  我曾经见我的同事将系统要读取的一个日志文件指定在C盘的一个固定目录下,如果系统部署时没有这个目录以及这个文件就会出错。如果他将这个决定路径下的目录改为相对路径,或者通过一个属性文件可以修改,代码岂不就写活了。一般来说,我在设计中需要使用日志文件、属性文件、配置文件,通常都是以下几个方式:将文件放到与类相同的目录,使用ClassLoader.getResource()来读取;将文件放到classpath目录下,用File的相对路径来读取;使用web.xml或另一个属性文件来制定读取路径。
  我也曾见另一家公司的软件要求,在部署的时候必须在C:/bea目录下,如果换成其它目录则不能正常运行。这样的设定常常为软件部署时带来许多的麻烦。如果服务器在该目录下已经没有多余空间,或者已经有其它软件,将是很挠头的事情。

2)预测可能发生的变化
  除此之外,在设计的时候,如果将一些关键参数放到配置文件中,可以为软件部署和使用带来更多的灵活性。要做到这一点,要求我们在软件设计时,应当有更多的意识,考虑到软件应用中可能发生的变化。比如,有一次我在设计财务软件的时候,考虑到一些单据在制作时的前置条件,在不同企业使用的时候,可能要求不一样,有些企业可能要求严格些而有些要求松散些。考虑到这种可能的变化,我将前置条件设计为可配置的,就可能方便部署人员在实际部署中进行灵活变化。然而这样的配置,必要的注释说明是非常必要的。
  软件可维护性的另一层意思就是软件的设计便于日后的变更。这一层意思与软件的可变更性是重合的。所有的软件设计理论的发展,都是从软件的可变更性这一要求逐渐展开的,它成为了软件设计理论的核心。

3. 可变更性
  前面我提到了,软件的变更性是所有软件理论的核心,那么什么是软件的可变更性呢?按照现在的软件理论,客户对软件的需求时时刻刻在发生着变化。当软件设计好以后,为应对客户需求的变更而进行的代码修改,其所需要付出的代价,就是软件设计的可变更性。由于软件合理的设计,修改所付出的代价越小,则软件的可变更性越好,即代码设计的质量越高。一种非常理想的状态是,无论客户需求怎样变化,软件只需进行适当的修改就能够适应。但这之所以称之为理想状态,因为客户需求变化是有大有小的。如果客户需求变化非常大,即使再好的设计也无法应付,甚至重新开发。然而,客户需求的适当变化,一个合理的设计可以使得变更代价最小化,延续我们设计的软件的生命力。

1)通过提高代码复用提高可维护性
  我曾经遇到过这样一件事,我要维护的一个系统因为应用范围的扩大,它对机关级次的计算方式需要改变一种策略。如果这个项目统一采用一段公用方法来计算机关级次,这样一个修改实在太简单了,就是修改这个公用方法即可。但是,事实却不一样,对机关级次计算的代码遍布整个项目,甚至有些还写入到了那些复杂的SQL语句中。在这样一种情况下,这样一个需求的修改无异于需要遍历这个项目代码。这样一个实例显示了一个项目代码复用的重要,然而不幸的是,代码无法很好复用的情况遍布我们所有的项目。代码复用的道理十分简单,但要具体运作起来非常复杂,它除了需要很好的代码规划,还需要持续地代码重构。
  对整个系统的整体分析与合理规划可以根本地保证代码复用。系统分析师通过用例模型、领域模型、分析模型的一步一步分析,最后通过正向工程,生成系统需要设计的各种类及其各自的属性和方法。采用这种方法,功能被合理地划分到这个类中,可以很好地保证代码复用。
  采用以上方法虽然好,但技术难度较高,需要有高深的系统分析师,并不是所有项目都能普遍采用的,特别是时间比较紧张的项目。通过开发人员在设计过程中的重构,也许更加实用。当某个开发人员在开发一段代码时,发现该功能与前面已经开发功能相同,或者部分相同。这时,这个开发人员可以对前面已经开发的功能进行重构,将可以通用的代码提取出来,进行相应的改造,使其具有一定的通用性,便于各个地方可以使用。
  一些比较成功的项目组会指定一个专门管理通用代码的人,负责收集和整理项目组中各个成员编写的、可以通用的代码。这个负责人同时也应当具有一定的代码编写功力,因为将专用代码提升为通用代码,或者以前使用该通用代码的某个功能,由于业务变更,而对这个通用代码的变更要求,都对这个负责人提出了很高的能力要求。
  虽然后一种方式非常实用,但是它有些亡羊补牢的味道,不能从整体上对项目代码进行有效规划。正因为两种方法各有利弊,因此在项目中应当配合使用。

2)利用设计模式提高可变更性
  对于初学者,软件设计理论常常感觉晦涩难懂。一个快速提高软件质量的捷径就是利用设计模式。这里说的设计模式,不仅仅指经典的32个模式,是一切前人总结的,我们可以利用的、更加广泛的设计模式。
  a. if...else...
  这个我也不知道叫什么名字,最早是哪位大师总结的,它出现在Larman的《UML与模式应用》,也出现在出现在Mardin的《敏捷软件开发》。它是这样描述的:当你发现你必须要设计这样的代码:“if...elseif...elseif...else...”时,你应当想到你的代码应当重构一下了。我们先看看这样的代码有怎样的特点。

if(var.equals("A")){ doA(); }
else if(var.equals("B")){ doB(); }
else if(var.equals("C")){ doC(); }
else{ doD(); }  


这样的代码很常见,也非常平常,我们大家都写过。但正是这样平常才隐藏着我们永远没有注意的问题。问题就在于,如果某一天这个选项不再仅仅是A、B、C,而是增加了新的选项,会怎样呢?你也许会说,那没有关系,我把代码改改就行。然而事实上并非如此,在大型软件研发与维护中有一个原则,每次的变更尽量不要去修改原有的代码。如果我们重构一下,能保证不修改原有代码,仅仅增加新的代码就能应付选项的增加,这就增加了这段代码的可维护性和可变更性,提高了代码质量。那么,我们应当如何去做呢?
  经过深入分析你会发现,这里存在一个对应关系,即A对应doA(),B对应doB()...如果将doA()、doB()、doC()...与原有代码解耦,问题就解决了。如何解耦呢?设计一个接口X以及它的实现A、B、C...每个类都包含一个方法doX(),并且将doA()的代码放到A.doX()中,将doB()的代码放到B.doX()中...经过以上的重构,代码还是这些代码,效果却完全不一样了。我们只需要这样写:

X x = factory.getBean(var); x.doX();  

这样就可以实现以上的功能了。我们看到这里有一个工厂,放着所有的A、B、C...并且与它们的key对应起来,并且写在配置文件中。如果出现新的选项时,通过修改配置文件就可以无限制的增加下去。
  这个模式虽然有效提高了代码质量,但是不能滥用,并非只要出现if...else...就需要使用。由于它使用了工厂,一定程度上增加了代码复杂度,因此仅仅在选项较多,并且增加选项的可能性很大的情况下才可以使用。另外,要使用这个模式,继承我在附件中提供的抽象类XmlBuildFactoryFacade就可以快速建立一个工厂。如果你的项目放在spring或其它可配置框架中,也可以快速建立工厂。设计一个Map静态属性并使其V为这些A、B、C...这个工厂就建立起来了。

b. 策略模式
  也许你看过策略模式(strategy model)的相关资料但没有留下太多的印象。一个简单的例子可以让你快速理解它。如果一个员工系统中,员工被分为临时工和正式工并且在不同的地方相应的行为不一样。在设计它们的时候,你肯定设计一个抽象的员工类,并且设计两个继承类:临时工和正式工。这样,通过下溯类型,可以在不同的地方表现出临时工和正式工的各自行为。在另一个系统中,员工被分为了销售人员、技术人员、管理人员并且也在不同的地方相应的行为不一样。同样,我们在设计时也是设计一个抽象的员工类,并且设计数个继承类:销售人员、技术人员、管理人员。现在,我们要把这两个系统合并起来,也就是说,在新的系统中,员工既被分为临时工和正式工,又被分为了销售人员、技术人员、管理人员,这时候如何设计。如果我们还是使用以往的设计,我们将不得不设计很多继承类:销售临时工、销售正式工、技术临时工、技术正式工。。。如此的设计,在随着划分的类型,以及每种类型的选项的增多,呈笛卡尔增长。通过以上一个系统的设计,我们不得不发现,我们以往学习的关于继承的设计遇到了挑战。
  解决继承出现的问题,有一个最好的办法,就是采用策略模式。在这个应用中,员工之所以要分为临时工和正式工,无非是因为它们的一些行为不一样,比如,发工资时的计算方式不同。如果我们在设计时不将员工类分为临时工类和正式工类,而仅仅只有员工类,只是在类中增加“工资发放策略”。当我们创建员工对象时,根据员工的类型,将“工资发放策略”设定为“临时工策略”或“正式工策略”,在计算工资时,只需要调用策略类中的“计算工资”方法,其行为的表现,也设计临时工类和正式工类是一样的。同样的设计可以放到销售人员策略、技术人员策略、管理人员策略中。一个通常的设计是,我们将某一个影响更大的、或者选项更少的属性设计成继承类,而将其它属性设计成策略类,就可以很好的解决以上问题。




使用策略模式,你同样把代码写活了,因为你可以无限制地增加策略。但是,使用策略模式你同样需要设计一个工厂——策略工厂。以上实例中,你需要设计一个发放工资策略工厂,并且在工厂中将“临时工”与“临时工策略”对应起来,将“正式工”与“正式工策略”对应起来。
  
分享到:
评论

相关推荐

    如何提高代码质量

    本文将深入探讨提高代码质量的三大要素:可读性、可维护性和可变更性。 **可读性**是代码质量的基石。代码应清晰易懂,让其他开发者能迅速理解其功能和逻辑。这包括但不限于: 1. **避免大段代码**:过长的函数或...

    如何在C++中实现代码可维护性分析工具集

    在C/C++开发中,代码可维护性分析是一个关键步骤,它可以帮助开发者识别潜在的问题,提高代码质量,降低维护成本。以下是如何在C/C++项目中实现代码可维护性分析的详细指南。 集成代码可维护性分析工具到C/C++项目中...

    如何提高c_c++代码质量

    高质量的代码能够提高软件的可维护性、可读性和可扩展性,减少 bug 和错误的出现。本文总结了提高C++/C代码质量的经验,旨在帮助软件开发者编写高质量的代码。 1. 文件结构 文件结构是编写高质量代码的基础。一个...

    软件可维护性探讨

    软件可维护性探讨 软件维护是软件生存周期的最后阶段,所有活动都发生在软件交付并投入使用之后...因此,在软件开发各阶段都应该保证软件的可维护性,以提高软件的质量、延长软件的生命周期、降低软件维护阶段的费用。

    参考资料-C.0.1-0610 系统实时性、可维护性、可靠性分项工程质量验收记录表.zip

    良好的文档、模块化设计、代码质量、测试策略等都是提高系统可维护性的关键因素。 3. **系统可靠性**:可靠性则是指系统在特定时间内,按照预期功能运行的概率。它是评估系统稳定性的重要指标。系统可靠性可通过...

    提高代码质量的方法.

    在编程世界中,代码质量是决定软件稳定性和可维护性的重要因素。对于Java开发者来说,遵循最佳实践可以显著提升代码质量。以下是从标题、描述和部分内容中提炼出的一些关键知识点: 1. **语法规范**: - 避免易...

    深入剖析C++代码可维护性分析:工具、策略与实

    集成代码可维护性分析工具到C/C++项目中,可以显著提高代码的可读性和可维护性。通过选择合适的工具、编写分析代码、集成到构建系统和CI流程,可以自动化代码质量检查过程,提高开发效率和软件质量。 通过本文的...

    C++代码可维护性报告生成:策略、工具与实践指

    通过将这些步骤集成到开发流程中,可以显著提高C/C++代码的可维护性,降低长期维护成本,并提高软件的整体质量。 通过本文的介绍,读者应该能够理解代码可维护性的重要性,并掌握在C/C++项目中生成代码可维护性报告...

    一堂如何提高代码质量的培训课(2)

    这堂“如何提高代码质量的培训课(2)”旨在深入探讨如何通过有效的方法和技术来提升代码质量,从而构建更加可靠、可维护和高效的软件系统。我们将从源码管理和工具应用两个核心方面进行详细阐述。 首先,源码管理...

    Python中的类型注解:提升代码质量和可维护性

    类型注解是Python编程中一个强大的工具,它可以提高代码质量,减少类型错误,并增强代码的可维护性。虽然Python的运行时不会强制类型检查,但类型注解与静态类型检查器和IDEs的结合使用,可以在开发过程中提供巨大的...

    一堂如何提高代码质量的培训课

    【提高代码质量】是软件开发领域中至关重要的议题。...总的来说,提高代码质量是一个持续的过程,需要开发者在编码时时刻关注可读性、可维护性和可变更性,通过不断的重构和优化,使得代码更加健壮、易于理解和维护。

    如何提高代码质量(管理篇):代码复查

    首先,代码复查的目的在于提高代码的可读性、可维护性和可靠性。它可以帮助开发者遵循编程最佳实践,避免低级错误,并确保代码符合团队的编码标准。复查过程中,审查者不仅检查语法错误,还会关注逻辑错误、性能瓶颈...

    浅析计算机软件可维护性方法-如何度量软件可维护性WORD文档版本.docx

    2. 代码审查:定期进行代码审查,以便找出潜在问题并提高代码质量。 3. 自动化测试:建立自动化测试框架,确保软件修改后的正确性。 4. 持续集成和持续部署(CI/CD):自动化构建和部署过程,减少人为错误。 5. 代码...

    代码质量管理资料 包

    在IT行业中,代码质量管理是确保软件开发过程中的关键环节,旨在提高代码的可读性、可维护性和稳定性。本资料包包含了一系列与代码质量管理相关的文章和文档,涵盖了多个重要方面,如代码评审、单元测试、程序复杂度...

    提高php代码质量 36计 转载开源中国社区

    合理规划路径、重构文件加载机制、合理管理调试代码以及确保代码的跨平台兼容性,都是提升PHP项目稳定性、可维护性和效率的关键步骤。希望每位开发者都能从中获益,不断精进自己的技能,创造出更加优秀的软件产品。

    提高代码质量的157个建议

    在编程领域,代码质量至关重要,它直接影响到软件的可维护性、可扩展性和性能。针对C#编程语言,以下是从“提高代码质量的157个建议”这一主题中提炼出的一些关键知识点: 1. **遵循编码规范**:统一的命名规则、...

    如何全面的提高代码质量

    ### 如何全面提高代码质量 #### 什么是代码质量 在软件开发领域,代码质量是指代码在可维护性、可读性、效率等方面的表现。高质量的代码不仅能够减少后期的维护成本,还能提升软件产品的整体性能与用户体验。好的...

    高质量代码有三要素:可读性、可维护性、可变更性

    我们评价高质量代码有三要素:可读性、可维护性、可变更性。我们的代码要一个都不能少地达到了这三要素的要求才能算高质量的代码。一提到可读性似乎有一些老生常谈的味道,但令人沮丧的是,虽然大家一而再,再而三地...

    关于c语言编译预处理与代码质量的提高的三篇论文

    4. **代码维护和更新**:探讨数据嵌入对代码维护的影响,以及如何在保证可维护性的前提下使用这种方法。 这三篇论文结合了理论与实践,旨在提升程序员对C语言编译预处理的理解,并通过编码技巧提高代码质量。对于中...

    java代码质量控制

    Java代码质量控制是软件开发过程中不可或缺的一环,它...利用各种工具,结合人工审查,可以有效地提高代码质量,为软件项目的成功打下坚实基础。开发团队应重视并实践这些工具和方法,以不断提升开发效率和软件质量。

Global site tag (gtag.js) - Google Analytics