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 (休眠,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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370338.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flash php socket通信_php socket通信機制實例說明

php socket通信機制實例說明與代碼----什么是socket 所謂socket一般也稱作"套接字"&#xff0c;用于描述ip地址和端口&#xff0c;是一個通訊鏈的句柄。使用程序一般經過"套接字"向network發出請求也許應對network請求。說白了就是一種通訊機制。它類似于銀…

python的ogr模塊_python GDAL/OGR模塊安裝注意事項

軟件準備&#xff1a;首先&#xff0c;確保電腦里已安裝python2.7(2.x版本的比較好用&#xff0c;因為還使用ArcGIS)&#xff0c;然后從http://www.gisinternals.com網站上下載這兩個文件GDAL-2.1.3.win32-py2.7.msi和gdal-201-1500-core.msi。軟件安裝&#xff1a;首先安裝gda…

課時55.詳情和概要標簽(理解)

1.什么是詳情和概要標簽&#xff1f; 作用&#xff1a;利用summary標簽來描述概要信息&#xff0c;利用details標簽來描述詳情信息 默認情況下是折疊展示&#xff0c;想看見詳情必須點擊 格式&#xff1a; <details> <summary>概要信息</summary> 詳情信…

Spring Security可以做的十件事

一 您可以在Spring XML配置文件中指定您選擇的授權提供者。 您可以通過配置Spring的http://www.springframework.org/schema/security/spring-security-3.1.xsd模式中定義的authentication-manager來實現。 簡化的authentication-manager元素定義看起來像這樣&#xff1a; &l…

python編寫自定義函數判斷n1-n2范圍內的素數_【每日道代碼題001】- PYTHON基礎復習...

問題001-1&#xff1a;請對輸入三個整數a,b,c,判斷能否以它們為三個邊長構成三角形。若能&#xff0c;輸出YES和面積&#xff0c;否則輸出NOa float(input())b float(input())c float(input())if a > 0 and b > 0 and c > 0: #判斷邊長是否為正if (a b > c) an…

php繪制一個三角形,如何利用css或html5畫出一個三角形?兩種不同的制作三角形方法(代碼實例)...

我們在平時的前端開發的時候&#xff0c;有時候是需要一些小圖形來豐富一下頁面效果&#xff0c;比如&#xff1a;下拉列表的倒三角圖形。那么這樣的一個三角形是如何制作出來的&#xff0c;本章給大家介紹如何利用css或html畫出一個三角形&#xff1f;兩種不同的制作三角形方法…

課時53.video標簽(掌握)

這節課來學習一下html5中新增的標簽&#xff0c;我們先來看一下&#xff0c;html5中新增了哪些標簽&#xff1f; 打開W3school的網頁&#xff0c;點擊參考手冊中的HTML/HTML5標簽&#xff0c;有一個按字母順序排列的標簽&#xff0c;但凡標簽后面帶有5標記的&#xff0c;都是h…

Date函數基礎知識整理

Date類型&#xff1a;1.Date.parse()接收一個表示日期的字符串參數&#xff0c;然后再根據這個字符串返回響應的日期的毫秒數&#xff1b;如&#xff1a;創建一個日期&#xff1a; 1 <script> 2 // var someDatenew Date(May 25,2004); 3 // console.log(someDate);//Tue…

Google Guava –與Monitor同步

Google Guava項目是每個Java開發人員都應該熟悉的庫的集合。 Guava庫涵蓋I / O&#xff0c;集合&#xff0c;字符串操作和并發性。 在這篇文章中&#xff0c;我將介紹Monitor類。 Monitor是一種同步構造&#xff0c;可以在使用ReentrantLock的任何地方使用。 在任何時候&#x…

yaf 重寫index.php,php框架Yaf路由重寫實例代碼

通常為了友好的URL格式&#xff0c;會進行站點URL的重寫&#xff0c;可以在webserver(Nginx)的配置中進行rewrite&#xff0c;也可在在程序端進行&#xff0c;本文主要和大家介紹php框架Yaf路由重寫&#xff0c;給大家做個參考&#xff0c;希望能幫助到大家。以下使用Yaf框架進…

python類初始化導入庫_Python中optparser庫用法實例詳解

本文研究的主要是Python中optparser庫的相關內容&#xff0c;具體如下。一直以來對optparser不是特別的理解&#xff0c;今天就狠下心&#xff0c;靜下心研究了一下這個庫。當然了&#xff0c;不敢說理解的很到位&#xff0c;但是足以應付正常的使用了。廢話不多說&#xff0c;…

SQL--Chapter8--Working with Triggers and Transactions

Objectives:1.Implement triggers 2.Implement transactions 轉載于:https://www.cnblogs.com/Catherinezhilin/p/7979644.html

Canvas制作的下雨動畫

簡介 在codepen上看到一個Canvas做的下雨效果動畫&#xff0c;感覺蠻有意思的。就研究了下&#xff0c;這里來分享下&#xff0c;實現技巧。效果可以見下面的鏈接。 霓虹雨: http://codepen.io/natewiley/full/NNgqVJ/ 效果截圖&#xff1a; Canvas動畫基礎 大家都知道&…

在Eclipse中有效使用JUnit

最近&#xff0c;我被卷入了討論1和一些受感染的同伴2&#xff0c;他們關于我們如何在Eclipse IDE中使用JUnit 。 令人驚訝的是&#xff0c;對話帶來了并非所有人都知道的一些“技巧”。 這使我有了寫這篇文章的想法&#xff0c;總結了我們的演講。 誰知道–也許有人也有新事物…

jquery文件上傳控件 Uploadify

基于jquery的文件上傳控件&#xff0c;支持ajax無刷新上傳&#xff0c;多個文件同時上傳&#xff0c;上傳進行進度顯示&#xff0c;刪除已上傳文件。 要求使用jquery1.4或以上版本&#xff0c;flash player 9.0.24以上。 有兩個版本&#xff0c;一個用flash,一個是html5。html5…

imagick php 縮放,php使用imagick模塊實現圖片縮放、裁剪、壓縮示例

PHP 使用Imagick模塊 縮放&#xff0c;裁剪&#xff0c;壓縮圖片 包括gif圖片縮放 裁剪代碼如下:/*** 圖片裁剪* 裁剪規則&#xff1a;* 1. 高度為空或為零 按寬度縮放 高度自適應* 2. 寬度為空或為零 按高度縮放 寬度自適應* 3. 寬度&#xff0c;高度到不為空或為…

php實現第三方郵箱登錄_PHP實現用戶異地登錄提醒功能的方法

有時候你的網站賬號被盜或你在別處登錄操作后臺時&#xff0c;右下角會彈出提示信息&#xff0c;提醒你的賬號異地登錄&#xff0c;或者會被強制下線。對于這種安全性要求比較高的web網站&#xff0c;很多后臺管理都會做這種功能提醒。甄別自己的賬號是否被盜或者是否有另一個人…

課時47.datalist標簽(了解)

1.datalist標簽 作用&#xff1a;給輸入框綁定待選項 2.datalist格式&#xff1a; <datalist> <option>待選項內容</option> </datalist> 3.如何給輸入框綁定待選列表&#xff1f; 搞一個輸入框搞一個datalist列表給datalist列表標簽添加一個id給…

pandas.read_csv參數詳解

讀取CSV&#xff08;逗號分割&#xff09;文件到DataFrame也支持文件的部分導入和選擇迭代更多幫助參見&#xff1a;http://pandas.pydata.org/pandas-docs/stable/io.html參數&#xff1a;filepath_or_buffer : str&#xff0c;pathlib。str, pathlib.Path, py._path.local.Lo…

Gradle – Maven的觀點

正如我博客的讀者所知道的&#xff0c; 我有點像Maven迷 。 我從2007年8月左右開始使用Maven&#xff0c;從沒有回過頭。 但是&#xff0c;就像其他所有情況一樣&#xff0c;“變化是唯一不變的”。 現在這個領域還有其他參與者&#xff0c;Gradle看起來是最有前途的。 我決定試…