如何评价代码的好坏?

2023-10-27

我们一般从可维护性、可读性、可扩展性、可测试性、可复用性、简洁性来评价代码的质量。

可维护性

所谓维护无外乎就是修改bug、修改老的代码、添加新的代码之类的工作。代码易维护指的是在不破坏原有代码设计、不引入新的bug的前提下,能够快速的修改或者添加代码。那么代码不易维护就指的是修改或者添加代码,有极大的风险会引入新的bug或者需要花费很长时间才能完成。
我们知道代码的维护时间,要远远高于代码的编写时间。工程师的大部分时间可能都是花费在修修bug、改改老的功能逻辑、添加一些新的功能逻辑之类的工作。为此如何编写一个易于维护的代码格外重要。
代码的可维护性由很多因素协同作用的结果。代码的可读性好、可扩展性好、简洁就会使得代码的可维护性好。更具体的,如果代码分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设计原则等等,那就意味着代码易维护。此外代码的易维护性还跟项目代码量、利用的技术的复杂程度、文档是否全面、团队人员的水平相关。
从上面可以看出,从正面判断代码的可维护性,挺难的。不过我们可以从侧面,给出一个比较主观又比较准确的判断:如果bug容易修复,修改添加功能能够轻松的完成,那么就可以认为代码比较容易维护,否则就可以说代码不易维护。

可读性

软件设计大师Martin Fowler曾经说过:”Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”,翻译成中文就是傻瓜可以都可以编写计算机能够理解的代码,好的程序员能够编写人能够理解的代码。代码的可读性应该是评价代码质量最最重要的指标之一,毕竟代码被阅读的次数要远远高于代码编写的次数,一个可读性好的代码,往往可维护性也会比较好。
我们需要查看代码是否符合编码规范、命名是否达意、注释是否详细、函数长短是否合适、模块划分是否清晰、是否符合高内聚低耦合等等。
Code review是一个很好的测验代码可读性的手段。如果你的同事可以轻松的读懂你写的代码,那说明你的代码的可读性很好;如果同事在读你的代码的时候,有很多疑问,说明代码可读性有待提高。

可扩展性

可扩展性也是评价代码好坏的一个非常重要的标准。它反映了我们的代码应对未来需求变化的能力。同可读性一样,可扩展性也一定程度上决定了代码的可维护性。
代码的可扩展性表示,我们在不修改或少量修改代码的情况下,通过扩展的方式添加新的功能代码。也就是代码预留了一些功能扩展点,可以把新功能直接插到扩展点上,而不需要因为添加一个新的功能而大动干戈,改动大量的原有的代码。

简洁性

有一条非常著名的设计原则,那就是KISS原则:”Keep It Simple, Stupid”。这个原则说的是尽量保持代码简单。代码简单逻辑清晰,也就意味着易读、易维护。
我们在编写代码时,需要把简单、清晰放到首位。不过很多经验不足的程序员会觉得、简单的代码没有技术含量,喜欢在项目中引入一些复杂的设计模式,觉得这样才能体现自己的水平。实际上,师从深而行从简,真正的高手能云淡轻风地用最简单的方法解决最复杂的问题。我们需要把问题简单化,而不是复杂化。

可复用性

代码的可复用性可以简单的理解为,尽量复用已有的代码,减少重复代码的编写。很多工程师喜欢copy paste代码,这是非常不好的习惯,而是应该抽象从重复的代码。

可测试性

可测试性也是代码质量评判的非常重要的标准。代码可测试性的好坏,可以从侧面反映出代码的质量。代码的可测试性差,很难编写单元测试代码,说明代码写的不够简洁、清晰,设计上有问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何评价代码的好坏? 的相关文章

  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • 六大设计原则--开闭原则

    定义 software entities like classes modules and functions should be open for extension but closed for modifications 一个软件实体
  • 设计模式——简单工厂模式

    简单工厂模式定义为 简单工厂模式又称为静态工厂方法模型 它属于类创建型模式 在简单工厂模式中 可以根据参数的不同返回不同类的实例 简单工厂专门定义一个类来负责创建其他类的实例 被创建的实例通常都具有共同的父类 简单工厂模式结构图 简单工厂模
  • [C++]备忘录模式

    备忘录模式 Memento Pattern 保存一个对象的某个状态 以便在适当的时候恢复对象 备忘录模式属于行为型模式 github源码路径 https github com dangwei 90 Design Mode 此文件包含 mai
  • 设计模式——导论

    作为软件开发人员 我们在平时工作的过程中 往往需要编写很多的代码来实现我们的需求 很多的时候会造成代码臃肿和代码冗余的情况 这个时候我们需要引入一个理念 设计模式 设计模式存在的意义在于 1 使得我们的代码更加精炼 2 使我们代码的可读性更
  • 设计模式一之简单工厂模式

    生活示例 刻板印刷 gt 活字印刷举例 喝酒唱歌 人生真爽 gt 对酒当歌 人生几何 可维护 需要修改 则只需要改需要改的字即可 可复用 字体可在后来的印刷复用 可扩展 需要加字 只需要加入相应的刻字即可 灵活性好 字的排列可能竖排或横排
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • 第12课:生活中的构建模式——想要车还是庄园

    用程序来模拟生活 从剧情中思考构建模式 与工厂模式的区别 与组合模式的区别 构建模式的模型抽象 类图 基于升级版的实现 模型说明 应用场景 故事剧情 下周就要过年了 这是 Tony 工作后的第一个春节 还是在离家这么远的北京工作 所以肯定不
  • linux内核中的设计模式

    创建型 Object Pool Object Pool模式可以提升性能 尤其是在对象的分配 初始化成本高 使用频率高 但使用时间短的情况下 对象池可以设置对象池的大小和回收时间缓存预分配的对象 NT和Linux都有简单的预分配缓存对象的机制
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • Java监听器与观察者模式

    Java监听器与观察者模式 Java中的监听器 Listener 和观察者模式 Observer Pattern 都是用于处理对象间的事件通知和响应的设计模式 它们的目的是在对象之间建立一种松散的耦合 使得一个对象的状态变化可以通知到其他对
  • 谁能想到Java多线程设计模式竟然能被图解,大佬就是大佬,太牛了

    设计模式 Design pattern 代表了最佳的实践 通常被有经验的面向对象的软件开发人员所采用 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • 新引擎HeatWave将MySQL查询性能提升400倍

    参考资料 https www oracle com a ocom docs mysql heatwave technical brief pdf 前言 我刚去MySQL官方文档查个函数 顺便发现一个新东西 HeatWave 看起来很厉害的样
  • 垃圾代码是如何写出来的

    自我参加工作已经有几年了 接手过的项目也不少 包括安卓端和web前端的 在做这些项目的过程中 相当一部分的项目到最后都出现了一个现象 代码越写越乱 维护性越来越差 究其原因 我认为有如下几点 1 程序员自身能力 出现问题 首先得从自己身上找
  • Matlab实现基于BP神经网络的数据分类预测

    matlab语言实现基于BP神经网络的数据分类预测 四分类 其步骤如下 一 载入原始数据 这里以测试数据存放在Excel表格中为例 导入数据 res xlsread 数据集 xlsx 二 将数据集划分为训练集和测试集 temp randpe
  • Kafka3.0.0版本——手动调整分区副本示例

    目录 一 服务器信息 二 启动zookeeper和kafka集群 2 1 先启动zookeeper集群 2 2 再启动kafka集群 三 手动调整分区副本 3 1 手动调整分区副本的前提条件 3 2 手动调整分区副本的示例需求 3 3 手动
  • 实现FPGA Verilog HDL与NIOS II的通信数据交换——利用AVALON总线

    平时用FPGA基本都是全程用Verilog HDL编程 当遇到液晶的时候 发现Verilog的还不如C语言来的方便 但是用NIOS来编写的时候 实现NIOS与Verilog的通信又是一个问题 今天用了两种方法实现Verilog与NIOS通信
  • C#Socket编程服务器和多客户端通信,客户端和客户端通信

    对于Socket编程 网上资料 博文一抓一大把 不过大多数都是简单讲解单客户端和服务端通信的实例 这里主要给大家展现一下在 net平台上用窗体程序实现的过程 不过比较有特点的是会告诉大家如何实现不同客户端之间的通信 它们如何通过一个服务端准
  • 2023年数学建模国赛C题思路+模型+代码+论文

    一 数学建模常用方法 各赛题思路开赛后会第一时间更新 数学建模是将实际问题抽象为数学模型 并利用数学方法进行求解和分析的过程 在数学建模中 常用的模型算法非常多 下面列举了一些常见的模型算法 线性回归 线性回归是一种常见的建模方法 用于建立
  • 【编程测试题】LeetCode single-number

    Given an array of integers every element appears twice except for one Find that single one Note Your algorithm should ha
  • Windows下谨慎使用动态磁盘

    电脑上的硬盘 磁盘 原本为动态分区 昨天换了一块新的1T的硬盘后 就把旧硬盘改装成移动硬盘了 但是改成移动硬盘后电脑无法识别出来 经检测发现是动态分区的问题 结合之前的经历 个人建议要谨慎使用动态磁盘 基本磁盘和动态磁盘 在网上搜 动态磁盘
  • android data文件夹操作

    1 看代码 public class DBTest extends Activity SQLiteDatabase db Button bn null ListView listView Override public void onCre
  • Qt中时间戳和时间的相互转换关系

    以下内容摘抄博客 https www cnblogs com simp p 17236018 html include
  • 【转】Codeblocks MinGW 配置openCV

    Code Blocks is an GPL based and cross platform IDE This is the tutorials using Code Blocks with OpenCV Create a simple c
  • sublime text3 自定义配色方案

    可以实现自定义修改配色方案 生成下载 绝对github上的神器 自定义配色方案 修改保存后 下载后缀为tmTheme的文件 然后打开Sublime Text 点击菜单栏的首选项 gt 浏览插件 此时会弹出一个窗口 路径大概就是 Sublim
  • VS工作目录,输出目录

    默认情况下 输出目录 和 输出文件 两个属性对应的目录是一样的 这样用着方便 当然 输出文件的值在输出目录的值的基础上还包含有exe文件名 如果两个不一样 则中间生成的链接器用的如xx ilk和xx pdb文件等在输出目录 而最终生成的xx
  • C语言 分支与循环语句 上

    3 5 表达式语句 printf hehe n 函数调用语句 空语句 有时候我们需要一条语句 但是这条语句什么都不需要做 叫做空语句 return 0 分号隔开的是一条语句 用一条语句加一个分号 控制语句用于控制程序的执行流程 以实现程序的
  • Windows 10 中的 BitLocker问题

    最近安装双系统 遇到了BitLocker的问题 被windows狠狠地恶心了一把 这里记录下来 后面的兄弟们不要躺坑 1 BitLocker是什么东西 就是这个界面 首先 这里有微软官方的解释 链接 总结来说就是一种加密方式 实质上个人理解
  • Angular4对cookie的操作

    cookie详细方法及使用 time number 2 60 60 1000 cookie过期时间两个小时 2 60 60 1000 储存cookie this cookieService set userId this userId ne
  • 【大数据】HiveQL:视图

    HiveQL 视图 视图可以允许保存一个查询 并向对待表一样对这个查询进行操作 这是一个逻辑结构 因为它不像一个表会存储数据 换句话说 Hive 目前暂不支持物化视图 当一个查询引用一个视图时 这个视图所定义的查询语句将和用户的查询语句组合
  • 首次域名注册

    什么是域名 域名是Internet网络上的一个服务器或一个网络系统的名字 在全世界 没有重复的域名 域名的形式是以若干个英文字母或数字组成 由 分隔成几部分 如 56dr cn 就是一个域名 域名与网址有什么区别 一个完整网址范例如下 ht
  • 如何评价代码的好坏?

    我们一般从可维护性 可读性 可扩展性 可测试性 可复用性 简洁性来评价代码的质量 可维护性 所谓维护无外乎就是修改bug 修改老的代码 添加新的代码之类的工作 代码易维护指的是在不破坏原有代码设计 不引入新的bug的前提下 能够快速的修改或