Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java
流行的Java代碼樣式中最有趣的亮點是什么?
盡管上面有暗示性的形象,我們也不想發動任何不必要的圣戰。 當歸結為編碼樣式時,大多數選擇都是相當隨意的,并取決于個人喜好。 是的,即使在編輯器之間制表符寬度改變了,空格也趨于更精確。
如果有開發團隊人類學之類的東西,風格指南可能是其中的主要部分。
在這篇文章中,我們將重點介紹Google,Twitter,Mozilla,Java標準以及我們自己在Takipi團隊中的公司的格式設置準則和不同的Java編碼樣式。
為什么首先使用準則?
可讀性是這里的主要考慮因素。 幾乎可以肯定,您將不是唯一閱讀所編寫代碼的人。 對于下一個閱讀您的代碼的人,您可以做的最好的事情就是遵守約定。
一致的寫作風格不僅有助于創建美觀的代碼,而且使其更易于理解。 Twitter指南指定了一個例外,我們傾向于同意:“如果更具可讀性的變種帶有危險或陷阱,則可能會犧牲可讀性”。
完整的樣式指南可在此處獲得:
讓我們看看他們的庫存。
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%之間。
(以防您好奇,在塔基皮我們更喜歡制表符。我們不是野蠻人。 去理查德·亨德里克斯! )
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%使用換行符:
塊語句樣式–分析流行的代碼約定(來源: 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
總結
以上是生活随笔為你收集整理的Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dao层通用封装_DAO层–救援通用
- 下一篇: 使用tinylog 1.1改进您在Jav