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,一经查实,立即删除!

相关文章

Matlab数据标准化

zscore%据说就是原数据减去均值再除以标准差标准回归系数&#xff1a;1、标准化回归系数测度的是对被解释变量的重要性&#xff0c;只有标准化了&#xff0c;才能进行重要性对比。

matlab学习-线性规划

[x,fval,exitflag,output,lambda]linprog(f,a,b,aeq,beq,lb,ub) 其中f、x、b、beq、lb、ub为向量&#xff0c;a、aeq为矩阵。 min zf s.t. a*x<b aeq*xbeq lb<x<ub x:线性规划最优解 fval&#xff1a;线性规划最优值 exitflag&#xff1a;输出标…

bug单的提交

顶头信息 所属产品&#xff0c;所属项目&#xff0c;所属模块&#xff0c;影响版本&#xff0c;当前指派&#xff0c;bug类型&#xff1a;代码错误&#xff0c;界面优化&#xff0c;设计缺陷&#xff0c;性能问题&#xff0c;标准规范&#xff0c;其他&#xff0c;安全相关。bu…

Matlab各种随机数汇总

randn();%正态分布随机数R&#xff1d;normrnd(MU,SIGMA)R&#xff1d;normrnd(MU,SIGMA,m)R&#xff1d;normrnd(MU,SIGMA,m,n) 注&#xff1a;正态分布只需要2个参数。 randn() 是标准正态分布&#xff1b;normrnd()是自己可以指定均数和标准差的正太分布。rand();randi();是…

ES group分组聚合的坑

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

使用tinylog 1.1改进您在Java EE应用程序中的登录

tinylog是Java的轻量级日志记录框架。 与Apache Log4j和Logback相反&#xff0c;tinylog由仅80KB的单个JAR文件组成&#xff0c;没有任何依赖性&#xff0c;并且具有静态logger类。 这意味着您无需使用任何样板代码为每个类创建记录器实例。 public static void main(String[]…

一般区域二重、三重积分MATLAB计算方法

这里讨论的计算方法指的是利用现有的MATLAB函数来求解&#xff0c;而不是根据具体的数值计算方法来编写相应程序。目前最新版的2009a有关于一般区域二重积分的计算函数quad2d&#xff0c;但没有一般区域三重积分的计算函数&#xff0c;而NIT工具箱似乎也没有一般区域三重积分的…

搜索时,怎样排除不需要的关键字

初阶搜索最基本的搜索&#xff0c;即查询包含单个关键字的信息。现在&#xff0c;进一步探讨多个关键字以及关键字间不同逻辑关系的查询。搜索结果要求包含两个及两个以上关键字一般搜索引擎需要在多个关键字之间加上“”。示例&#xff1a;搜索所有包含关键词“易筋经”和“吸…

Java集合类框架的基本接口有哪些?

总共有两大接口&#xff1a;Collection 和Map &#xff0c;一个元素集合&#xff0c;一个是键值对集合&#xff1b; 其中List和Set接口继承了Collection接口&#xff0c;一个是有序元素集合&#xff0c;一个是无序元素集合&#xff1b; 而ArrayList和 LinkedList 实现了List接口…

Matlab求对数

Matlab中只是提供了log、log10和log2&#xff0c;其他的都需要换底公式得到。logaBlogB/loga;

C# NTP时间同步类

添加类 NTPClient /// <summary>/// SNTPClient is a C# class designed to connect to time servers on the Internet and/// fetch the current date and time. Optionally, it may update the time of the local system./// The implementation of the protocol is ba…

字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

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

jaxb需要jar包吗_JAXB –不需要注释

jaxb需要jar包吗似乎有一个误解&#xff0c;认为在模型上需要注释才能使用JAXB&#xff08;JSR-222&#xff09;实现。 事实是&#xff0c;JAXB是例外配置&#xff0c;因此仅当您要覆盖默认行为时才需要注释。 在此示例中&#xff0c;我将演示如何在不提供任何元数据的情况下使…

MATLAB均值和标准差

mean(); %均值std(); %标准差

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;以区别不同的…

MATLAB判断奇偶数

if mod(n,2)%偶数else%奇数

从percona server 5.7换到mariadb 10.2

过去两年半一直推荐使用percona server&#xff0c;今天开始&#xff0c;因为一些mysql迟迟不不愿意支持的特性&#xff0c;打算换回mariadb 10.2了&#xff0c;具体哪些不说了&#xff0c;总之非常关键&#xff0c;mariadb都支持一两年了&#xff0c;oracle公司因为oracle的原…

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…