Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么?

尽管上面有暗示性的形象,我们也不想发动任何不必要的圣战。 当归结为编码样式时,大多数选择都是相当随意的,并取决于个人喜好。 是的,即使在编辑器之间制表符宽度改变了,空格也趋于更精确。

doSomethingIf

如果有开发团队人类学之类的东西,风格指南可能是其中的主要部分。

在这篇文章中,我们将重点介绍Google,Twitter,Mozilla,Java标准以及我们自己在Takipi团队中的公司的格式设置准则和不同的Java编码样式。

为什么首先使用准则?

可读性是这里的主要考虑因素。 几乎可以肯定,您将不是唯一阅读所编写代码的人。 对于下一个阅读您的代码的人,您可以做的最好的事情就是遵守约定。

一致的写作风格不仅有助于创建美观的代码,而且使其更易于理解。 Twitter指南指定了一个例外,我们倾向于同意:“如果更具可读性的变种带有危险或陷阱,则可能会牺牲可读性”。

完整的样式指南可在此处获得:

  1. Google Java样式指南 (还有另一本针对Android的指南)
  2. Twitter风格指南
  3. 官方Java代码约定 (可在此处获得新的OpenJDK指南)
  4. Mozilla准则
  5. 我们在塔基皮的准则

让我们看看他们的库存。

1.缩进:制表符与空格

首先,我们需要先解决这个问题,然后再继续。 样式指南中的选项卡上显然有空格优先。 我们不会在这里讨论利弊,而只是分享发现:

Google: 2个空格(android是4个空格,换行是8个空格)
Twitter: 2或4个空格(用于换行)
Mozilla: 4个空格 Java: 4个空格,制表符必须设置为8个空格。 两者都是可以接受的。

也许使用制表符的开发人员不喜欢编写样式指南��。

来自Github的数据表明,大约10-33%的Java存储库更喜欢使用制表符,并且大多数使用不同形式的空格,而不是2优先使用4个空格。实际上有一个相当不错的模块可以运行此分析(比较不同的语言)。 顺便说一句,窥视Scala和Clojure等其他JVM语言,我们看到几乎100%2的空间。

考虑到覆盖个人提交的更大数据集给我们带来了不同的结果( Convention Analysis项目 , Github数据挑战赛的获胜者之一 ),但是我们可以估计它大约在10%之间。

(以防您好奇,在塔基皮我们更喜欢制表符。我们不是野蛮人。 去理查德·亨德里克斯! )

tabsvsspaces-768x356
Java Tabs vs Spaces –分析流行的代码约定(来源: outsideris / popularconvention )

2.线长,绕线和断点

有时,Java代码的行数往往会很长,并且样式指南在何时中断或换行时设置了约定。 一般约定最大长度约为80-100

Google: 100列
Twitter:倾向于100列
Mozilla:适当的判断 Java: 80列

当然,除了分号后的自然中断外,不仅在行过长时使用换行符,而且还用于逻辑分离。 一般约定是在逗号前,运算符前打断,并使用一些常识。

这是twitter风格指南中的一个示例,充分利用了这一概念:

// Bad.
//   - Line breaks are arbitrary.
//   - Scanning the code makes it difficult to piece the message together.
throw new IllegalStateException("Failed to process request" + request.getId()+ " for user " + user.getId() + " query: '" + query.getText()+ "'");// Good.
//   - Each component of the message is separate and self-contained.
//   - Adding or removing a component of the message requires minimal reformatting.
throw new IllegalStateException("Failed to process"+ " request " + request.getId()+ " for user " + user.getId()+ " query: '" + query.getText() + "'");

这有助于分离语句并创建逻辑,其中每一行代码代表一个包含的“原子”操作。 样式指南倾向于在这里达成共识。

空行在混合中也起着重要作用,分隔逻辑块。 Java标准样式指南还参考了双换行符,将接口和实现分开。

3.变量命名

所有样式指南均达成广泛共识。 FirstLetterUpperCase用于类名camelCase用于方法和变量名,所有小写程序包名称,以及ALL_CAPS用于最终静态常量。 记录器是一个常见的例外,我们通常将其定义为:

private static final Logger logger = LoggerFactory.getLogger(Class.class);

Twitter的指南添加了另一种有趣的样式,即在变量名称中包含单位:

// Bad.
//   - Field names give little insight into what fields are used for.
class User {private final int a;private final String m;...
}// Good.
class User {private final int ageInYears;private final String maidenName;...
}

4.异常捕获条款

例外是一个棘手的问题。 最近,我们进行了一项研究, 研究了Github和Sourceforge上的600,000个项目,并发现了有关非标准使用例外的严峻事实。 Google和Twitter的样式指南引用了臭名昭著的空白catch块:

Google:没有空的捕获块
Twitter:换句话说,不要吞下异常
Mozilla:无参考 Java:无参考

此外,我们建议至少尝试保留的另一项准则是确保异常是可操作的 ,并避免控制流异常。 在生产环境中引起的所谓“正常”异常的噪声数量令人恐惧。

Takipi的主要动机是,异常和错误处理的当前状态(主要依靠日志文件来确定其在生产中的根本原因)。 如果您还没有,请检查一下! 我们很想听听您的想法。

5.括号清楚,花括号

即使没有必要,括号也可以帮助提高可读性。 对于复合谓词,即使执行顺序很明显,也通常使用括号来保持清晰。 例如:

if (x == y && a > 10) // bad
if ((x == y) && (a > 10)) // good

那么样式指南对分组括号有何看法?

Google: “推荐”
Twitter: “明确”(即使很明显)
Java: “通常是个好主意” Mozilla:遵循Java标准

处理花括号时,所有样式指南都检查了在打开花括号后支撑是否断裂。 在Takipi,我们实际上做了相反的事情,但我们并不孤单,尽管大多数Java开发人员都使用“行内”花括号,但此处检查的代码提交中有37%使用换行符:

花括号-768x360
块语句样式–分析流行的代码约定(来源: outsideris / popularconvention )

6.建设者内无脑

我们保留但没有在任何样式指南中找到的一个准则是,不要在构造函数中保留任何“大脑”(因此,它们对于僵尸是安全的,但显然不会因薄弱的笑话而被拒绝)。

如果我们需要创建一个对象并进行一些繁重的操作来构建它,则可以使用creator方法。 例如:

/// simple constructor
//
private final int x;
private final int y;
private final String z;public MyClass(int x, int y, String z) {this.x = x;this.y = y;this.z = z;
}// complex building
//
public static MyClass create(List<Stuff> list, Set<Stuff> set) {// int x = some brains...// int y = more brains...// other brains...// String z = more complex stuff here//return new MyClass(x, y, z);
}private final int x;
private final int y;
private final String z;private MyClass(int x, int y, String z) {this.x = x;this.y = y;this.z = z;
}

最后的想法

为了避免使本指南成为详尽无遗的清单,我们在本文中没有涉及更多样式指南,这些指南都可以在本文开头链接的原始文档中找到。 可读性是保持代码无错误的主要因素,并且…防止这些OCD感觉发麻是正确的。

您要遵循哪些独特的准则/怪癖? 您的公司/团队是否使用自己的风格指南? 请随时在下面的评论部分中分享这些内容!

翻译自: https://www.javacodegeeks.com/2016/07/tabs-vs-spaces-write-java-google-twitter-mozilla-pied-piper.html

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

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

相关文章

ES group分组聚合的坑

参考链接&#xff1a;https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究&#xff0c;今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…

字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a;…

Codeforces Round #498 (Div. 3) F. Xor-Paths

题目链接&#xff1a;F. Xor-Paths 题解&#xff1a;从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc.h>2 #include<set>3 #include<cstdio>4 #include<iomanip>5 #include<iostream>6 #include<string>7 #include<cst…

创建健壮的微服务架构所涉及的组件

在本文中&#xff0c;我们将简要学习构建强大的微服务应用程序所需的各种软件组件。 在简要了解每个架构组件之前&#xff0c;我们将陈述设计微服务架构时出现的一般查询。 1.微服务架构组件 每当我们创建微服务应用程序时&#xff0c;我们都会想到以下问题 我们将如何注册微…

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

jax-rs jax-ws_JAX-WS入门

jax-rs jax-wsJAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.e…

lingo解题报告内容解释

1.2菜单介绍 1.2.1 File 1 New 新建一个窗口,当你执行这个命令时,会出现如下对话框: 你可以在对话框中选择你想要建立的类型.类型如下: 1)扩展名为(*.lg4) LG4格式是LINGO4.0的版本,是在Windows下最主要的储存文件格式,这种格式支持字体格式,自定义格式以及动态连接, LG4以二进…

OpenShift上的无痛集装箱化JBoss通用贷款处理

我们从头到尾讨论了各个层次&#xff0c;但尚未为您提供除Red Hat之外的任何应用程序开发工具。我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 容器开发套件&#xff08;CDK&#xff09; 。 到目前为止&#xff0c;您所拥有的只是一个…

多任务编程—多进程

什么是多任务编程&#xff1f; 多任务编程其实和计算机系统内核有关&#xff0c;通过程利用多个计算机内核同时执行程序&#xff0c;以此来提升程序执行的效率。 多任务编程其中包括&#xff0c;多进程、多线程和多协程&#xff0c;这三种多任务编程各有各的优点和缺点&#xf…

java锁实现_Java锁实现

java锁实现我们都将第三方库用作开发的正常部分。 通常&#xff0c;我们无法控制其内部。 JDK随附的库是一个典型示例。 这些库中的许多库都使用锁来管理争用。 JDK锁具有两种实现。 一个使用原子CAS样式指令来管理索赔过程。 CAS指令往往是最昂贵的CPU指令类型&#xff0c;并且…

洛谷 P1027 Car的旅行路线

P1027 Car的旅行路线 题目描述 又到暑假了&#xff0c;住在城市 AA 的 CarCar 想和朋友一起去城市 BB 旅游。她知道每个城市都有 44 个飞机场&#xff0c;分别位于一个矩形的 44 个顶点上&#xff0c;同一个城市中 22 个机场之间有 11 条笔直的高速铁路&#xff0c;第 II 个城市…

API

api 百科名片 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。目…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…

使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 我们刚刚发布了Java SDK的主要升级版…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…

GitHub多人协作简明教程

本文面向已经了解/熟悉git基本命令但是并不熟悉如何使用GitHub进行多人协作开发项目的同学。 为了简单起见&#xff0c;这里假设只有两个开发人员&#xff0c;HuanianLi 和 DaxiangLi。他们在GitHub上的地址和角色为&#xff1a; HuanianLi: https://github.com/huanianli # M…

2020地区mysql表_2020年甘肃省军队文职考试职位表下载:张掖地区招13人

2020年6月15日全军面向社会招考文职人员公告已发布&#xff0c;全国招聘27073人&#xff0c;甘肃省招聘370人&#xff0c;其中张掖地区总共招聘13人。此次考试博士招考岗位报名时间为2020年6月17日至21日&#xff0c;其他招考岗位报名时间为7月1日至10日。考试时间为2020年8月2…

superhot预告片下载_预告片:裸指关节SOA

superhot预告片下载我正在研究这个想法&#xff0c;但我不知道它是否对你们有吸引力。 我想就您是否需要进一步探讨提出您的意见。 这是一笔交易&#xff1a;我遇到了一些团队&#xff0c;这些团队在使用SOA技术时由于其工具的绝对复杂性而陷入泥潭。 我只在Java中看到过这种情…