65.9K
CodeProject 正在变化。 阅读更多。
Home

编码最佳实践和解决方案

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.22/5 (9投票s)

2015年3月19日

CPOL

17分钟阅读

viewsIcon

24404

本文主要介绍了可在任何编程语言中采用的最佳实践,这些实践可以提高代码的可维护性和可重用性。

引言

编码或编程是关键活动和工程方法,通过这种方法,终端用户在需求方面设想的系统得以实现。换句话说,这可以被描述为一种活动,为我们试图构建的应用程序的架构和设计实现提供程序化表示。在任何软件开发项目中,大部分精力都花在构建上,因此这项活动需要得到正确关注,以确保项目的成功。

随着行业的不断发展,以及最新的工具和技术,行业参与者所实践的各种方法和成熟的流程,编码活动可以更加精简,并以实现最佳结果为目标。通常,通过遵循一套最佳实践可以实现最佳的编码/编程,其中包括一个明确定义的方法论,一个最适合编码所用底层技术的、高度成熟的框架,各种有助于程序员专注于逻辑核心、将基本功能交给成熟技术处理的工具,以及标准化的审查、返工和重构步骤。

编码过程始于任何项目早期阶段的解决方案制定,在许多情况下,即使是概念验证(POC)代码也构成了后期开发的基础。在本白皮书中,我们将介绍将在任何典型的中等规模开发项目中广泛遵循的编码最佳实践。大部分描述将包含在各种类别中,如下所示:

  1. 确定方法论
  2. 确定和使用开发工具
  3. 调整要使用的流程
  4. 应用程序编码
  5. 签入签出流程
  6. 自动化构建流程
  7. 单元测试和集成测试
  8. 审查和返工

通过遵循以下最佳实践,我们将能够在预估的成本和时间内,以高质量产出最佳产品。

描述

上述各个步骤是面向过程开发中的关键组成部分。拥有明确定义的流程对于实现项目最佳成果至关重要,因为这些流程步骤是在行业执行了数百个项目后获得的经验中发展起来的。

我们将详细探讨每个步骤,看看它们在项目编码阶段的作用,以及开发团队在定制它们以满足其需求方面的灵活性。

 以下是项目有效利用编码最佳实践所必需的最基本步骤。

1. 确定方法论(生命周期)

首先要做的是确定要使用的方法论。它可以是测试驱动开发、结对编程或敏捷方法论,如极限编程。下一步是集思广益,就什么构成编码的“完成”步骤达成一致。这应该清楚地定义开发人员何时可以认为其代码是完整的。例如,在典型的项目编码阶段,编码、单元测试、审查、返工、集成测试和文档编写将是调用任何代码“完成”的强制性步骤。这应该在项目早期阶段达成一致,并且每位开发人员都应该了解这一点。

此步骤还应在项目开始时确定代码的可接受状态。应该定义开发人员应交付的成果。

2. 确定和使用开发流程工具

这是软件开发中另一个基本步骤。这一步被认为是至关重要的,因为项目的设计和开发活动将在此基础上开始。要使用的工具和技术的每个决定都将在塑造应用程序方面发挥关键作用。此步骤包括选择以下内容:

a)    识别项目的各种基础设施。这包括识别所需的各种服务器,以及标准化要使用的软件,包括操作系统和需要应用的补丁。例如,用于日常测试、SIT 和 UAT 的服务器类型应相同,并且应与建议的 PROD 环境相似。
b)    使用哪个 IDE(Eclipse、JDveloper、Netbeans 等)
c)    构建哪些其他自定义工具来处理日常操作。例如,它可以是一个简单的活动,如设置用户数据以在应用程序中导航。应识别这些活动,并编写自动化脚本来减轻开发人员的负担,而不是手动插入记录。
d)    使用哪个构建工具。
e)    使用什么存储库来管理源代码
f)    单元测试工具,如 HttpUnit 或 JUnit
g)    审查检查表
h)    使用不同类型的代码风格检查。

3. 调整要使用的流程

此步骤是为了确定和商定在编码阶段将遵循的步骤。此流程始终是因项目而异,因为每个项目应用的方法论在很多方面都会有所不同。

每位开发人员在开发应用程序时都应遵守要遵循的方法论。

a.    应对将要处理的模块进行充分的需求讲解。每位开发人员也有责任确保他们正在处理的模块的需求足够清晰,以便在应用程序的测试阶段提出问题。
b.    应就将进行多少审查达成一致。例如,是否只进行同行评审,还是由领导进行评审,或两者都进行。
c.    应就是否将在计划中添加代码重构的计划活动,或者是否没有空间进行重构达成一致。
d.    应就何时更新可追溯性矩阵达成一致。
e.    应就开发人员交付的应用程序是否由业务分析师验证后再称为“完成”达成一致。

此外,使用许多可用工具对代码进行静态分析也是一种最佳编码实践。这只不过是无需实际执行已开发软件即可对其进行的分析。有时可以通过仅获取源代码的某个版本来完成,有时可以通过使用目标代码来完成。为此目的有许多可用工具,如 PMD、JProfiler、OptimizeIT 等。

每位开发人员都有责任确保他们开发的 कोड 满足客户需求,并产生最少或零缺陷。例如,Java 开发人员应能够从前端到数据库进行编码,其中应包含最少的事务且无任何缺陷。最终,每位开发人员交付的源代码在单元测试级别应无缺陷。

一旦我们就一套流程达成一致,就应在团队 undertaking 的所有活动中严格遵循。

4. 应用程序编码(开发阶段)

应用程序编码是软件开发过程中至关重要且关键的、甚至是微小的开发活动。最佳编码将始终产生具有最少/零缺陷的最佳应用程序。这可以通过采用标准的编码标准来实现。

编码标准或编程风格可以很容易地定义为一套标准规则,为了交付标准的应用程序而必须遵循。它包括从在代码中编写注释到将代码部署到生产环境的整个过程。

通常,每家公司都会形成自己的编程风格/编码约定,这本身又是建立在现有的标准编码约定之上的。此外,不同编程语言也有一些不同的编码约定。

通过实施标准的编程风格,可以有效地可视化编写的源代码的物理外观。良好的编程风格也总是能开发出精细的应用程序。任何开发人员,无论使用何种编程语言,都应始终以其他开发人员能够理解代码编写目的的方式进行编码。此外,一个重要的关键点是,任何开发人员在编写代码时都应牢记可维护性的重要概念,以便将来对应用程序进行任何增强。

软件工程领域的一个事实是,大多数开发人员需要大量时间来根据客户需求进行编码和测试应用程序。这可能是由于截止日期非常短、开发人员正在处理的应用程序/模块的复杂性、对需求没有清晰的认识等原因。在这种混乱的情况下,大多数开发人员无法提供有关他们编写的源代码的更多信息。在这个编码阶段,很容易发现许多可维护性问题。

因此,随着应用程序每天的不断增长,上述情况会造成很大的混乱。在高峰期,开发人员可能会发现理解自己编写的代码非常困难。因此,作为最佳实践的一部分,每位开发人员都应始终遵循为编程语言定义的标准编码约定进行编码。

根据“面向对象健美操”,在编写面向对象代码时应遵循以下 9 条重要规则:
1.    每个方法只使用一个缩进级别
2.    不要使用 else 关键字
3.    包装所有原始类型和字符串
4.    每行只使用一个点
5.    不要缩写
6.    保持所有实体小型
7.    不要使用超过两个实例变量的类
8.    使用一流的集合
9.    不要使用任何 getter/setter/属性

在没有单元测试的情况下签入代码在软件开发过程中是不可接受的,也是一种糟糕的做法。每位开发人员都应能够对他们正在编写的代码部分进行单元测试。未经单元测试的代码被认为是糟糕的编程实践。这种单元测试机制有助于开发人员确保编写的代码适用于后续的系统集成测试(SIT)和用户验收测试(UAT)等高级测试阶段。

5. 源代码管理(签入和签出过程)

代码编写完成后,必须将其签入存储库,并在其中维护标准的项目结构。这样,任何稍后加入项目的开发人员都可以从存储库中签出代码,并开始处理各自的模块。为了实现这一点,应遵循标准的代码签入和签出流程。以下是一些可用于创建代码存储库的工具:
a)    Sub Version (SVN)
b)    Concurrent Versioning System (CVS)
c)    Visual Source Safe (VSS)
d)    Mercurial
e)    Git

由于在每个 IT 行业中,一个文档或源代码文件被团队中的其他成员编辑或使用已成为一种常规做法。这可能是因为人们在不同的地理位置工作。

此代码签入过程的主要目的是在一个位置创建项目的集中式存储库,并使源代码可供可能需要对其进行增强的其他开发人员使用。换句话说,这是为了维护开发代码的版本控制。由于在开发应用程序时,许多人会在同一文件上工作,因此应实现适当的版本控制机制,以便可以合并所有更改并再次签入。因此,每当开发人员签出版本化的文件时,它将显示为更新的文件,并包含不同开发人员所做的所有更改。

基本上,在使用任何修订工具时,文件的每个修订版本都会创建一个时间戳。这将帮助新开发人员知道何时以及在文件中进行了哪些更改,以便他们能够继续进行。

在开发人员从 SVN/VSS/CVS/Git/Mercurial 等版本控制系统签出任何文件之前,应确保这些详细信息。

6. 自动化构建和部署流程

代码经过单元测试并签入存储库后,就应该有一个自动化的部署流程来将应用程序部署到不同的测试环境中。在开发大型应用程序时,拥有一个持续集成环境是很有好处的,在该环境中,签入的代码可以标记为没有编译问题。有许多开源工具可用于实现这一点。例如:Hudson Build Tool、Cruise Control 等。

持续集成是一种软件开发实践,团队成员会频繁地集成他们对应用程序的工作。通常,这个过程一天会产生多次集成。为了避免在集成需要更改时出现基本的编译错误,每次集成都会通过构建进行测试,以检测任何类型的编译问题。通过采用这种最佳实践,业内许多人已经在提供稳定的构建供测试方面取得了显著进步,避免了此类编译问题。

软件开发过程中一个主要的挑战性任务是获取一个运行的应用程序以及编写的源代码,并使其可供测试过程使用。事实上,在获取一个运行的应用程序时,许多任务都可以自动化,例如源代码的编译、为部署生成 war/jar 文件、配置应用程序应指向的数据库。

此外,另一个好的做法是,在每个重要的里程碑之后都对源代码进行分支。源代码分支就是从主干中复制代码,该代码是从特定点派生的,基于一些标准,例如达到代码完成或 SIT 开始的里程碑。这是为了保持主干源代码的完整性。对这个分支的代码库进行所有后续的更改和修复,并对其进行稳定化。因此,一旦应用的更改按预期工作,相同的代码库就会被合并回主干。

在为新构建签出代码时,始终是一个好习惯。它应该被标记一个特定的名称和其他基本细节。这样,如果当前构建失败,构建人员总有机会部署之前工作正常的构建。这样就可以始终确保应用程序的可用性。此外,使用此标记概念来保存代码的一个重要原因是,特定的标记代码是主要版本(如 alpha、beta 或 RTM 版本)的一部分。这个标记代码就是代码的一个时间点视图,它描绘了应用程序的当前状态。

7. 应用程序测试

测试是应用程序开发中不可或缺的过程。应始终确保应用程序的每个模块的测试过程都是主动进行的。在软件开发过程的代码编写阶段之前准备测试用例是一个非常好的实践。这样,就可以确保将要开发的 कोड 能够满足所有客户需求。

软件开发过程中的最基本应用程序测试级别是单元测试。这是一种方法,通过该方法对编写的源代码的每个独立单元进行测试,并确定应用程序是否适合使用。单元是应用程序中最小的可测试部分。

单元测试用例总是因项目而异。但是,开发人员总是会为各自的模块编写和执行单元测试用例,以确保他们编写的代码满足设计的期望并按预期运行。

单元测试过程的主要目标是根据设计和需求稳定应用程序的每个部分。每个单元测试都为开发人员提供了一个书面合同,每段源代码都应满足该合同。

可以使用 JUnit 或 HTTPUnit 等工具来实现单元测试。JUnit 是最常用于单元测试框架/工具之一。

因此,一旦开发人员成功完成了单元测试过程,就必须将相同的代码签入存储库,并在新项目中签出源代码,然后必须对应用程序进行严格测试。这是一个回归测试过程,以确保签入的代码不会破坏其他现有模块。

除了采用单元测试等基本级别的测试之外,进行代码覆盖率分析也是一种很好的实践。它是一种结构化测试技术,用于比较测试程序的行为和源代码的预期意图。基本上,这是一个过程:
a)    找出由一组测试用例未执行的程序区域,
b)    创建额外的测试用例以增加覆盖率,以及
c)    确定代码覆盖率的量化度量,这是质量的间接度量。
进行此技术的基本思想是确保测试用例集的质量,而不是确定产品的质量。代码覆盖率分析需要访问测试程序的源代码,并且通常需要使用特殊命令重新编译它。

8. 审查和返工

一旦成功部署到目标服务器,开发人员就有责任确保其模块按照应用程序的设计和开发进行操作。应用程序中会有许多审查过程。这可能是从代码审查的基本步骤开始,在代码审查中,源代码将被审查以检查是否正在实施编码约定和其他基本编码实践。
    
始终应根据源代码和模块审查后提供的审查意见进行适当的返工。还必须确保返工次数最少,并且包含较小的更改。

QA 团队将测试应用程序的回归问题,并检查应用程序的功能是否完好。一旦应用程序中出现问题,就会为其提出缺陷,并要求相关开发人员查看该问题。一旦开发人员了解到他们各自模块中存在的问题,就需要根据 QA 团队给出的审查意见开始着手修复该问题。

摘要

遵循最佳编码实践将始终带来更好的应用程序。以上是在许多 IT 行业中用于交付稳定、性能更好的应用程序的关键编码最佳实践。总结一下,在任何软件开发生命周期过程中采用最佳编码实践的关键优势如下:

1.    在计划的精力、成本和时间内,以最少的返工获得高质量的产出。
2.    可以构建和交付一个非常可扩展的应用程序,该应用程序可以成为未来应用程序更改的基础。
3.    项目中的后续阶段(如 SIT/UAT)将按计划进行,因为大部分问题将在单元测试阶段找到。
4.    交付的代码也将满足客户的期望。
5.    由于应用程序的质量很高,将减少返工工作。
6.    这总是可以减少重复劳动。
7.    改进的风险管理。
8.    它消除了时间和资源的浪费性投资。
9.    此外,这实际上将提高团队的士气。

© . All rights reserved.