如何一次解决两大难题,不用写注释,也不会被他人吐槽没有注释呢?

news2024/11/25 22:31:22

如何一次解决两大难题,不用写注释,也不会被他人吐槽没有注释呢?

  • 导读
  • 为什么要减少代码中的注释量呢?
  • 一、无用型的注释
  • 二、絮絮叨叨的注释
  • 三、代替代码分层的注释
  • 四、不知所云的注释

参考:阿里云开发者社区

导读

每个程序员都会讨厌两件事情,阅读没有注释的代码,给代码写注释

那么如何一次解决两大难题,不用写注释,也不会被他人吐槽没有注释呢?

“If our programming languages were expressive enough, or if we had the talent to subtly wield those languages to express our intent, we would not need comments very much—perhaps not at all.”     —— Robert C.Martin 《Clean Code》

若编程语言足够有表达力,或者我们长于用这些语言来表达意图,那么我们就不那么需要注释,甚至根本不需要。

如何一次解决程序猿的两大难题,不用写注释,也不会被他人吐槽没有注释呢?

为什么要减少代码中的注释量呢?

  • 注释的存在说明当前的这段代码逻辑并不是特别清晰,没有额外说明,他人就可能无法理解意图。

  • 注释很难得到维护,一个任务开发结束后,分布在任务中的注释大概率就不会再被更新,随着时间的推移,代码越来越复杂,可能注释的信息早已不能准确反馈当前的逻辑了。

  • 减少注释的过程也是一个重新审视代码结构,精简代码的过程。

那么糟糕的注释有哪些,又有什么办法可以干掉这些注释呢?

一、无用型的注释

后端不能信任前端传入的任何信息,所以写代码的时候,也不能相信任何能力。哪怕最简单的操作,也要增加一段注释来说明操作的细节。

public void addInfo(Info info){
  ...
  //向信息列表中追加信息内容
  this.infoList.add(info);
  ...
}

相信同事的能力,常见的操作,即使没有注释,也能够通过上下文理解出你的意图的。

二、絮絮叨叨的注释

代码逻辑太绕,为了防止它变成上帝的小秘密,那就写上一段注释,这样就不会变成上帝的小秘密了。

public void addInfos(List<Info> infos){
  ...
  //如果Infos没有,就直接返回,如果Infos只有一个,那就删除数据库的信息,再写入。。。
  ...
}

看似有了注释,再也不担心变成上帝的小秘密了。但是一旦离注释较远的少量代码被修改,则会导致上帝重新独享这段代码的秘密。

“Comments Do Not Make Up for Bad Code”    —— Robert C.Martin 《Clean Code》

注释并不能优化糟糕的代码

复杂的注释说明可能本身代码的逻辑是可能有问题的,整理逻辑图并重新梳理状态机的模型,可能比写出复杂的注释更有意义。

从左边的七种可能的通路,多种执行的策略,到右边的清晰简单的二级判断+执行流程,状态及变化清晰简单。

在这里插入图片描述

三、代替代码分层的注释

开发框架讲究高内聚,松耦合。所以我的函数也要高内聚,能写在一起的函数,坚决不分开成多块的函数。为了避免有人理解不了这段代码的逻辑,那就加上注释好了。

// 判断是否活跃用户
if((customer.getLastLoginTime().after(dateUtils.minusDays(new Date(),15)) && customer.getCommentsLast30Days() > 5) 
    || orderService.countRecentDaysByCustomer(customer,30) > 1)

不合理的分层一方面增加了多余的注释,而且也让整个代码维护性变高。如果判断活跃用户的逻辑发生变化,岂不是需要Ctrl+F去查找全文,一旦漏了一个地方,bug就由此产生了。

合理的函数抽提可以加强代码的逻辑性,与其看见复杂的布尔计算,isXXX才是我的最爱。

private boolean isActivate(){
  return getLastLoginTime().after(dateUtils.minusDays(new Date(),15)) && getCommentsLast30Days() > 5) 
    || orderService.countRecentDaysByCustomer(this, 30) > 1)
}

if (customer.isActive()){
  ...
}

四、不知所云的注释

为了让上帝更快的独享代码的秘密,所以连注释也快速投奔了上帝秘密的怀抱。

public synchronized void setFormatter(Formatter newFormatter) {
    checkPermission();
    // 检查是否空指针
    newFormatter.getClass();
    formatter = newFormatter;
}

这儿的注释,看起来无论如何都不能和后面的代码所联系起来。但是java提供的函数 Objects.requireNonNull()能够比作者使用的的getClass方法更加清晰的说明检查空指针的意图,同时也能干掉这种不知所云的代码。与之相似的还有CollectionsStringUtils下面的一系列函数。

虽然前面吐槽了这么多糟糕的注释,以及针对这些注释的无注释方法,但是正如ChatGPT的回答:

写出没有注释的代码是一项挑战,因为注释可以帮助读者理解代码的目的和工作原理。以下是一些编写没有注释的代码的建议:

1.保持代码简洁:简洁的代码易于理解,使其更容易阅读和理解。

2.使用描述性的名称:使用描述性的变量和函数名可以帮助读者理解代码的目的。

3.遵循一致的编码风格:使用一致的缩进、空格和命名约定可以使代码更加易于阅读。

4.将代码分解成小块:将代码分解成小块可以帮助读者理解代码的目的和功能。

5.编写自描述的代码:编写自描述的代码可以帮助读者理解代码的目的,例如,使用有意义的变量名和函数名。尽管这些技巧可能会帮助你编写更容易阅读的代码,但是注释仍然是编写高质量代码的重要组成部分。当您必须编写没有注释的代码时,请尽可能遵循这些建议。

虽然无注释的代码也许终不可得,但是通过减少注释,审视我们的代码结构,让代码晚一日成为上帝的小秘密,那也是非常值得的啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vs2022】解决 “对程序集签名是出错 - 拒绝访问 ”

背景 拿到一个工程&#xff0c;编译时报错&#xff1a;“对程序集签名是出错 - 拒绝访问” 解决方法 ”C:\ProgramData\Microsoft\Crypto\RSA”目录下面&#xff0c;找到【MachineKeys】文件夹。 右键【MachineKeys】文件夹&#xff0c;在安全属性里面&#xff0c;将当前win…

DETR系列:RT-DETR(一) 论文解析

论文&#xff1a;《DETRs Beat YOLOs on Real-time Object Detection》 2023.4 DETRs Beat YOLOs on Real-time Object Detection&#xff1a;https://arxiv.org/pdf/2304.08069.pdf 源码地址&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/tree/develop/conf…

江西五十铃汽车PMO经理苏建受邀为第十二届PMO大会演讲嘉宾

江西五十铃汽车有限公司PMO经理苏建先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;PMO全链路建设促进组织变革——传统汽车行业0-1PMO最佳实践探索。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&…

LangChain:LLM应用程序开发(上)——Models、Prompt、Parsers、Memory、Chains

文章目录 一、Models、Prompt、Parsers1.1 环境配置&#xff08;导入openai&#xff09;1.2 辅助函数&#xff08;Chat API : OpenAI&#xff09;1.3 使用OpenAI API进行文本翻译1.4使用LangChain进行文本翻译1.5 使用LangChain解析LLM的JSON输出1.5.1 LangChain输出为string格…

基于人体姿势估计的舞蹈检测(AI Dance based on Human Pose Estimation)

人体姿势骨架以图形格式表示人的方向。本质上&#xff0c;它是一组坐标&#xff0c;可以连接起来描述人的姿势。骨架中的每个坐标都被称为一个部分(或一个关节&#xff0c;或一个关键点)。两个部分之间的有效连接称为一对(或分支)。下面是一个人体姿势骨架样本。 因此&#xff…

mysql基础3——数据备份与恢复、破解数据库密码

文章目录 一、备份方案二、备份工具mysqldump2.1 备份整张表数据2.2 备份整个库数据 三、全量备份四、差异备份五、数据库密码破解 一、备份方案 备份方案概念特点全量备份对某一个时间点上的所有数据或应用进行完全拷贝。数据恢复快&#xff0c;备份时间长。增量备份在一次全…

抓住重点,谋定而后动

一、我们平常项目有哪几种 有两种常规项目、大项目 1.常规项目 技术团队的重心是把执行做到位&#xff0c;你要更关注过程管控&#xff0c;确保系统交付 2.大项目&#xff1a; 什么是大项目&#xff0c;他有什么特点 大项目时间投入大、人员规模大、系统更大&#xff0c;复…

ResourceBundle读取properties文件

ResourceBundle 常用API 方法签名方法描述public Locale getLocale()获取本地国际化环境ppublic Enumeration getKeys()获取属性文件中所有keypublic final String getString(String key)获取属性文件中key对应的value, 返回值为String, 如果不存在, 则抛出异常public final O…

STM32文档

一、寄存器缩写 二、存储器和总线构架 DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问 简而言之&#xff0c;DMA就是将一个内存里的数据搬运到另一个内存里&#xff0c;此过程无需CPU直接控制输出 系统架构存储器组织存储器映射&#xf…

解密:Prompt、Token、和completions是什么?

Prompt、Token、和completions 本文是科普向&#xff0c;大家放心阅读 在ChatGPT越来越火的时候&#xff0c;很多开发者都想大展拳脚&#xff0c;但在这之前&#xff0c;我们需要了解一些基础知识&#xff0c;比如你知道什么是token、什么是prompt、什么是Complemention Pro…

vue下基于elementui自定义表单-后端数据设计篇

vue下基于elementui自定义表单-后端篇 自定义表单目前数据表单设计是基于数据量不大的信息单据场景&#xff0c;因为不考虑数据量带来的影响。 数据表有: 1.表单模版表&#xff0c;2.表单实例表&#xff0c;3.表单实例项明细表&#xff0c;4表单审批设计绑定表 以FormJson存…

chatgpt赋能python:关于Python的常见问题及解决方法

关于Python的常见问题及解决方法 在编程领域中&#xff0c;Python已经成为了最流行的编程语言之一。然而&#xff0c;在使用Python编写代码时&#xff0c;难免会遇到一些问题。在本文中&#xff0c;我们将介绍一些常见的Python问题以及如何解决它们。 编码问题 在Python中&a…

idea项目名旁边还有一个项目名——idea笔记

问题描述 我们常常因为想改项目名但是没有改完全从而出现了项目名旁边还有一个项目名 例如&#xff1a; 解决方案&#xff1a; 打开File->project structure 修改前&#xff1a; 修改后&#xff1a;

【数据挖掘】时间序列教程【一】

第一章 说明 对于时间序列的研究&#xff0c;可以追溯到19世纪末和20世纪初。当时&#xff0c;许多学者开始对时间相关的经济和社会现象进行研究&#xff0c;尝试发现其规律和趋势。其中最早的时间序列研究可以追溯到法国经济学家易贝尔&#xff08;Maurice Allais&#xff09;…

微服务04 分布式搜索引擎 elasticsearch DSL数据聚合 自动补全 数据同步 集群 Sentinel

微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI 索引库 DSL查询 RestClient 黑马旅游 分布式搜索引擎03 1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#x…

ℰ悟透Qt—Http网络编程

目录 概述实践理论QNetworkAccessManager进行Http编程的基本步骤代码实战(重点片段) 概述 网络访问 API 建立在一个 QNetworkAccessManager 对象之上&#xff0c;该对象保存了发送请求所需的公共配置和设置。它包含代理和缓存配置&#xff0c;以及与此类问题相关的信号和可用于…

【计算机网络】数据链路层之随机接入-CSMA/CD协议(总线局域网)

1.概念 2.信号碰撞&#xff08;冲突&#xff09; 3.解决方案 CSMA/CD 4.争用期&#xff08;端到端往返时延&#xff09; 5.最小帧长 6.最大帧长 7.指数退避算法 8.信道利用率 9.帧发送流程 10.帧接受流程 12.题目1 13.题目2 14.题目3 15 小结

无线蓝耳机哪些牌子好?十大真无线耳机排名品牌

随着TWS技术在应用层面的日益完善&#xff0c;真无线蓝牙耳机就越来越受欢迎了&#xff0c;完全摒弃了线材的束缚&#xff0c;做到了真正的无线耳机&#xff0c;这简直是无法忍受耳机线的强迫症的福音&#xff0c;而且现在不仅是佩戴时会格外的舒适&#xff0c;随着无线技术的不…

Redhawk: 为什么STA CHECK中switch cell覆盖率为0?

如题&#xff0c;做dynamic analysis时&#xff0c;不需要switch cell的timing window信息&#xff0c;但是做low power analysis需要做上电分析时switch cell的timing window就是必须的了&#xff0c;本文对switch cell control pin没有timing window (STA CHECK覆盖率为零)的…

ChatGPT:给教育创新带来风险与挑战

在教育界&#xff0c;当前对ChatGPT的关注固然有一部分原因是它所能带来的教育创新&#xff0c;但更多的原因是ChatGPT同时也在冲击着教师的角色定位&#xff0c;推动着人才培养目标的转型&#xff0c;逼迫着学生和教师走出舒适区。况且&#xff0c;ChatGPT还不断诱发教育中的技…