Java编码约定被认为是有害的

在Oracle网站上有Java编程语言指南的正式代码约定 。 您可能希望这份超过20页的文档将是有关Java语言的最佳实践,提示和技巧的最完整,最全面和最权威的来源。 但是一旦你开始阅读它,失望和愤怒就会增加。 我想指出本指南中最明显的错误,不良做法,不良和过时的建议。 如果您是Java的初学者,只需不用学习本教程,而是寻找更好,最新的参考资料。 让恐怖开始吧! 2.2通用文件名

GNUmakefile生成文件的首选名称。 我们使用gnumake来构建我们的软件。 gnumake建立Java项目? 蚂蚁被认为是老派, 行家也被认为是老派。 谁使用make来构建WAR,JAR,生成JavaDoc ...? 3.1.1开头注释所有源文件都应以c样式注释开头,该注释列出了类名称,版本信息,日期和版权声明:将类名称放入注释中以开始文件吗? 如果我改变主意并稍后重命名课程怎么办? 那“ 日期 ”应该代表什么? 有人使用各种占位符通过版本控制系统自动插入文件的最后修改时间。 好吧,VCS可以告诉您文件的创建时间或最后修改时间-一次又一次地修改同一行会使合并变得非常痛苦。 4 –缩进应使用四个空格作为缩进单位。 缩进的确切结构(空格与制表符)未指定。 制表符必须每8个空格(而不是4个)正确设置。 可能是文档中最违反直觉的部分。 有些人喜欢空格,其他人(包括我)则喜欢制表符。 品味和团队安排有关。 但是本指南建议同时使用两者,有时用制表符替换空格。 是“ 未指定 ”。 我的建议:使用选项卡,让每个开发人员将其IDE配置为具有所需的大小凹痕。

4.1线长

避免使用超过80个字符的行,因为许多终端和工具无法很好地处理它们。

80个字符? 我的笔记本电脑可以轻松容纳三倍。 在一行中争取使用120-140个字符,但不要使用硬包装。 我个人只是显示垂直边距,

行的长度由可读性决定。 顺便说一句,以下是来自各种库和框架的类的几个示例:

  • SQLIntegrityConstraintViolationException (JDK SQLIntegrityConstraintViolationException个字符)
  • AbstractInterruptibleBatchPreparedStatementSetter (Spring框架,50个字符)
  • AbstractDataSourceBasedMultiTenantConnectionProviderImpl (休眠,56个字符)
  • PreAuthenticatedGrantedAuthoritiesWebAuthenticationDetails (Spring Security,58个字符)

而且我们假设整行可以容纳80个字符吗?

5.1.2单行注释

if (condition) {/* Handle the condition. */...
}

以防万一代码不够自我描述,我建议使用更好的注释:

if (condition) {/* This block is executed if condition == true. */...
}

5.1.3尾随评论

if (a == 2) {return TRUE;            /* special case */
} else {return isPrime(a);      /* works only for odd a */
}

您的意思是(并且即使没有评论也不要告诉我它的可读性较差)?

return a == 2 || isPrime(a);

6.1每行编号

int level; // indentation level
int size;  // size of table

当我们有注释时,为什么要使用描述性变量名! 考虑一下这个:

int indentationLevel;
int tableSize;

在该部分的后面: 绝对不要在同一行上声明变量和函数。 例:

long dbaddr, getDbaddr(); // WRONG!

当然,这是错误的,甚至无法编译。 我很惊讶没有提到“ 不要在变量名中放置空格 ”是一种好习惯……

6.3放置

仅在块的开头放置声明。 […]不要等到第一次使用变量时才声明它; 它会使混乱的程序员感到困惑[…]这是编码约定希望您编写代码的方式:

int min;            //inclusive
int max;            //exclusive
int distance;
List<String> list;  //one per each itemmin = findMin();
max = findMax();
distance = max - min;
list = new ArrayList<>(distance);
//...

这是如何编写以避免混淆:

final int minInclusive = findMin();
final int maxExclusive = findMax();
final int distance = maxExclusive - minInclusive;
final List<String> listOfItems = new ArrayList<>(distance);
//...

除此之外,我们最终可以(使用nomen est omen )使用final关键字。 本节后面的代码示例显示了类字段缺少private修饰符(默认为包私有访问)的情况。 包私人领域?

7.3返回声明

return (size ? size : defaultSize);

也许您没有注意到,但是从上下文中我们可以看出sizedefaultSize都是boolean类型。 没错, sizedefaultSize可以为truefalse (!)这是违反直觉的! 从这样的文档中,我不仅期望句法正确性,而且期望有意义的代码和良好实践! 此外,表达可大大简化, 一步一步

size ? size : defaultSize
size ? true : defaultSize
size || defaultSize

7.5声明

空的for语句(其中所有工作都在初始化,条件和更新子句中完成)应具有以下形式:

for (initialization; condition; update);


'
for语句 '? 为什么要使用空的for语句? 这是令人困惑的 ,应避免,不应在官方语言指南中予以鼓励和描述。

奖励测验:此代码在C语言中的用途是什么?

while(*dst++ = *src++);

我相信每个计算机程序员都应该理解上面的代码片段。 即使您使用Ruby或TSQL进行编程。

7.8 switch语句

每次遇到case (不包括break语句)时,请在break语句通常所在的位置添加注释。


我了解意图,但做法是错误的。 不要记录意外的和容易出错的代码片段,而要避免它们。 不要依赖失败,根本不要使用它。

8.1空行

在以下情况下,应始终使用一个空白行:

[…]
  • 在方法的局部变量及其第一条语句之间
  • 在块[…]或单行[…]注释之前
  • 一种方法内部的逻辑部分之间,以提高可读性


看来作者建议使用空行来分隔“ 方法逻辑部分 ”。 好吧,我称这些部分为“ 方法 ”。 不要将语句分组在方法内部的块中,对其进行注释或彼此分开。 而是将它们提取到单独的,命名良好的方法中!

在变量声明和第一个语句之间放置空白行听起来像是从C语言书中摘录的。

8.2空格

  • 除以外的所有二进制运算符. 应该用空格将其操作数分隔开。 空格绝对不能将一元运算符(例如一元减号,增量(' ++ ')和减量(' -- '))与其操作数分开。 例:
[…]
while (d++ = s++) {n++;
}

这甚至无法在Java中进行编译

9 –命名约定 (仅PDF版本 ):

char *cp;

cp是Java中char指针的一个好名字。 等等, 什么 ? Java中的char 指针

10.1提供对实例和类变量的访问


没有充分的理由就不要公开任何实例或类变量。 真的, 真的是很好的理由! 我曾经使用过public场所吗?

10.4变量赋值

if (c++ = d++) {        // AVOID! (Java disallows)...
}

极好的建议:请避免使用甚至无法在Java中编译的构造。 这使我们的生活变得更加轻松!

10.5.2返回值

if (booleanExpression) {return true;
} else {return false;
}

应该改为

return booleanExpression;

圣牛, 我同意!

摘要

并不是Java编程语言的官方代码约定是完全错误的。 它们只是过时和过时的。 在二十一世纪的第二个十年中,我们拥有了更好的硬件,对代码质量的更深刻理解以及更现代的智慧资源 。 代码约定…上一次发布是在1999年,它们受到C语言的极大启发,没有意识到数以百万计的开发人员尚未编写的代码行。 就像设计模式一样,代码约定应该随着时间的流逝而出现,而不是明确给出。 因此,请不要再引用或遵循官方指南的建议。

参考: Java 和社区博客上的JCG合作伙伴 Tomasz Nurkiewicz 认为Java编码约定有害 。


翻译自: https://www.javacodegeeks.com/2012/10/java-coding-conventions-considered-harmful.html

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

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

相关文章

flash php socket通信_php socket通信机制实例说明

php socket通信机制实例说明与代码----什么是socket 所谓socket一般也称作"套接字"&#xff0c;用于描述ip地址和端口&#xff0c;是一个通讯链的句柄。使用程序一般经过"套接字"向network发出请求也许应对network请求。说白了就是一种通讯机制。它类似于银…

python的ogr模块_python GDAL/OGR模块安装注意事项

软件准备&#xff1a;首先&#xff0c;确保电脑里已安装python2.7(2.x版本的比较好用&#xff0c;因为还使用ArcGIS)&#xff0c;然后从http://www.gisinternals.com网站上下载这两个文件GDAL-2.1.3.win32-py2.7.msi和gdal-201-1500-core.msi。软件安装&#xff1a;首先安装gda…

课时55.详情和概要标签(理解)

1.什么是详情和概要标签&#xff1f; 作用&#xff1a;利用summary标签来描述概要信息&#xff0c;利用details标签来描述详情信息 默认情况下是折叠展示&#xff0c;想看见详情必须点击 格式&#xff1a; <details> <summary>概要信息</summary> 详情信…

Spring Security可以做的十件事

一 您可以在Spring XML配置文件中指定您选择的授权提供者。 您可以通过配置Spring的http://www.springframework.org/schema/security/spring-security-3.1.xsd模式中定义的authentication-manager来实现。 简化的authentication-manager元素定义看起来像这样&#xff1a; &l…

python编写自定义函数判断n1-n2范围内的素数_【每日道代码题001】- PYTHON基础复习...

问题001-1&#xff1a;请对输入三个整数a,b,c,判断能否以它们为三个边长构成三角形。若能&#xff0c;输出YES和面积&#xff0c;否则输出NOa float(input())b float(input())c float(input())if a > 0 and b > 0 and c > 0: #判断边长是否为正if (a b > c) an…

php绘制一个三角形,如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...

我们在平时的前端开发的时候&#xff0c;有时候是需要一些小图形来丰富一下页面效果&#xff0c;比如&#xff1a;下拉列表的倒三角图形。那么这样的一个三角形是如何制作出来的&#xff0c;本章给大家介绍如何利用css或html画出一个三角形&#xff1f;两种不同的制作三角形方法…

课时53.video标签(掌握)

这节课来学习一下html5中新增的标签&#xff0c;我们先来看一下&#xff0c;html5中新增了哪些标签&#xff1f; 打开W3school的网页&#xff0c;点击参考手册中的HTML/HTML5标签&#xff0c;有一个按字母顺序排列的标签&#xff0c;但凡标签后面带有5标记的&#xff0c;都是h…

Date函数基础知识整理

Date类型&#xff1a;1.Date.parse()接收一个表示日期的字符串参数&#xff0c;然后再根据这个字符串返回响应的日期的毫秒数&#xff1b;如&#xff1a;创建一个日期&#xff1a; 1 <script> 2 // var someDatenew Date(May 25,2004); 3 // console.log(someDate);//Tue…

Google Guava –与Monitor同步

Google Guava项目是每个Java开发人员都应该熟悉的库的集合。 Guava库涵盖I / O&#xff0c;集合&#xff0c;字符串操作和并发性。 在这篇文章中&#xff0c;我将介绍Monitor类。 Monitor是一种同步构造&#xff0c;可以在使用ReentrantLock的任何地方使用。 在任何时候&#x…

yaf 重写index.php,php框架Yaf路由重写实例代码

通常为了友好的URL格式&#xff0c;会进行站点URL的重写&#xff0c;可以在webserver(Nginx)的配置中进行rewrite&#xff0c;也可在在程序端进行&#xff0c;本文主要和大家介绍php框架Yaf路由重写&#xff0c;给大家做个参考&#xff0c;希望能帮助到大家。以下使用Yaf框架进…

python类初始化导入库_Python中optparser库用法实例详解

本文研究的主要是Python中optparser库的相关内容&#xff0c;具体如下。一直以来对optparser不是特别的理解&#xff0c;今天就狠下心&#xff0c;静下心研究了一下这个库。当然了&#xff0c;不敢说理解的很到位&#xff0c;但是足以应付正常的使用了。废话不多说&#xff0c;…

SQL--Chapter8--Working with Triggers and Transactions

Objectives:1.Implement triggers 2.Implement transactions 转载于:https://www.cnblogs.com/Catherinezhilin/p/7979644.html

Canvas制作的下雨动画

简介 在codepen上看到一个Canvas做的下雨效果动画&#xff0c;感觉蛮有意思的。就研究了下&#xff0c;这里来分享下&#xff0c;实现技巧。效果可以见下面的链接。 霓虹雨: http://codepen.io/natewiley/full/NNgqVJ/ 效果截图&#xff1a; Canvas动画基础 大家都知道&…

在Eclipse中有效使用JUnit

最近&#xff0c;我被卷入了讨论1和一些受感染的同伴2&#xff0c;他们关于我们如何在Eclipse IDE中使用JUnit 。 令人惊讶的是&#xff0c;对话带来了并非所有人都知道的一些“技巧”。 这使我有了写这篇文章的想法&#xff0c;总结了我们的演讲。 谁知道–也许有人也有新事物…

jquery文件上传控件 Uploadify

基于jquery的文件上传控件&#xff0c;支持ajax无刷新上传&#xff0c;多个文件同时上传&#xff0c;上传进行进度显示&#xff0c;删除已上传文件。 要求使用jquery1.4或以上版本&#xff0c;flash player 9.0.24以上。 有两个版本&#xff0c;一个用flash,一个是html5。html5…

imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例

PHP 使用Imagick模块 缩放&#xff0c;裁剪&#xff0c;压缩图片 包括gif图片缩放 裁剪代码如下:/*** 图片裁剪* 裁剪规则&#xff1a;* 1. 高度为空或为零 按宽度缩放 高度自适应* 2. 宽度为空或为零 按高度缩放 宽度自适应* 3. 宽度&#xff0c;高度到不为空或为…

php实现第三方邮箱登录_PHP实现用户异地登录提醒功能的方法

有时候你的网站账号被盗或你在别处登录操作后台时&#xff0c;右下角会弹出提示信息&#xff0c;提醒你的账号异地登录&#xff0c;或者会被强制下线。对于这种安全性要求比较高的web网站&#xff0c;很多后台管理都会做这种功能提醒。甄别自己的账号是否被盗或者是否有另一个人…

课时47.datalist标签(了解)

1.datalist标签 作用&#xff1a;给输入框绑定待选项 2.datalist格式&#xff1a; <datalist> <option>待选项内容</option> </datalist> 3.如何给输入框绑定待选列表&#xff1f; 搞一个输入框搞一个datalist列表给datalist列表标签添加一个id给…

pandas.read_csv参数详解

读取CSV&#xff08;逗号分割&#xff09;文件到DataFrame也支持文件的部分导入和选择迭代更多帮助参见&#xff1a;http://pandas.pydata.org/pandas-docs/stable/io.html参数&#xff1a;filepath_or_buffer : str&#xff0c;pathlib。str, pathlib.Path, py._path.local.Lo…

Gradle – Maven的观点

正如我博客的读者所知道的&#xff0c; 我有点像Maven迷 。 我从2007年8月左右开始使用Maven&#xff0c;从没有回过头。 但是&#xff0c;就像其他所有情况一样&#xff0c;“变化是唯一不变的”。 现在这个领域还有其他参与者&#xff0c;Gradle看起来是最有前途的。 我决定试…