代码注释掉还能执行_日志消息是可执行代码和注释

代码注释掉还能执行

尽管在一个人的代码中应添加多少注释之间存在意见分歧,但我认为可以肯定地说,大多数开发人员都同意以下代码段中的注释是多余的:

// increment the total
total++;

在该示例中,代码很简单,而且实际上是不言自明的,用标准的Java运算符递增了一个体面命名的变量total 。 幸运的是,我现在没有像以前那样看到明显不必要的评论类型。

我仍然比一般人更常看到多余注释的地方是与导致解释性日志语句的代码情况相关。 尤其是当导致log语句的情况有些棘手时,似乎有时会希望向将来将要阅读和维护该代码的开发人员写评论,并希望记录相关信息以供使用。在以后调试特殊条件。 在大多数情况下,精心设计的日志消息(如其他精心设计的可执行代码)可以说明一切,而无需其他注释。

尽管编写自我记录的日志记录代码与编写自我记录的任何可执行代码在很大程度上相似,但是日志记录代码具有能够在日志消息中表达任意详细信息的优点。 普通代码受编程语言支持的结构的限制,并且有时语言的结构可能不如人们所希望的那样表达意图。 记录的消息在可表达的内容方面的限制要少得多。 不利的一面是,更改代码后,记录的消息通常更容易被忽略。 必须进行代码更改,但是日志消息通常可以保持不变(即使它们应该已经更改),并且直到将来某个时候记录该语句时,才会注意到这种遗漏。 不过,与注释相比,已记录的消息具有更好的机会来更改/更新,注释仅在代码读取过程中才会公开/注释。

使用日志消息来表达特殊条件而不是代码注释的附带好处是,这可以导致编写简洁而透彻的日志消息时要遵守更多的纪律。 通过记录的消息而不是代码内注释进行“注释”的另一个好处是,可以在情况发生时在运行时编写消息,并提供对代码行为的宝贵见解,而这些行为在分析静态代码时根本不可用。

以下是两个代码清单,一个使用代码内注释,另一个使用日志记录,以表达对将来维护此代码的开发人员相同的看法。 在这两种情况下,都记录了业务逻辑考虑因素,即2016年美国国家橄榄球联盟 (NFL)超级碗( 丹佛野马队获胜)没有使用传统的罗马数字命名约定来命名 。 它没有像以前的超级碗那样被冠以“ L”的称号,而是被冠以“ 50”的称号。 这是业务逻辑规则类型的精心设计的示例,通常以代码注释形式表示。 第10行是此处列出的每个代码的重点。

private int convertToSuperBowlYear(final String superBowlNumber)
{int superBowlYear;if (superBowlNumber == null || superBowlNumber.isEmpty()){superBowlYear = 0;}else if (superBowlNumber.equals("L")){// Super Bowl 50 was not named with the conventional Roman Numeral, so using '50' instead of 'L'superBowlYear = 2016;}else{superBowlYear = getSuperBowlYearFromNumber(getDecimalNumber(superBowlNumber));}return superBowlYear;
}
private int convertToSuperBowlYear(final String superBowlNumber)
{int superBowlYear;if (superBowlNumber == null || superBowlNumber.isEmpty()){superBowlYear = 0;}else if (superBowlNumber.equals("L")){logger.fine("Super Bowl 50 was not named with the conventional Roman Numeral, so using '50' instead of 'L'.");superBowlYear = 2016;}else{superBowlYear = getSuperBowlYearFromNumber(getDecimalNumber(superBowlNumber));}return superBowlYear;
}

这里未显示方法getSuperBowlYearFromNumber(int)getDecimalNumber(String)实现,因为它们对本次讨论不重要。 重要的是,“ L”不是有效的超级碗号码,因此在确定超级碗的年份时必须使用“ 50”而不是“ L”。 如果开发人员不熟悉NFL或它的超级碗命名约定,并且不熟悉2016年超级碗的命名约定,则需要某种类型的注释,以了解为什么一个超级碗与其他超级碗区别对待。

作为旁注并谈到罗马数字,令人惊讶的是,网络上有多少Java代码示例可在罗马数字和基于十进制的整数之间进行转换。 其中包括: 将罗马数字转换为十进制 , 将罗马数字转换为介于1到3999之间的 十进制,使用Java 将罗马数字转换为十进制,在Java中将罗马数字转换为十进制以及如何将罗马数字转换为整数 。 我怀疑有很多家庭作业问题会 激发大量的代码示例。

Alexey最近发表了博客文章“ 用警告日志消息替换代码中的TODO注释? 他说,在他以前曾写过“ TODO”注释的情况下,他已经开始写警告和错误级别的日志消息。 这是使用日志消息代替注释的更具体,更明显的示例。 就阿列克谢而言,他之所以这样做,是因为他意识到自己“总是忘记”“待办事项”,而且“很少被发现,而且几乎永远无法解决”。 Alexey的结论是:“这就是为什么我建议您尝试通过在日志中写下您的评论,您的想法甚至是您的疑问来尝试这种方法:这将帮助您,甚至可以娱乐您和您的同事!”

在某些情况下,可能添加到源注释中的内容可能不适合添加到日志消息中。 这种情况包括评论的冗长或评论的敏感性质。 还值得注意的是,某些注释级别的日志消息可能永远不会被记录,因为它们的日志级别设置得如此具体,以致在代码执行过程中永远不会真正启用日志级别。 但是,在许多情况下,使用简洁而透彻的日志消息而不是代码内注释来与将来的开发人员和您将来的自己进行通信具有优势。

翻译自: https://www.javacodegeeks.com/2017/12/log-message-executable-code-comment.html

代码注释掉还能执行

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

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

相关文章

浅析 Linux 初始化系统(系统服务管理和控制程序/init system) -- UpStart

文章目录一、Upstart 简介(一)开发 Upstart 的缘由(二)Upstart 的特点二、Upstart 概念和术语(一)Job(二)Job 生命周期(三)事件 Event1.Signals2.Methods3.Ho…

php如何在类的外部修改成员属性,php中如何在外部修改类的私有或受保护属性值...

php中怎么在外部修改类的私有或受保护属性值在做单元测试框架时,发现了个比较郁闷的问题:测试人员需要在类外修改类的private或protected成员变量的值,而这些变量没有抽象成public的属性,同时为了代码量的问题,也不可能…

telnet到设备里 php_金融行业思科设备典型网络故障案例:76系列典型案例(一)...

一、Cisco 7606主备引擎自动切换01故障现象某行上联路由器cisco7606 x月x日引擎自行切换,这种情况是第一次发生,至今仍是备引擎是active,主引擎是standby。02分析过程思科TAC提取了log日志和crashinfo信息:Previous engine detect…

白盒测试方法静态分析_静态分析的教育方面

白盒测试方法静态分析加入我们项目的新程序员经常问我们是否有自动格式化工具,以使Java代码看起来完全像Qulice期望的那样。 (Quili是我们使用的静态分析器。)我总是回答说,拥有这样一个自动代码抛光器只会有害,并且不…

php 去除图片黑边,C#_c#扫描图片去黑边(扫描仪去黑边),自动去除图像扫描黑边复制代 - phpStudy...

/// /// 自动去除图像扫描黑边/// /// public static void AutoCutBlackEdge(string fileName){//打开图像Bitmap bmp OpenImage(fileName);RemoveBlackEdge(bmp);//保存图像SaveImage(bmp, fileName);}private static byte[] rgbValues; // 目标数组内存/// /// 图像去黑边//…

《标准普通话教程》中对平舌音的发音方法的说明

《标准普通话教程》中关于平舌音的发音方法的描述: 第一个版本:大部分教材和老师 平舌音发音时,舌尖放在下齿背(下齿龈) 第二个版本:少部分教材和老师 平舌音发音时,舌尖放在下齿背&#xff0…

java javadoc_使用Java 9向Javadoc搜索添加术语

java javadoc有一个相对较旧的网页,称为“ Proposed Javadoc Tags ”,最初似乎是与Javadoc 1.2一起编写的,其中列出了“ Sun有朝一日可能会在Javadoc中实现的标签”。 在此列表中的标签是category , example , tutoria…

oracle system用户创建job 其他用户,oracle创建表空间、用户和表以及sys和system的区别...

一、oracle的3个内置账号(口令管理)scott(示范账户) tiger 内置账号system 系统管理员 操作用户sys 超级管理员 操作数据conn system/sasa;show user登录超级用户conn a/b as sysdba 或者 sysopera/b任何账号密码都可以(只能在服务端(安装数据的电脑)上运行更改用户密码&#x…

浅析 Linux 初始化系统(系统服务管理和控制程序/Init System) -- systemd

文章目录一、Systemd 的简介和特点(一)同 SysVinit 和 LSB init scripts 兼容(二)更快的启动速度(三)systemd 提供按需启动能力(四)Systemd 采用 Linux 的 Cgroup 特性跟踪和管理进程…

查询 service monitor 时发生内部错误_通过Service访问应用 (1)

目录通过Service访问应用通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用通过之前的操作,应用部署完成了,我们的Demo网站已经成功启动了,那么如何访问网站呢?通过Pod IP访问应用我们可以通过Pod IP来…

jdk 8 时区 转换_使用JDK 8将收藏转换为地图

jdk 8 时区 转换我多次遇到这样的情况,希望将多个对象存储在Map中而不是Set或List中,因为将唯一标识信息的Map应用于对象有一些优势 。 Java 8通过流和Collectors.toMap(…)方法使翻译变得比以往更加容易。 使用Map而不是Set的一…

开源备份软件 oracle,oracle备份和恢复

最好把所有表删掉重新导入,表字段改变不会还原出来 ,只会还原数据1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中exp system/managerTest filed:\DB_backup\GWAMQA_Oracle\GWAM_Dev_201410311059.dmp fully2 将数据库中system用…

c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...

如果用C语言输出:Hello,world!,该如何编写程序?**代码如下:**#include//包含标准库的信息main()//定义名为main的函数,不接受参数值{//main函数的语句都放在花括号中,也表示函数体的…

iPhone 手机/苹果手机如何设置来电铃声?

文章目录方法一、使用 APP 库乐队设置方法二、使用第三方软件「爱思助手」设置方法一、使用 APP 库乐队设置 详见《iPhone 手机设置铃声简易教程》 方法二、使用第三方软件「爱思助手」设置 详见《苹果 iPhone 手机怎么设置铃声》

linux定时创建文件,linux下如何创建定时任务

文/PM回忆录本篇文章不详细讲述cron服务的那种配置文件,只是应用层面的讲解,只求初步的掌握。说到定时任务,不能不介绍下cron:一、cron定时任务是什么在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|gr…

连接堡垒机出现java环境_Java 8:长期支持的堡垒

连接堡垒机出现java环境斯蒂芬科尔本 ( Stephen Colebourne )的文章“ Java 9可以使用六个星期 ”开始,“ Java 9仅仅六个星期就已经过时了。” Colebourne参考了Mark Reinhold博客文章“ Moving Java Forwarding Faster ”,并写道…

assertj断言异常_编写自定义的AssertJ断言

assertj断言异常AssertJ是广泛使用的Hamcrest匹配器的替代匹配库。 实际上,对于我自己的项目,我已经更改为仅使用AssertJ-我只是发现流畅的界面和可扩展性非常吸引人。 您可以编写自定义断言,如下所示: 想象一下一种具有强度和饮…

Unix 发展简史

1965年时,贝尔实验室(Bell Labs)加入一项由通用电气(General Electric)和麻省理工学院(MIT)合作的项目;该项目要建立一套多使用者、多任务、多层次(multi-user、multi-ta…

linux服务器不会中毒,[转载]ubuntu 不会中毒的原因(转)

ubuntu不会中毒的原因不是因为linux用户少,而是其它原因。如下是转载的高手的文章:可能不少人持这样一种观点,认 为 Linux病毒少是因为Linux不像Windows那么普及,其实这种观点很早已经被人批驳过了,一个最有力的论据是…

6-7 使用函数输出水仙花数_「Java」再议printf函数

System.out.printf() 是在JDK1.5版开始引入的方法,即在JDK1.5以后的版本才可以使用此函数,printf 方法有 printf(String format, Object ... args) 和 printf(Locale l, String format, Object ... args) 两种重载方式。其实学过C语言的小伙伴应该会觉得…