日志消息是可执行代码和注释

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

// 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/348882.shtml

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

相关文章

代做html网页多少钱,代做排名网站有吗,做排名帮你实现财富自由

影响关键词排名的因素有哪些:1、影响搜索排序的因素前一段,我们在百度搜索排序规则中,实际上已经讨论过这个话题,其中核心的因素主要包括如下内容:① 网站主体与主题的权威度。② 页面内容的专业性以及多样化。③ 网站…

html flash层级,解决FLASH遮住其他层元素问题

刚做了个幻灯片广告,产品人员需要在第一个位置放flash,然后其他的都是图片,但是幻灯片切换到第一张的时候,圆圈tab元素不见了,只有在谷歌浏览器下面正常,用firebug看是被flash盖住了,&#xff0…

电脑没有使用计算机进入睡眠状态,电脑打不开,屏上显示:无视频输入,进入睡眠模式。怎么处理...

1、电脑能正常打开电源,并进行coms自检,但就是不能启动操作系统。光标在黑屏上闪烁,有提示:“Press any key to restar computer.”1)我碰到的这种情况解之道是检查软驱中是否有软盘。为什么要这样做呢,因为很多人的机…

prng伪随机数生成器_Java伪随机数生成器(PRNG)中的弱点

prng伪随机数生成器这将是Kai Michaelis,JrgSchwenk和我撰写的论文的总结,该论文在RSA Conference 2013的密码学家会议上发表 。 你可以得到我的演讲的幻灯片在这里和我们的全文在这里 。 我们对PRNG(主要是SecureRandom)附带的常…

时钟在微型计算机中作用,微型计算机系统中的实时时钟

实时时钟(RTC)是一种IC,可以跟踪当前时间。微处理器通常可以通过串行接口读取此信息,以方便软件执行与时间有关的功能。RTC专为超低功耗而设计,因为它们通常在主系统断电时仍可继续运行。这样一来,他们就可以根据绝对时间基准(通常…

五个使Java变得更好的功能

我偶然发现了Brian Goetz 提出的有关Java数据类的建议 ,立即意识到我也对如何使Java更好地成为一种语言有一些想法。 我实际上有很多,但这只是五个最重要的列表。 专制(2006),迈克贾奇(Mike Judge&#xf…

nit计算机应用基础是考试大纲,NIT考试大纲--计算机应用基础.doc

NIT考试大纲--计算机应用基础.doc全国计算机应用技术证书考试大纲【 HYPERLINK "javascript:doPrint()" 打印】【字体: HYPERLINK "javascript:doZoom(16)" 大 HYPERLINK "javascript:doZoom(14)" 中 HYPERLINK "javascript:doZ…

html选中列表整列变色,excel选中行变色完整代码和动画效果

内容提要:文章介绍excel选中行变色的效果以及实现选中行变色的VBA代码。在excel中如果行数过多,经常核对数据的准确性,容易错行跳行,所以才有本文的小技巧:excel选中行变色。当我们在excel工作表中,鼠标随便…

java 递归改非递归_使用Java ThreadLocals的意外递归保护

java 递归改非递归对于那些使用第三方工具来尝试扩展它们而又不完全了解它们的人来说,这是一个小技巧。 假定以下情况: 您想扩展一个展示分层数据模型的库(假设您要扩展Apache Jackrabbit ) 该库在访问内容存储库的任何节点之前…

大连理工18秋计算机应用基础,大连理工大学网络教育本科计算机应用基础入学考试模拟题...

大连理工大学网络教育本科计算机应用基础入学考试模拟题一、单选题1. 世界上第一台电子数字计算机采用的电子器件是______。A.大规模集成电路 B.集成电路C.晶体管 D.电子管2. 将计算机分为巨型机、大中型机、小型机、微型机、工作站等五类的分类标准是______。A.计算机处理数据…

构造函数还是静态工厂方法?

我相信Joshua Bloch在他的非常好的书“ Effective Java”中首先说了它:与构造函数相比,静态工厂方法是实例化对象的首选方法。 我不同意。 不仅因为我相信静态方法是纯粹的邪恶,而且主要是因为在这种特殊情况下,它们伪装成好的方法…

html vue分页,Vue.js bootstrap前端实现分页和排序

写之前先抱怨几句。本来一心一意做.net开发的,渐渐地成了只做前端。最近项目基本都用java做后台,我们这些.net的就成了前端,不是用wpf做界面,就是用html写web页面。深知自己前端技术不足,以前虽说用asp.net前后台都做&…

福建计算机及应用专业的大学,33所福建大学公布国家级/省级一流本科专业!

近日,教育部发布《教育部办公厅关于公布2020年度国家级和省级一流本科专业建设点名单的通知》。据悉,本次教育部一流本科专业建设“双万计划”评选共认定了3977个国家级一流本科专业建设点,其中中央赛道1387个、地方赛道2590个,并…

高度有用的Java ChronoUnit枚举

几年前,我发表了博客文章“ The Highly有用的Java TimeUnit Enum ”,其中介绍了JDK 5引入的TimeUnit枚举。 JDK 8引入了一个更新的枚举ChronoUnit ,它比TimeUnit更适合于诸如日期/时间操作等并发以外的上下文。 位于所述java.time.temporal包…

计算机管理ap,如何设置AC功能管理无线AP

AC功能管理无线AP第一步、连接ap举例型号TL-ER6520G不同类型的AP供电方式可能有所差异,包括直流电源供电和网线供电(PoE供电)两种。如下[1] 直流电源供电使用自带的电源适配器给AP供电,要求AP安放位置必须有电源插座,优点是节省成本。按照拓扑…

代表机械 计算机技术的颜色,基于机器视觉识别的交通灯控制系统

1、引言机器视觉又称计算机视觉,是用计算机来实现人的视觉功能,也就是用机器代替人眼来做测量和判断。机器视觉技术包含光源照明技术、光成像技术、传感器技术、数字图像处理技术、机械工程技术、检测控制技术、模拟与数字视频技术、计算机技术、人机接口…

java开发者工具开源版_JArchitect对Java开源贡献者免费

java开发者工具开源版JArchitect是用于Java代码库的静态分析工具,它提供交互式GUI和HTML报告,用于查找代码中过于复杂或有问题的区域,执行分析以重构并比较随时间的变化。 在版本3中,添加了类似LINQ的查询语言,该工具使…

有没有查计算机组成的答案得,计算机组成答案.doc

黄淮学院计算机科学系2008—2009年第二学期2007级《计算机组成原理》期终试卷(A)参考答案及评分标准命题人:王晓涓注意事项:本试卷适用于2007级软件工程专业本科学生使用一、单项选择题(每题1分、共15分)1、B 2、B 3、A 4、D 5、A 6、D 7、D 8、C 9、C 1…

使用JDK 8将收藏转换为地图

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

计算机上没有启动程序怎么办,Win7开机不加载启动项怎么办

现在的电脑为了受到更好的保护,往往在开机的时候就加载了一些启动项,如:杀毒软件,安全卫士等等。可有时候会发现,在Win7操作系统中,安装后发现不能开机加载启动项。在注册表中,在msconfig中&…