java java编码_Java编码约定被认为是有害的

java 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 (Hibernate,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

java java编码

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

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

相关文章

PostgreSQL数据库修改sql表的方法汇总

一&#xff0c;修改表 PostgreSQL 提供了一族命令用于修改现有表。 可以实现&#xff1a; 增加字段&#xff0c; 删除字段&#xff0c; 增加约束&#xff0c; 删除约束&#xff0c; 修改默认值&#xff0c; 重命名字段&#xff0c; 重命名表。 这些操作可以用&#xff1a;ALTE…

混淆矩阵怎么看_201.工具篇MECE法则:透过结构看世界。

工具篇|战略工具1之前讲过了商业、管理、个人&#xff0c;今天讲如何用工具来提高上述的效率工具。今天先讲一MECE法则。某公司将2020年定为品牌战略年&#xff0c;小王接到领导安排写作任务&#xff0c;要求充分阐述公司 的品牌主张。小张憋了半天&#xff0c;稿子交了上去。领…

nRFgo Studio 和 Nrfjprog 无法找到JLinkARM.dll的解决方法

本文转自&#xff1a;https://www.lotlab.org/2017/09/12/nrfgo-studio-and-nrfjprog-could-not-find-jlinkarm-dll/ Segger在第一次安装的时候&#xff0c;会在注册表中添加安装路径的字段&#xff0c;nRF的两个软件就根据这两个注册表字段来寻找JLinkARM.dll。而当你卸载/更新…

mnist数据集图片提取出来

# -*- coding: UTF-8 -*-# 把mnist数据集转成图片做测试&#xff0c;图片更为通用import cv2 import os from keras.datasets import mnistimport numpy as np str_1 mnisttrain str_2 mnisttest if os.path.exists(str_1):os.mkdir(str_1)if os.path.exists(str_2):os.mkdir…

重新打包流中的异常

Java 8已有两年的历史了&#xff0c;但是仍然存在社区尚未为其开发好的解决方案的用例&#xff0c;甚至边缘用例。 如何处理流管道中的已检查异常就是这样的问题之一。 Stream操作接受的功能接口不允许实现抛出已检查的异常&#xff0c;但是我们可能要调用许多方法。 显然&…

如何将word中的对象怎么显示到工具栏_MathType怎么添加到Word快速访问栏?

众所周知&#xff0c;MathType是一款应用广泛且功能强大的公式编辑器&#xff0c;特别是应用到Word中&#xff0c;可以对文章中的公式进行批量操作&#xff0c;进行这个公式操作的前提是&#xff0c;需要把MathType添加到Word文档的快速访问栏中&#xff0c;也就是说只安装了Ma…

Java 多线程异常捕获Runnable实现

1、背景&#xff1a; Java 多线程异常不向主线程抛&#xff0c;自己处理&#xff0c;外部捕获不了异常。所以要实现主线程对子线程异常的捕获。 2、工具&#xff1a; 实现Runnable接口的LayerInitTask类&#xff0c;ThreadException类&#xff0c;线程安全的Vector 3、思路&a…

团队项目冲刺第六天

昨日任务  对于关于我界面的 关于我们 的界面。今日任务完成功能介绍界面以及转换&#xff0c;并且在功能介绍界面增加特效&#xff0c;获取本机的时间&#xff0c;年月日星期几小时分钟 秒&#xff0c;可以看时间。明日任务完成联系我们的功能。困难在增加特效功能中一直获…

tf.cast

tf.cast(x, dtype, nameNone) 将x的类型转换为指定类型 import tensorflow as tf import numpy as np znp.array([0,1,3,4,6,4,7,1,0]) cast tf.cast(z,tf.float32)with tf.Session()as sess:print(z)print(sess.run(cast))输出 z的元素有整形变为浮点型

python 输入字符串_输入输出,字符串如影随形 | Python基础连载(五)

更好的排版阅读体验&#xff0c;请移步 微信端 开篇 前面两期详细的介绍了字符串及其相关操作&#xff0c;在今后的编程中&#xff0c;你将经常和字符串打交道。一个比较常见的场景就是输入输出&#xff0c;所以本期将结合字符串&#xff0c;讲述最基本同时也是最常用的输入输出…

linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

PATH和LD_LIBRARY_PATH本质都是变量&#xff0c;所谓变量的意思就是由别人赋值产生的&#xff0c;直觉往往会让我们添加和减少这个变量本身的某些路径&#xff0c;实际上这是不正确的。正确的做法是我们要去修改赋予这个变量数值的那些配置文件&#xff0c;加一条路径或者减一条…

BERT、MT-DNN、GPT2.0、ERNIE

目前效果较好的大部分的nlp任务都会应用预训练语言模型的迁移知识&#xff0c;主要是采用两阶段的模型。第一阶段进行预训练&#xff0c;一般是训练一个语言模型。最出名的是BERT,BERT的预训练阶段包括两个任务&#xff0c;一个是Masked Language Model&#xff0c;还有一个是N…

tf.argmax

tf.argmax可以认为就是np.argmax。tensorflow使用numpy实现的这个API 简单的说&#xff0c;tf.argmax就是返回最大的那个数值所在的下标。 test np.array([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7,2]])np.argmax(test, 0)   &#xff03;输出&#xff1a;array([3, 3, 1]…

guava 并发_Google Guava并发– ListenableFuture

guava 并发在上一篇文章中&#xff0c;我介绍了使用Guava库中com.google.common.util.concurrent包中的Monitor类的方法。 在这篇文章中&#xff0c;我将继续介绍Guava并发实用程序&#xff0c;并讨论ListenableFuture接口。 ListenableFuture通过添加接受完成侦听器的方法&…

mysql 递归_「MySQL」 - SQL Cheat Sheet - 未完成

近几个月的心情真是安排的妥妥的&#xff0c;呈现W状。多的不说了&#xff0c;这里对SQL的测试进行简单梳理&#xff0c;制作一份SQL Cheat Sheet。0x01、数据库基本架构Clinet层Server层连接器网络连接建立、管理长连接导致的OOM的自动处理权限管理缓存KV分析器词法分析语法分…

ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别

前记&#xff1a; jdk官方文档&#xff08;javadoc&#xff09;是学习的最好&#xff0c;最权威的参考。文章分上中下。上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别&#xff0c;池大小参数corePoolSize和maximumPoolSize&#xff0c;BlockingQueue选…

Apache Lucene 7.0即将发布!

Apache Lucene项目可能会在几个月后发布其下一个主要版本7.0&#xff01; 请记住&#xff0c;Lucene开发人员通常会努力为下一个非主要&#xff08;功能&#xff09;发行版移植新功能&#xff0c;而即将发布的6.5已经有了很多重大更改 &#xff0c;因此新的主要发行版令人兴奋…

windows常用服务命令

windows运行打开服务命令的方法 &#xff1a;在开始-》运行&#xff0c;输入以下命令 gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 explorer--…

springmvc 配置 tag lib_Java自学之springMVC:Hello Spring MVC

学习目的&#xff1a;初识SpringMVC&#xff0c;了解SpringMVC的工作原理Part 1新建一个动态web项目&#xff0c;命名为springMVC&#xff0c;在WEB-INF/lib中&#xff0c;添加所需要的jar包。Part 2在WEB-INF下新建一个web.xml。配置一个DispatcherServlet&#xff0c;所有的请…

GoogLeNet

GoogLeNetInception结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。对上图做以下说明&#xff1a; 1 . 采用不同大小的卷积核意味着不同大小的感受野&#xff0c;最后拼接意味着不同尺度特征的融合&#xff1b; 2 . 之所以卷积核大小采用1、3和5&#xff0c;主要是为…