Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java
流行的Java代碼樣式中最有趣的亮點(diǎn)是什么?
盡管上面有暗示性的形象,我們也不想發(fā)動(dòng)任何不必要的圣戰(zhàn)。 當(dāng)歸結(jié)為編碼樣式時(shí),大多數(shù)選擇都是相當(dāng)隨意的,并取決于個(gè)人喜好。 是的,即使在編輯器之間制表符寬度改變了,空格也趨于更精確。
如果有開(kāi)發(fā)團(tuán)隊(duì)人類(lèi)學(xué)之類(lèi)的東西,風(fēng)格指南可能是其中的主要部分。
在這篇文章中,我們將重點(diǎn)介紹Google,Twitter,Mozilla,Java標(biāo)準(zhǔn)以及我們自己在Takipi團(tuán)隊(duì)中的公司的格式設(shè)置準(zhǔn)則和不同的Java編碼樣式。
為什么首先使用準(zhǔn)則?
可讀性是這里的主要考慮因素。 幾乎可以肯定,您將不是唯一閱讀所編寫(xiě)代碼的人。 對(duì)于下一個(gè)閱讀您的代碼的人,您可以做的最好的事情就是遵守約定。
一致的寫(xiě)作風(fēng)格不僅有助于創(chuàng)建美觀的代碼,而且使其更易于理解。 Twitter指南指定了一個(gè)例外,我們傾向于同意:“如果更具可讀性的變種帶有危險(xiǎn)或陷阱,則可能會(huì)犧牲可讀性”。
完整的樣式指南可在此處獲得:
讓我們看看他們的庫(kù)存。
1.縮進(jìn):制表符與空格
首先,我們需要先解決這個(gè)問(wèn)題,然后再繼續(xù)。 樣式指南中的選項(xiàng)卡上顯然有空格優(yōu)先。 我們不會(huì)在這里討論利弊,而只是分享發(fā)現(xiàn):
Google: 2個(gè)空格(android是4個(gè)空格,換行是8個(gè)空格)
Twitter: 2或4個(gè)空格(用于換行)
Mozilla: 4個(gè)空格 Java: 4個(gè)空格,制表符必須設(shè)置為8個(gè)空格。 兩者都是可以接受的。
也許使用制表符的開(kāi)發(fā)人員不喜歡編寫(xiě)樣式指南��。
來(lái)自Github的數(shù)據(jù)表明,大約10-33%的Java存儲(chǔ)庫(kù)更喜歡使用制表符,并且大多數(shù)使用不同形式的空格,而不是2優(yōu)先使用4個(gè)空格。實(shí)際上有一個(gè)相當(dāng)不錯(cuò)的模塊可以運(yùn)行此分析(比較不同的語(yǔ)言)。 順便說(shuō)一句,窺視Scala和Clojure等其他JVM語(yǔ)言,我們看到幾乎100%2的空間。
考慮到覆蓋個(gè)人提交的更大數(shù)據(jù)集給我們帶來(lái)了不同的結(jié)果( Convention Analysis項(xiàng)目 , Github數(shù)據(jù)挑戰(zhàn)賽的獲勝者之一 ),但是我們可以估計(jì)它大約在10%之間。
(以防您好奇,在塔基皮我們更喜歡制表符。我們不是野蠻人。 去理查德·亨德里克斯! )
Java Tabs vs Spaces –分析流行的代碼約定(來(lái)源: outsideris / popularconvention )
2.線長(zhǎng),繞線和斷點(diǎn)
有時(shí),Java代碼的行數(shù)往往會(huì)很長(zhǎng),并且樣式指南在何時(shí)中斷或換行時(shí)設(shè)置了約定。 一般約定最大長(zhǎng)度約為80-100
Google: 100列
Twitter:傾向于100列
Mozilla:適當(dāng)?shù)呐袛?Java: 80列
當(dāng)然,除了分號(hào)后的自然中斷外,不僅在行過(guò)長(zhǎng)時(shí)使用換行符,而且還用于邏輯分離。 一般約定是在逗號(hào)前,運(yùn)算符前打斷,并使用一些常識(shí)。
這是twitter風(fēng)格指南中的一個(gè)示例,充分利用了這一概念:
// 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() + "'");這有助于分離語(yǔ)句并創(chuàng)建邏輯,其中每一行代碼代表一個(gè)包含的“原子”操作。 樣式指南傾向于在這里達(dá)成共識(shí)。
空行在混合中也起著重要作用,分隔邏輯塊。 Java標(biāo)準(zhǔn)樣式指南還參考了雙換行符,將接口和實(shí)現(xiàn)分開(kāi)。
3.變量命名
所有樣式指南均達(dá)成廣泛共識(shí)。 FirstLetterUpperCase用于類(lèi)名camelCase用于方法和變量名,所有小寫(xiě)程序包名稱,以及ALL_CAPS用于最終靜態(tài)常量。 記錄器是一個(gè)常見(jiàn)的例外,我們通常將其定義為:
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.異常捕獲條款
例外是一個(gè)棘手的問(wèn)題。 最近,我們進(jìn)行了一項(xiàng)研究, 研究了Github和Sourceforge上的600,000個(gè)項(xiàng)目,并發(fā)現(xiàn)了有關(guān)非標(biāo)準(zhǔn)使用例外的嚴(yán)峻事實(shí)。 Google和Twitter的樣式指南引用了臭名昭著的空白catch塊:
Google:沒(méi)有空的捕獲塊
Twitter:換句話說(shuō),不要吞下異常
Mozilla:無(wú)參考 Java:無(wú)參考
此外,我們建議至少嘗試保留的另一項(xiàng)準(zhǔn)則是確保異常是可操作的 ,并避免控制流異常。 在生產(chǎn)環(huán)境中引起的所謂“正常”異常的噪聲數(shù)量令人恐懼。
Takipi的主要?jiǎng)訖C(jī)是,異常和錯(cuò)誤處理的當(dāng)前狀態(tài)(主要依靠日志文件來(lái)確定其在生產(chǎn)中的根本原因)。 如果您還沒(méi)有,請(qǐng)檢查一下! 我們很想聽(tīng)聽(tīng)您的想法。
5.括號(hào)清楚,花括號(hào)
即使沒(méi)有必要,括號(hào)也可以幫助提高可讀性。 對(duì)于復(fù)合謂詞,即使執(zhí)行順序很明顯,也通常使用括號(hào)來(lái)保持清晰。 例如:
if (x == y && a > 10) // bad if ((x == y) && (a > 10)) // good那么樣式指南對(duì)分組括號(hào)有何看法?
Google: “推薦”
Twitter: “明確”(即使很明顯)
Java: “通常是個(gè)好主意” Mozilla:遵循Java標(biāo)準(zhǔn)
處理花括號(hào)時(shí),所有樣式指南都檢查了在打開(kāi)花括號(hào)后支撐是否斷裂。 在Takipi,我們實(shí)際上做了相反的事情,但我們并不孤單,盡管大多數(shù)Java開(kāi)發(fā)人員都使用“行內(nèi)”花括號(hào),但此處檢查的代碼提交中有37%使用換行符:
塊語(yǔ)句樣式–分析流行的代碼約定(來(lái)源: outsideris / popularconvention )
6.建設(shè)者內(nèi)無(wú)腦
我們保留但沒(méi)有在任何樣式指南中找到的一個(gè)準(zhǔn)則是,不要在構(gòu)造函數(shù)中保留任何“大腦”(因此,它們對(duì)于僵尸是安全的,但顯然不會(huì)因薄弱的笑話而被拒絕)。
如果我們需要?jiǎng)?chuàng)建一個(gè)對(duì)象并進(jìn)行一些繁重的操作來(lái)構(gòu)建它,則可以使用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; }最后的想法
為了避免使本指南成為詳盡無(wú)遺的清單,我們?cè)诒疚闹袥](méi)有涉及更多樣式指南,這些指南都可以在本文開(kāi)頭鏈接的原始文檔中找到。 可讀性是保持代碼無(wú)錯(cuò)誤的主要因素,并且…防止這些OCD感覺(jué)發(fā)麻是正確的。
您要遵循哪些獨(dú)特的準(zhǔn)則/怪癖? 您的公司/團(tuán)隊(duì)是否使用自己的風(fēng)格指南? 請(qǐng)隨時(shí)在下面的評(píng)論部分中分享這些內(nèi)容!
翻譯自: https://www.javacodegeeks.com/2016/07/tabs-vs-spaces-write-java-google-twitter-mozilla-pied-piper.html
總結(jié)
以上是生活随笔為你收集整理的Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dao层通用封装_DAO层–救援通用
- 下一篇: 迟到20年的中国格斗机器人综艺,能否成为