代码整洁之道【3】--注释

传统的印象里,良好的代码都是需要丰富的注释的。看完《代码整洁之道》注释这章之后,发现根本不是这个样子:

什么也比不上放置良好的注释有用。什么也不会比乱七八糟的注释更有本事搞乱一个模块。 什么也不会比陈旧的、提供错误信息的注释更有破坏性。

注释的恰当用法是弥补我们在用代码表达意图时遭遇的失败。注释总是一种失败,我们无法找到不用注释就能表达自我的方法,所以不得不用注释,这并不值得庆贺。

注释存在的时间越久,就离其所描述的代码越远,越来越变得完全错误。原因很简单 ,程序员不能坚持维护注释。

所以,尽管有时也需要注释,我们也该多花心思尽量减少注释。

一、注释不能美化糟糕的代码

写注释的常见动机之一是糟糕代码的存在。我们编写一个模块,发现它令人困扰、乱七八糟。我们就知道,它烂透了。我们告诉自己:“好写点注释”。

其实不应该这样,我们好应该把代码弄干净。

带有少量注释的整洁而有表达力的代码,要比带有大量注释的零碎而复杂的代码像样的多。

二、用代码来阐述

有时,代码本身不足以解释其行为。不幸的是,多数情况下,很多程序员都因此认为代码不能做好解释工作。这种观点是错误的。比如如下两段代码,你更愿意看到哪种?

不好的实践:

// Check to see if the employee is eligable for full benifits
if ((employee.flags & Hours_FLAG) && (employee.age > 65)) {
}

良好的实践应该类似这样:

if (employee.isEligableForFullBenifits()) {
}

尽全力把代码写的简洁明了,再用注释解释。很多时候,简单到只需要创建一个描述与注释所言同一事物的函数即可。

三、好注释

有些注释是必须的,也是有利的。下面会介绍一些值得写的注释。不过要记住,真正好的注释是你想办法不去写的注释。

1).法律信息(版权等等)

2).提供信息的注释

3).对意图的解释

4).阐释晦涩难懂的参数、返回值的意义

有时,注释把某些晦涩难明的参数或返回值的意义翻译成为某种可读形式,也会是有用的。通常,更好的做法是尽量让参数或者返回值自身就足够清楚。但如果参数或者返回值是某个标准库的一部分,或者是你不能修改的代码,阐释型注释就很有意义了。比如:

5).警示

有时,用于警告其他程序员会出现某种后果的注释也是有用的。比如,protocol buffer编译器根据.proto文件自动生成的代码,是强烈禁止被程序员自己修改的:

6).定期清理TODO注释

有时,有理由在代码中放置未来的工作列表。此时可以用//TODO。
TODO可以代码在未来的功能或发展目标。

但是要注意定期查看TODO(借助现代IDE定位),删除过时的TODO注释

7).公共API中的javadoc

四、坏注释

1).喃喃自语(注释是给读者看得不是给自己看得)

大多数注释都是此类,通常坏注释都是糟糕代码的支撑或接口,或者对错误决策的修正,基本上等同于程序员自说自话。

2).多余的注释(没有提够比程序本身更多的信息)

很多余。。。

3).误导性注释

注释描述的功能和实际函数的功能有出入

4).循规式注释

所谓每个函数都要有javadoc或者每个变量都要有注释的规矩完全是可笑的。 我的理解是给函数或者变量起个好名字吧。

5).日志式注释

在没有源码版本控制系统时,可以这么写。
如今,这种冗长的记录只会让模块变得凌乱不堪,应当全部删除。

6).废话注释

无参构造器你都要来个注释?服辣

7).标记位置 (例如://看这里///)

// Actions /

有时,程序员喜欢在源代码中标记某个特殊位置。
尽量少用,只在特别有价值的地方用。如果滥用标记,那么标记就会不突出,沉没在海量的标记中,失去标记价值。

8).括号后边的注释

9).归属名

源码版本控制系统会帮我们记录,没必要自己添加签名注释。

10).注释掉的代码

注释掉的代码,其他人不敢删除,因为不清楚有没有用。注释掉的代码不及时清理,堆积成山后,很难看。

11).HTML注释(这里是指在注释中添加HTML标签,扰乱视线)

12).非本地信息(就是说你在注释中描写另一个代码块)

如果你确实需要注释,请确保它描述了离它近的代码。

13).信息过多

别在注释中添加有趣的历史性话题或者无关的细节描述。

14).不明显的联系(也就是说要写就写清楚)

这里面过滤字节是什么?与+1有关系么?与*3有关系么?为什么用200?完全没有说清楚。
如果注释本身还需要注释来讲明白,那太遗憾了。

15).函数头

一个好的函数名远远好于一个注释

16).非公共代码中的javadoc

虽然Javadoc对于公共API非常有用,但是对于不打算作公共用途的代码就令人厌恶了。为系统中的类和函数生成javadoc页并非总有用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity DOTS 入门(2) SubScene和Bake

SubScene 由于Unity原本的Scene无法使用ECS,所以需要SubScene来存放ECS模式下的内容可以正常的像普通的开发模式一样,在SubScene里面来添加GameObject, MonoBehaviour然后Unity将这个SubScene里面的物体,全部baking(烘培)出来,转…

Windows服务器任务计划启动 Java 应用遇到的error:解决错误ERROR0x2331

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

vs2022启动cmake项目(qt+c++)

1.本工程,如图,1个cmakelist.txt3个文件 2.启动vs 3.选择文件夹 4.进入这个页面,就说明配置没问题 5.启动 6.最后会自己生成其他文件

crc编码流水传输

目标 首先我们要确定目标就是输入两位错的时候我们需要重新传输 这其中还分了地址回位,不显示输出,各位清零操作 我们再去看一下这个的详细封转 这么做是有问题的,没有将之前的数据清零 我们做完清零操作以后我们提交一下 发现只需要一…

从零开始学Spring Boot系列-SpringApplication

SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下, 你只需委托给 SpringApplication.run这个静态方法 : SpringBootApplicationpublic class SpringbootLearningApplication {public static void main(String[] args) …

透视 Insilico 英矽智能:AI 制药明星企业的飞跃、困境与破局

衰老,从古至今困扰了无数仁人志士。无论是千古一帝秦始皇,还是雄才大略汉武帝,亦或者挥斥方遒唐太宗,这些伟大的帝王无一例外的都留下了许多追求长生的故事。当时光的指针落在了 21 世纪的第二个十年,随着全球老龄化问…

中老年人高血糖预防需知:少碰两黄一白,四指标严格控制!

对于血糖不好的人来说,尤其是中老年人,饮食上的调整非常重要。 “少碰两黄一白”是一个很好的饮食原则,可以帮助稳定血糖,预防糖尿病及其并发症的发生。 “两黄”指的是油炸食物和含糖量高的食物,长期摄入会导致身体肥…

css实现扫码循环扫描特效

摘要&#xff1a; 需求中需要模拟扫描的效果来实现户型的生成&#xff01;由于接口ai生成的图片户型时间比较长&#xff0c;所以需要模拟特效&#xff01; <!DOCTYPE html> <html><head><mate charset"UTF-8" /><title>扫描</title…

第二证券|这些翻倍牛股,他们赚到了!

龙年开市以来&#xff0c;有色、化工等周期板块以及AI、轿车等板块表现亮眼&#xff0c;成为商场主线&#xff0c;也涌现出多只大牛股。 数据显现&#xff0c;2月19日以来&#xff0c;到4月10日收盘&#xff0c;A股商场共涌现出33只翻倍股&#xff0c;234只个股涨幅超50%。易方…

美国G口服务器租用的应用领域

在当今数字化快速发展的时代&#xff0c;服务器成为了各行各业不可或缺的重要工具。其中&#xff0c;美国G口服务器以其高带宽、高性能的特点&#xff0c;在众多领域得到了广泛的应用。那么&#xff0c;美国G口服务器租用的应用领域究竟有哪些呢?接下来&#xff0c;本文将为您…

Python快速获取编程问题答案的方法库之howdoi使用详解

概要 howdoi是一个命令行工具,它提供了一种快速获取编程问题答案的方法,通过搜索和抓取Stack Overflow等网站的内容,直接在终端中显示编程问题的解决方案。 安装 通过pip可以轻松安装howdoi: pip install howdoi特性 快速访问编程解决方案:无需手动浏览Stack Overflow。…

大象机器人发布智能遥操作机械臂组合myArm MC,加速具身智能研究与发展!

在全球工业自动化和智能化加速发展的今天&#xff0c;机器人行业正经历着翻天覆地的变化。具身智能研究&#xff0c;作为人工智能领域的关键分支&#xff0c;正努力在精准动作控制、高层次自主决策能力以及自然人机交互体验上赋予机器人新的能力。 在此背景下&#xff0c;大象机…

用uniapp写调色板组件

用uniapp写调色板组件 废话不多说&#xff0c;最近业务原因&#xff0c;需要用uniapp写一个调色板&#xff0c;记录一下 先上效果展示&#xff1a; 最下边的结果色可以实时跟踪&#xff0c;颜色值也可以实时变化&#xff0c;有个小缺陷就是&#xff0c;数值变化跟不上结果值…

【springCloud】版本学习

Spring Cloud介绍 官网地址&#xff1a;https://spring.io/projects/spring-cloud Spring Cloud 是一个基于 Spring Boot 的微服务架构解决方案&#xff0c;它提供了一系列工具和模式来帮助开发者构建分布式系统。Spring Cloud 的组件和模式包括配置管理、服务发现、断路器、…

AJAX 入门到实战 第1天 2024 笔记

1.1-AJAX入门与axios使用 1.2-认识URL 1.3-查询参数 1.4-案例_地区查询 <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>/*获取地区列表: http://hmajax.itheima.net/api/area查询参数:pname: 省份或直辖市…

2024年蓝牙耳机怎么选?五大必看热门蓝牙耳机推荐篇!

​面对市场上琳琅满目的蓝牙耳机&#xff0c;许多消费者感到难以抉择。作为一个耳机爱好者&#xff0c;我根据自己的使用经验&#xff0c;精心挑选了一些我认为值得推荐的蓝牙耳机&#xff0c;希望能为你的选购提供帮助。 一、如何挑选蓝牙耳机&#xff1f;&#xff08;码住重点…

Python爬取淘宝商品评价信息API接口测试实例

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,it…

酷我音乐手机版高级版,听歌必备,资源丰富,全部免费!

hi&#xff0c;大家好我是技术苟&#xff0c;每周准时上线为你带来实用黑科技&#xff01;由于公众号改版&#xff0c;现在的公众号消息已经不再按照时间顺序排送了。因此小伙伴们就很容易错过精彩内容。喜欢黑科技的小伙伴&#xff0c;可以将黑科技百科公众号设为标星&#xf…

Mybatis分页查询用PageHelper插件

首先看接口文档需求 看响应数据样例&#xff0c;那么咱们先自定义一个bean来满足这个需求&#xff0c;这里定义PageBean实体类 package com.itheima.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.List;//分…

并发编程——7.Java的“锁”事

如题目所示&#xff0c;这篇文章我们着重讲解Java里面的各种锁以及与Java锁有关的内容。争取一篇文章让你吃透Java的锁。 目录 1.前言 2.乐观锁和悲观锁 2.1悲观锁 2.2乐观锁 2.2.1乐观锁的介绍 2.2.2CAS算法 3.自旋锁与互斥锁 4.wait/sleep区别 5.生产者与消费者模式…