Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1
Dustin Marx是一位专业软件开发者,从业已经有17年的时间,他拥有电子工程学士学位,还是一位MBA。Dustin维护着一个博客,专门介绍软件开发的各个主题。近日,他撰文谈到了Java开发中常见的危险信号,提出了在日常的Java开发中我们需要尽力避免的一些不正确的做法。感兴趣的读者可以参见本系列文章的第一部分。
缺乏Javadoc注释
我倾向于将所有的契约方法(特别是public方法)都使用Javadoc注释起来。此外,我还觉得对属性添加注释是必要的,注释要描述清楚属性存储的内容是什么。我听说有人拿代码是“自文档”的作为不写Javadoc注释的借口,不过我对此却并不认同,我想对这些人说的是简单的Javadoc注释可以表达出相同的信息,而阅读代码则需要花费更长的时间。虽然有些方法的名字会很长,但有时也无法准确地描述清楚期望的输入条件与输出结果。我认为很多Java开发者(就像我一样)在使用JDK时更喜欢阅读它的Javadoc注释而不是JDK源代码。既然如此,那我们自己编写的代码为何就要反其道而行之呢?我有时也会阅读源代码,这主要是因为注释不够充分,或是行为与描述的不一致,还有可能是我有理由相信注释过期了。
我还喜欢查看类属性的Javadoc注释。有些人倾向于在public get/set方法前加上属性描述信息,不过我不喜欢这种方式,因为这么做就是在假设属性总是有get/set方法(我是不会做这种假设的)。
在方法的Javadoc注释中描述实现细节
虽然我认为没有Javadoc注释是个危险信号,不过错误地使用Javadoc注释同样也是个危险信号。Javadoc注释不应该说明实现细节,而应该关注于客户端对方法的期望(参数)与方法对客户端的期望(返回类型,还有可能是抛出异常等)。在真正的面向对象系统中,实现应该是可以在public接口下进行修改的,因此将接口文档中的这些实现细节放到Javadoc注释中是不恰当的做法。这是个“危险信号”,因为Javadoc中存在的实现细节会让我怀疑注释的时效性。换句话说,这种注释经常会过期,随着代码的不断演化而出现错误。
源代码中的注释
虽然接口(通常是Javadoc)中缺乏注释是一种危险信号,不过方法体和其他源代码中的注释也可能是个危险信号,会导致潜在的问题。如果需要为代码添加注释以帮助人们理解代码的行为,那就很有可能是代码的复杂性过大(“注释是恶臭代码的芳香剂”,这句话有些滑稽,不过在一定程度上却真的如此)。就像文中提到的众多“危险信号”一样,有时我也认为源代码中的注释是有意义的,可以提供很多信息,这时就没有必要删除这些注释了。然而,我认为代码中的注释(不是接口描述的Javadoc注释)应该尽量少一些,而且主要应该关注于“为什么”这么写而不是“如何做”。代码自身应该能够说明“如何”这一问题,不过很多时候是无法清楚地解释出“为什么”(由于客户/管理方向、设计决策、正式的接口需求、正式的算法需求等等)。
实现继承(extends)
我看到很多时候使用extends(实现继承)都很不错,也适合于相应的场景。但很多时候也存在使用不当的情况,实现继承会导致更多的麻烦。
Allen Holub曾说到
extends是邪恶的,
四人帮的
设计模式一书也用了很大的篇幅解释为何说组合要比实现继承更好。随着编写Java代码时间的不断增长,更为重要的是随着我维护Java代码时间的不断增长,我越来越觉得组合相对于实现继承的优势了。我确实看到了实现继承所带来的好处,不过更多的时候类是被“硬塞”到继承体系当中的,子类只不过是对
UnsupportedOperationExceptions打洞或是“
空实现”,因为他们所继承下来的方法并不适用于他们自己。加上
Effective Java一书中所提及的继承问题(比如说具体类的equals与hashCode方法实现等),这真就成了一个大问题了。实现继承并不总是糟糕的,不过很多人经常没有正确地使用他们,因此我觉得这是个“危险信号”。
无作用的代码
程序中出现用不上的代码永远都不是一件好事。人们很快就会忘记它是怎么用的,为什么要这么用。不久之后,开发者就想知道这是不是出于某个原因被扔在那里的。无作用的代码不仅会无意义地增加代码长度,增加维护的复杂度,对于IDE来说,无作用的代码还有可能会被不小心调用,这种情况说明代码基出现了问题。
注释掉的代码
注释掉的代码可能不像可执行的、无意义的代码那么糟糕,因为至少它不会被不小心地调用,显然,这些代码是不会被用到的,不过这仍旧是个危险信号,因为它表明可能会出现潜在的代码基问题。就像无意义的可执行代码一样,注释掉的代码越多,人们就越难理解代码为何会出现在那里、为什么会被注释掉、不使用了为什么不将其删除掉。开发者不敢删除他们,因为留下来肯定是有原因的,只不过没人能够记起来原因是什么了。
To-Do语句
现在越来越流行向代码添加“to-do”语句了,因为现代的Java IDE会为其提供特别的支持与特性。这些特性很有帮助,因为他们经常会将todo标记放在审查列表中,不过“to-do”注释依然是个危险信号,可能会带来与无意义的代码和注释掉的代码相同的问题。当然了,我也会使用“to-do”语句实现短期提醒,不过我觉得最好为其加上一个“过期日期”和联系信息,这样人们就可以清理他们了。加上过期日期与联系信息后,代码中的“to-do”注释就不会一直存在了,否则没有人会记得他们是干什么的,也没人敢删除他们,因为他们可能是在某个时间点被加进去的,很可能是经过某人的深思熟虑后才添加的。当我看到代码中的“to do”语句时,我真是没有任何的办法,只是想知道代码是不是缺少某些功能。
Java开发中常见的危险信号(中)的更多相关文章
- Java开发中常见的危险信号(上)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- day11<Java开发工具&常见对象>
Java开发工具(常见开发工具介绍) Java开发工具(Eclipse中HelloWorld案例以及汉化) Java开发工具(Eclipse的视窗和视图概述) Java开发工具(Eclipse工作空间 ...
- 我的Java开发学习之旅------>求字符串中出现次数最多的字符串以及出现的次数
金山公司面试题:一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数 ...
- java开发两年,连Spring中bean的装配都不知道?你怎么涨薪啊
Spring 1.1.1.1 创建一个bean package com.zt.spring; public class MyBean { private String userName; privat ...
- 【Java】JAVA开发人员常见环境工具安装
1.安装配置JDK1.7:jdk-7u45-windows-x64.exe,环境变量配置:JAVA_HOME---[F:\1024\jdk1.7],CLASSPATH---[.;%JAVA_HOME% ...
- Java Map 集合类在selenium自动化测试设计中的应用
我们在设计自动化测试用例的时候,往往很多工作是在处理测试的数据. 测试数据无论用Excel 文件, XML文件或者任何一种形式测存储方式,都会设计到参数化以及我们对数据的操作. 这个时候,我们会用到以 ...
- 十四种Java开发工具点评
在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美 ...
- 《阿里巴巴Java开发手册》码出高效详解(一)- 为什么要学习阿里编码手册
<Java 开发手册>(以下简称<手册>)是每个 Java 工程师人手必备的一本参考指南.该手册包括 编程规约.异常日志.单元测试.安全规约.MySQL 数据库.工程结构.设计 ...
- 使用 Java 开发兼容 IPv6 的网络应用程序
根据现有 IPv4 地址的部署速度,剩余的地址将在 10 到 20 年被使用殆尽.因此网络逐渐从 IPv4 向 IPv6 转换是不可避免的,相应的各种网络应用程序都将支持 IPv6.对于 Java,从 ...
随机推荐
- 自适应网页设计(Responsive Web Design)(转)
随着3G的普及,越来越多的人使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通 ...
- 防止横竖屏时,iphone自动缩放的一段js代码
function orientation_change() { var viewport = document.querySelector('meta[name="viewport& ...
- cursor:hand与cursor:pointer的区别介绍
cursor:hand 与 cursor:pointer 的效果是一样的,都像光标指向链接一样,光标变成手行. cursor:hand :IE完全支持.但是在firefox是不支持的,没有效果. cu ...
- bzoj 2555: SubString 后缀自动机+LCT
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 688 Solved: 235[Submit][Status][Dis ...
- Bootstrap 貌似不错,先做一下记录
Bootstrap 简洁.直观.强悍的前端开发框架,让web开发更迅速.简单. http://www.bootcss.com/
- apk签名《转》
出处!:http://jeff-pluto-1874.iteye.com/blog/847366 我觉得写的不错就转载了. 一.Android Apk签名Apk签名首先要有一个keystore的签名用 ...
- [wikioi]线段覆盖
http://wikioi.com/problem/1214/ 这道题也归为贪心了.我也不是很能分辨,但想法确实是:1.有阶段最优化性:2.前一状态和后一状态有关系. 想法:1.排个序是很自然的想法, ...
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE
一. 假设有情形如:cd里有很多轨,当播放音乐时,要统计每个音轨的播放次数,这些统计操作不应放在播放方法里,因为统计不是播放音乐的主要职责,这种情况适合应用AOP. 二. 1. package sou ...
- 【Linux安全】安全口令策略设置
命令: vim /etc/login.defs 默认设置: # Password aging controls: # # PASS_MAX_DAYS Maximum number of days a ...
- ArcGIS Engine Style文件操作
对于一个GISer来说,地图,符号这些都应该有着比别人更深刻的理解和认识,作为平台软件都会提供一套自己的符号库,符号库里面根据类别和种类进行区分,因为点,线,面的自然存在和固有属性是不肯能让你用面状符 ...