设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
17458 人已学习
课程目录
已更新 20 讲 / 共 100 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 (1讲)
开篇词 | 一对一的设计与编码集训,让你告别没有成长的烂代码!
免费
设计模式学习导读 (3讲)
01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
设计原则与思想:面向对象 (11讲)
04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (3讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
不定期加餐 (2讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
设计模式之美
登录|注册

02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?

王争 2019-11-04
在我的工作经历中,每当同事评论起项目代码质量的时候,听到的最多的评语就是:“代码写得很烂”或者“代码写得很好”。用“好”“烂”这样的字眼来描述,非常地笼统。当我具体问到底如何烂、如何好的时候,尽管大部分同事都能简单地罗列上几个点,但往往都不够全面、非常零碎,也切不中要害。
当然,也有一些工程师对如何评价代码质量有所认识,比如,好代码是易扩展、易读、简单、易维护的等等,但他们对于这些评价的理解往往只停留在表面概念上,对于诸多更深入的问题,比如,“怎么才算可读性好?什么样的代码才算易扩展、易维护?可读、可扩展与可维护之间有什么关系?可维护中‘维护’两字该如何理解?”等等,并没有太清晰的认识。
对于程序员来说,辨别代码写得“好”还是“烂”,是一个非常重要的能力。这也是我们写出好代码的前提。毕竟,如果我们连什么是好代码、什么是烂代码,都分辨不清,又谈何写出好代码呢?
所以,今天我们就聊一聊关于代码质量评判的相关问题,希望你在学完今天的内容之后,对代码质量的评判有个更加清晰、更加透彻的认识和理解。

如何评价代码质量的高低?

实际上,咱们平时嘴中常说的“好”和“烂”,是对代码质量的一种描述。“好”笼统地表示代码质量高,“烂”笼统地表示代码质量低。对于代码质量的描述,除了“好”“烂”这样比较简单粗暴的描述方式之外,我们也经常会听到很多其他的描述方式。这些描述方法语义更丰富、更专业、更细化。我搜集整理了一下,罗列在了下面。这些几乎涵盖我们所能听到的描述代码质量的所有常用词汇,你可以看一看。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(201)

  • 丁丁历险记
    笔记:
    个人理解,代码质量评判
    1 机器的运行效率 (往往还和可读性相冲突,但又非绝对冲突) , 有时候算法在没优化好的时候,时间空间是可以一起省下来的。
    2 代码可管理行数。 好的代码,层次分明,职能分明,让人感受到代码品味。
      
    2 最常用的评价标准。
        这块我一直没细分好,经常和同事开玩笑说“代码品味”(尊重大脑的特性,写出可便于维护的代码。程序 = 数据结构+算法 算法分control 相关和logic 相关。 合理的把control 相关与logic 相关进行分离就是非常好的套路 ,时间久了,看到违和感重的代码就很敏感了,主要是要求别把代码写死写散, 像dry 等基础原则都没遵守的,烂用全局变量的,创建对象没用框架的createObj 的,没支持依赖注入的,直接code review 时会指出 )
    如何才能写出高质量的代码?
        做中学。 我只说我自己,我在每完成一份工作后,都要拿出很大一部分时间来优化重构,自己改自己的代码。 【主要套路来源,代码整洁之道,重构-改善即有代码设计】 这算是我自律的一部分,我很珍惜工作中的开发实践。纯理论的东西学多了,人会飘飘乎乎的,需要实操来落地。
     
    2019-11-04
    4
    99
  • AF
    “思从深而行从简,真正的高手能云淡风轻地用最简单的方法解决最复杂的问题。” —— 这句话是写代码的精髓
    2019-11-04
    1
    58
  • 时光勿念
    好看的代码千篇一律,垃圾的代码花样百出
    2019-11-05
    4
    44
  • 深藏Blue
    我理解的好代码:
    1. 当你读我代码的时候,我已经不在了,但你依然能够清楚清晰的明白我要传递的信息
    2. 当程序出错时,一方面我汇报的错误信息能够帮你找出你的错误在哪; 另一方面,你能准确告诉我,我到底错哪了,而不是说:"xx接口报错了,你看下怎么回事"
    3. 当你需要造个轮子的时候,我的代码能够作为现成的轮毂,你只需要再配上其他的组装一下就行
    2019-11-05
    27
  • 小北
    除了小争哥提到的七个评价标准,我认为还有一个评价标准:易debug。在日常工作中,经常要追查各种线上case,代码是否易于debug,会非常影响工程师的追查效率。比如是否有打印详细的日志,是否有debug干涉点可以在debug模式下打印详细的线上请求信息便于快速定位问题。当然,这一点也可以放在可维护性中。
    2019-11-05
    2
    10
  • burning ‍微信超級會員
    稳定性很重要 尤其在前后端分离开发时。说好了按约定的接口规则开发 可联调时各种出错 甚至接口崩溃报异常。前端成测试了
    2019-11-04
    5
    10
  • 斐波那契
    在上一家公司提到一个标准 就是写的单元测试不能依赖于环境 不能在你的机子上能跑换到别的机子上就不能跑了 当时项目中跑测试的时候都是直接在内存中创建需要的表 然后把测试用到的数据插入进去然后在一条一条跑
    2019-11-06
    6
  • 于留月
    你觉得还有哪些其他的代码评价标准非常重要?
    健壮性:程序应该具备较强的鲁棒性,极低地线上崩溃率,流畅的应用体验,高并发高承载能力,错误处理:日志上报或者现场恢复等等;
    安全性:涉及到支付、金融、社交私密信息、商业等领域的安全,及反编译反逆向;

    聊一聊你心目中的好代码是什么样子的?

    除了具备文中提到的7个标准,应该明晰代码的边界,适用场景等。
    2019-11-06
    6
  • Jackey
    大道至简,一次面试中,我写了半页纸的代码被面试官3行实现的事对我打击很大…
    2019-11-05
    5
    5
  • 赌神很低调
    好代码就像一篇好文章,层次分明,用词贴切,简洁素雅,形象化抽象,脉络化复杂,而且有趣,吸引你通宵看完,然后合上书本,意犹未尽。
    2019-11-04
    1
    5
  • SweetyTang
    争哥,好的代码是不是也得考虑错误处理

    作者回复: 是的!

    2019-11-04
    2
    5
  • 小毅
    借用clean code中的标准,code review时WTF/min是最好的评判指标😏
    个人理解好代码最重要的标准就是可读性,相对于可扩展和灵活,由于很多项目一开始并不清楚后续迭代的方向,过早引入过多的设计,反而会让项目臃肿,可读性特别差,后续反而更不好维护~
    另外,对于一个team来说,我觉得好代码有一个非常重要的标准就是风格一致性,代码写的像一个人写的那这个team就是真的很厉害
    2019-11-06
    1
    4
  • 编程界的小学生
    可扩展,可读性,健壮性
    我认为mybatis做的很到位,小巧简单,功能强大。健壮稳定可扩展。正是有了这么好的代码,才使得有很多框架可以无缝集成进来,比如spring-mybatis,再比如sharding-jdbc
    2019-11-05
    3
  • 仙道
    我觉得最好是能把注释尽可能的写详细,最好能举几个例子。
    因为员工之间水平层次不齐,哪怕是再好的代码,在他眼里就是垃圾
    遇到爱扯皮的同事,真的很难受
    2019-11-04
    8
    3
  • 汤小高
    老师,怎么感觉您说的可维护性和可拓展性是同一个东西,都是让未来修改某个功能,某个bug或者新增功能需求更简单?
    是不是维护性更针对于现有功能的维护修改,拓展性更针对与未来新增需求的修改?

    作者回复: 扩展主要是指添加功能,维护更广些,添加、修改...可读性和可扩展性都影响到代码的可维护性。除此之外,这些判定标准本身就有点重合,文章中也提到了。

    2019-11-04
    3
  • lijun
    Jdk源码和spring源码写的非常棒,可惜目前还看不懂。
    2019-11-04
    1
    3
  • 郑童文
    个人感觉,有的时候为了提高代码的可扩展性和可复用性 就会抽象出好多的接口,类和方法。 然后代码的简洁性和可读性就降低了。不知道我这样的感觉对不对?请问老师如何看待这个问题?

    作者回复: 是的,扩展性和可读性有的时候是相冲突的,后面会讲到的。

    2019-11-12
    1
    2
  • xiong
    所在的公司也很少有code review 的流程,所以有时候都无法评估自己写的代码是好还是坏。这种情况该如何去提高自己的code 水平呢?

    作者回复: 多去看看开源优秀的代码如何写的,我觉得比较有帮助。

    2019-11-11
    1
    2
  • 桃翁
    老师,对于更好的写出可测试性的代码TDD我觉得是一种非常好的方式,测试在前必然写出来的代码易于测试,但是写测试用例往往会占用很多的时间,请问老师你是如何看待TDD的?

    作者回复: 可以看下我之前写的这篇文章
    https://mp.weixin.qq.com/s/Wv5kNmRBY2ZurFq7Rxv6Kw

    2019-11-08
    2
  • 写代码其实也可以像写故事一样,每个方法就当成一个情节来描述,方法不要太大,想表述的东西也要单一,当然要有个主线,就是主方法,让读代码的人一眼看下去就有了一个大概的了解,知道这段代码大致做了什么,这样阅读起来也会比较愉悦
    2019-11-08
    2
收起评论
99+
返回
顶部