• 什么样的代码算是烂代码?
  • 发布于 2个月前
  • 92 热度
    0 评论
  • Vinda
  • 3 粉丝 34 篇博客
  •   
每个人的性格、技术水平和工作经历都不一样,看待“好代码与烂代码”的标准也各不相同,下图是一张比较出名的关于在Code Review中评判代码质量的图片。

那什么样的代码属于烂代码呢?我们一起来看一下吧!

一.逻辑混乱,实现复杂
代码可读性很差,主要包括:
1.各种魔法数字、奇葩变量名
2.没有注释或注释含义模糊,经常词不达意,一问才知道是忘记更新注释了
3.混乱的代码结构,各种条件判断、面条式代码、回调嵌套
4.冗余复杂的实现,会“茴字的四种写法”等秀技操作并不会帮助整个系统有质的飞越

5.不简洁,由于个人水平的限制,无法写出简洁优雅的代码;亦或者是对系统里面使用的库与框架不熟悉,不知道原本就有类似的功能,自己实现了一套比较复杂的封装


基本上就是我第一年写代码的状态,当时jQuery还比较流行,满页面都是$xxx.parent.parent.find(xx).nextSiblings之类的代码。代码是用来描述逻辑的,而混乱的代码是Bug源头。现在借助各种IDE或lint工具,基本上可以规避各种奇奇怪怪的写法,保证代码风格的统一。

二.不够健壮,难以测试
我们无法预料产品会如何变化,也无法预料用户产品使用方式,当程序没有覆盖到所有的场景时,就可能会出现bug:
1.各种没有考虑到的边界情况、外部依赖异常,隔三差五的报错或崩溃
2.修复了一个bug,又引入了10个bug

3.缺少异常处理,难以定位bug


错误处理,最基本的就是使用try...catch,然后在历史项目中也见到过很多错误使用的代码。try...catch并不是让我们把错误吞掉,而是为了在系统不会因为我们编码时未能覆盖的情况导致崩溃。没有明显的错误并不代表么有错误,反之,如果将一个错误静默地catch处理掉,我们就无法获取系统真实的问题了。

健壮性评判的一个标准就是单元测试的覆盖率:如果害怕出bug,那就应该让bug早点出现,最简单的方法就是进行测试。单元测试的好处大家都知道,但我接手过的项目,除了少部分基础工具库和组件库项目外,其他都很少见到测试用例;甚至是我自己目前负责的项目,也经常是在事后才去补上一些基础的测试用例,覆盖率更是低的可怜。

一方面是开发任务比较紧,来不及提前编写测试用例;另外一方面是之前的历史代码有许多地方包含全局变量或外部依赖,很难进行单元测试
// 要测试下面这个方法,还需要对外部变量name进行mock
function test(){
 return `hello ${name}`
}

// 相反,如果函数的逻辑只依赖于参数,则很容易进行测试
function test2(name){
 return `hello ${name}`
}
最简单的判断是:依赖越多,测试越难。因此,还需要保证良好的模块划分,避免循环依赖,这就涉及到另外一个话题:如何对项目代码进行分层管理

三.难以维护
“维护”的含义包括了修复旧代码、开发新功能,“难以维护”的含义就是很难修改旧代码、很难添加新功能。烂代码所有的特点最后带来的影响都是难以维护,而易于维护的代码,需要满足下面几个要求:
1.流程清晰,不论是从结果(如视图展示)倒推,还是从入口(初始化应用)顺推,能让维护者明白整个代码的流程
2.容易找到改动的地方,从一个1000行的函数中找到某个if判断然后修改,想想都头疼
3.维护者能很清晰的评估本次改动的的修改范围,不会有遗漏的地方
4.维护者能很清晰的评估本次改动的的影响范围,不会产生意料之外的结果
5.有良好的代码风格,每次修改之后仍旧能保持统一的风格和可维护性

6.易于扩展,方便添加功能


很多代码在最初的版本,往往是清晰可查的,随着功能的迭代、需求的变化,就逐渐偏离了原本的设计,最后成为了烂代码。为什么我的代码会逐渐变烂呢?这也是本文主要思考和探究的问题。刚入行的时候就听到了一个常用来调侃产品的段子:这个需求很简单,怎么实现我不管。

站在开发的角度来看:产品不懂技术,他根本不知道我的代码里面xxx不是这样设计的,看起来实现这个需求只需要xxx,实际上我要改很多地方,还需要回归balabala。
站在产品的角度来看:整个应用的功能我是最熟悉的,按照之前的产品设计,这个改动符合逻辑,应该很快就能实现。

那么问题来了:到底是哪里出了问题?
最近我开发完某个功能之后,在本地开发环境向产品演示并确认整个功能流程,这个时候我突然产生了一些困惑:为啥我开发花了一天,演示只需要花费两三分钟呢?毕竟这个功能又不像“向地址栏输入url后,展示整个页面”这种演示只需要两秒钟,实现却无比庞大的功能。

我好像有点明白了,对于这个需求:
1.开发需要一天,确实很麻烦
2.功能演示只需要两分钟,也没啥大的修改,确实挺简单的
那么,为什么产品理解的简单需求,开发却需要花费很多的时间来修改?是不是代码设计跟产品设计有出入呢?换个角度,现在问题就变成了:为什么我们编写的代码,维护起来却这么麻烦呢?有没有一种能够完全还原产品设计的开发方式,可以很轻松地添加、修改各种功能呢?
用户评论