阅读更多

4顶
0踩

编程语言

转载新闻 如何编写高质量和可维护的代码

2014-12-19 14:06 by 正式编辑 cao345657340 评论(1) 有3965人浏览
我们怎么做才能既不需要写很多注释,又能保证代码易于理解呢?

其中一个主要的方法就是让代码自文档化。其优势在于,既不用写注释,又能使得代码易于维护。

下面就是三种使得代码自文档化的基本方法:

  • 命名:利用名字来解释变量、函数等的目的。
  • 封装函数:将一些特定功能的代码封装成一个函数以明确目的。
  • 引入变量:将表达式插入至专用变量。

这可能看上去很简单,但在实际操作过程中会让人觉得有点棘手。首先你得明白哪些地方有问题以及哪些地方适用这些方法。

除了上面三个以外,还有一些应用范围也比较广的方法:

  • 类和模块接口:将类和模块中的函数暴露出来,让代码更加清晰。
  • 代码分组:用组来区分不同的代码片段。

接下来我们将具体讲一讲如何在实际应用中运用上面这5个方法。

1.命名

先看几个如何运用命名的方法来阐述代码使得其自文档化的例子。

重命名函数

给函数命名通常都不会太难,但是这里面也有一些需要遵循的简单规则:

避免使用含糊的字眼,例如“handle”或“manage”——handleLinks、manageObjects。

使用主动动词——cutGrass、sendFile,以表示函数主动执行。

指定返回值类型——getMagicBullet、READFILE。强类型的语言也可以用类型标识符来表明函数的返回值类型。

重命名变量

指定单位——如果里面有数值参数,那可以加上其单位。例如,用widthPx来取代width以指定宽度的单位是像素。

不要使用快捷键——a和b都不能作为参数名。

封装函数

关于这一点,我们将举几个如何把代码封装成函数的例子。此外,这么做还有一个好处是,可以避免重复代码。

将代码封装成函数

这是最基本的:将代码封装成函数以明确其目的。

猜猜下面这行代码是干什么的:
var width = (value - 0.5) * 16;

好像不是很清楚,当然有注释就一清二楚了,但是我们完全可以封装成函数以实现自文档化……
var width = emToPixels(value);

function emToPixels(ems) {
    return (ems - 0.5) * 16;
}

唯一改变的是计算过程被转移到了一个函数里。该函数名明确地表达了它要做什么,这样一来就不必写注释了。而且,如果有需要后面还可以直接调用此函数,一举两得,减少了重复劳动。

用函数表示条件表达式

If语句如果包含多个运算对象,不写注释的话理解起来就比较难。
if(!el.offsetWidth || !el.offsetHeight) {
}

知道上面这代码的目的不?
function isVisible(el) {
    return el.offsetWidth && el.offsetHeight;
}

if(!isVisible(el)) {
}

其实,只要将这些代码封装到一个函数里,那就很容易理解了。

引入变量

最后再讲讲如何引入变量。相较于上面两个方法,这个可能没那么有用,但是无论如何,知道比不知道好。

用变量替换表达式

还是上面这个if语句的例子:
if(!el.offsetWidth || !el.offsetHeight) {
}

这次我们不封装函数,改用引入变量:
var isVisible = el.offsetWidth && el.offsetHeight;
if(!isVisible) {
}

用变量替换程式

我们也可以用来清楚说明复杂程式:
return a * b + (c / d);

var divisor = c / d;
var multiplier = a * b;
return multiplier + divisor;

类和模块接口

类和模块的接口——也是面向公共的方法和属性——有点像说明如何使用的文档。

看个例子:
class Box {
    public function setState(state) {
        this.state = state;
    }

    public function getState() {
        return this.state;
    }
}

这个类也可以包含其他代码。我特意举这个例子是想说明公共接口如何自文档化。

你能说出这个类是如何被调用的吗?很显然,这并不明显。

这两个函数都应该换个合理的名字以表述它们的目的。但即便做到这一点,我们还是不怎么清楚如何使用。然后就需要阅读更多的代码或者翻阅文档。

但是如果我们这样改一下呢……
class Box {
    public function open() {
        this.state = open;
    }

    public function close() {
        this.state = closed;
    }

    public function isOpen() {
        return this.state == open;
    }
}

明白多了,是吧?请注意,我们只是改动了公共接口,其内部表达与原先的this.state状态相同。

这么一改,我们一眼看去就知道怎么用。原先那个函数名虽然不错,但是依然让我们觉得云里雾里,还不如后者直截了当。像这样做一个小小的改动产生大大的影响,何乐而不为呢?

代码分组

用组来区分不同的代码片段也是自文档化的一种形式。

例如,像这篇文章中说的那样,我们应该尽可能将变量定义在靠近使用它的地方,并且尽可能将变量分门别类。

这也可以用来指定不同代码组之间的关系,这样更加方便其他人知道他们还需要了解哪些代码组。

看看下面的例子:
var foo = 1;

blah()
xyz();

bar(foo);
baz(1337);
quux(foo);


var foo = 1;
bar(foo);
quux(foo);

blah()
xyz();

baz(1337);

将foo的所有使用组合放在一起,一眼望去就能知道各种关系。

但是有时候我们不得不在中间调用一些其他函数。所以如果可以那就尽量使用代码分组,如果不可以,那就不要强求。

其他建议

  • 不要自作聪明。看看下面这两个等价的表达式:

imTricky && doMagic();

if(imTricky) {
    doMagic();
}

很显然后者更好。

  • 命名常量:如果代码里面有一些特殊值,那最好给它们命名。var PURPOSE_OF_LIFE = 42;
  • 制定规则:最好遵循相同的命名规则。这样阅读的人就能在参考其他代码的基础上正确猜测出各种事物的含义。

结论

要想能使代码自文档化提高其可维护性是一个非常漫长的历程。每个注释都需要花心力去写,所以尽量精简方可省时省力。

然而,自文档化的代码永远取代不了文档和注释。因为代码在表述上总有其限制,所以写好注释亦是不可或缺的。此外,API文档于类库而言非常重要,因为光靠阅读代码是理解不了的,除非这个类库真的是小得不能再小。
来自: 码农网
4
0
评论 共 1 条 请登录后发表评论
1 楼 Co7Co7 2014-12-22 10:18
对于周期很短的项目而言,实际中不能投入更多的人力和时间去维护和优化代码整体质量,如果要实现笔者的推荐的编写方式需要在项目启动前就规定好,这样第一次将事情做对,才能编写出真正的合理的质量代码。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • PSCodeHealth:PowerShell模块收集PowerShell代码质量和可维护性指标

    PSCodeHealth允许您根据与以下有关的各种指标来评估PowerShell代码的质量和可维护性: 码长 代码复杂度 代码异味,样式问题和违反最佳做法 测试和测试范围 基于注释的帮助 它可以让您确保您的代码符合指标目标...

  • 如何编写高质量和可维护的C++代码?

    性能优化:编写高效的代码,避免不必要的复杂性和重复计算,并使用合适的数据结构和算法。使用有意义的变量和函数名:命名应反映其用途和功能,避免使用过于简短或模糊的变量名。函数长度限制:控制函数的长度,避免...

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

    如何提高代码质量和可维护性: 良好的代码质量和可维护性是每个软件开发者都应该追求的目标。在本文中,我将分享一些实用的技巧和建议,帮助您提高代码质量,使代码更易读、可维护和可扩展。

  • 【代码质量的重要性:如何编写具有高质量标准的代码】

    从编程实践技巧角度,需要关注代码简洁性、可读性、可维护性和可测试性,具体的实践建议包括遵循编码规范、使用版本控制、追求代码复用、持续集成和交付、使用自动化工具等。从软件工程方法论角度,需要注重需求分析...

  • 什么样的代码是高质量的代码?

    “怎么才算可读性好?什么样的代码才算易扩展、易维护?可读、可扩展与可维护之间有什么关系?可维护中的‘维护’两字该如何理解?”,

  • 禅与计算机科学程序设计艺术:如何通过映射提高你的代码可读性和可维护性?

    代码维护是一种对代码进行维护和管理的方法,它可以帮助程序员更好地理解代码的含义,并为代码添加更多的注释。的方法,它可以帮助程序员更好地理解代码的含义,并为代码添加更多的注释。代码文档化是一种将代码转换...

  • 如何写高质量代码

    (3)注释编写的步骤: ​ 1)不管你心里再想什么,先把它记录下来 ​ 2)读一下这段注释,看看它有什么改进的地方 ​ 3)不断改进 (4)什么地方不需要注释 ​ 1)能从代码本身中快速推断的事实 ​ 2)用来...

  • 如何提高代码可读性、可维护性

    高质量代码的三大要素: 可读性、可维护性和可变更性 做好代码规范、提高代码质量,能显著增强代码的可读性、可维护性和可变更性。努力提高代码的读写可维护性,是做好代码规范的必要非充分条件。代码规范和架构...

  • 怎么保证前端的代码质量?

    一般的团队开发,对代码质量是有较高要求的,对于有代码洁癖的人来说,乱糟糟的代码肯定是无法接受的。 如何保证前端的一个代码质量呢?我们一般从这四个角度考虑: 1、制定编码规范 2、开发工作流lint风格强制检查 ...

  • 模块化编程:提高代码复用和可维护性的重要实践

    模块化编程是一种提高代码复用和可维护性的重要实践。通过将程序划分为独立的、有组织的...通过不断的实践和学习,可以更深入地理解模块化编程的概念和实践,并将其应用于实际项目的开发中,提高代码的质量和可维护性。

  • 代码优美,搬砖不累:探索高质量代码之路

    写出高质量代码是每个程序员的追求,也是提高自己编程能力的必经之路。

  • 如何写出易于维护的Vue代码(踩坑经验)

    在开发时你心里是否在想着:把功能实现就行了!如果是,那么该文章比较适合你。 如何写出易于维护的代码?看了就知道。

  • 如何写出高质量的代码?

    与其写出一段漏洞百出的代码,倒不如仔细分析再写出鲁棒的代码。代码的鲁棒性鲁棒是英文 Robust 的英译,有时也翻译成健壮性。所谓的鲁棒性是指程序能够判断输入是否合乎规范要求,对不和要求的输入予以合理的处理。...

  • 写出高质量代码的标准

    而不规整,一团乱麻的代码会降低人的维护者的思想预期和心里的愤愤感,每当分析问题时,会像大海捞针半天抓不到主脉络和层次结构,这样后面会越来越难维护,后面只能重构,这对项目来说会消耗大量的人力和时间成本;...

  • 解锁 ESLint 的秘密:代码质量的守护者(下)

    基本规则:这些规则是 ESLint 的核心规则,用于确保代码的语法和风格符合一定的规范。例如,规则用于检查未使用的变量,indent规则用于检查缩进风格等。语言规则:这些规则是针对特定语言的规则,例如 JavaScript、...

  • 编写高质量的代码(1)

    第三:高质量的编码. 第四:快速的解决程序的问题. 第五:发散思维. 第六:团队默契合作. 第七:相信总可以解决任何问题.   稍后等于永不!   写代码要循序渐进,即写一段代码就运行检验一下; 对于程序员来说,...

  • 如何提高代码质量,或者说高质量代码的特征是什么

    高质量代码的三大要素: 可读性、可维护性和可变更性!! 做好代码规范、提高代码质量,能显著增强代码的可读性、可维护性和可变更性。努力提高代码的读写可维护性,是做好代码规范的必要非充分条件。代码规范和...

  • 利用eclipse编写高质量的java代码

    Java项目开发过程中,由于开发人员的经验、Java代码编写习惯,以及缺乏统一的标准和管理流程,往往导致整个项目的代码质量较差,难于维 护,需要较大的测试投入和周期等问题。这些问题在一个项目组初建、需求...

  • 【自然语言处理(NLP)】机器翻译之数据处理(数据收集、数据清洗、数据分词、数据标注、数据划分)

    【自然语言处理(NLP)】机器翻译之数据处理(数据收集、数据清洗、数据分词、数据标注、数据划分)

  • fence-agents-rhevm-4.2.1-41.el7-9.6.x64-86.rpm.tar.gz

    1、文件内容:fence-agents-rhevm-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-rhevm-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

Global site tag (gtag.js) - Google Analytics