簡體   English   中英

我應該避免在Java中的if語句中使用“!”嗎?

[英]Should I avoid using “!” in if statement in Java?

我們團隊的Java編碼指南說:

避免使用“!” 在if語句中盡可能多。

我問其他同事,但沒有人給我清楚的想法,因為該指南是很久以前創建的,作者可能已離開我們公司。

你有什么主意嗎?

根據提供的信息,這需要一些推測。 一個可能的原因是,意圖本身不是if語句,而是if-else語句。 在這種情況下,我可以看到你可能會說你應該反轉案件,以便你沒有額外的否定操作。 代替

if (! boolVar) {
  // Something
} else {
  // Something else
}

你可能更喜歡

if (boolVar) {
  // Something else
} else {
  // Something
}

這是否值得,可能更多的是品味和標准化問題。

該規則很可能是羅伯特·馬丁的清潔法典第302頁的改編:

負面消息比正面消息更難理解。 因此,在可能的情況下,條件應表示為正數。 例如:

 if(buffer.shouldCompact()) 

比較好

 if(!buffer.shouldNotCompact()) 

例如,假設您正在創建一個驗證程序,該驗證程序需要兩個錯誤才能使實體有效:

  • 該實體不得在過去12小時內創建,並且
  • 該實體的銀行賬戶總金額不得超過50,000美元。

當然,我們的想法是為此編寫兩種方法:

boolean isCreatedWithinLastTwelveHours(BankAccount account)
boolean hasMoreThanTotalSumCap(BankAccount account)

...然后,您將其調用為:

boolean newAccount = isCreatedWithinTheLastTwelveHours(account);
boolean highEndAccount = hasMoreThanTotalSumCap(account);

if(!newAccount && !highEndAccount) { // ... other logic

// The more astute would use DeMorgan's law in an effort to make this more readable

if(!(newAccount || highEndAccount)) { // other logic

嗯......那豈不是更好,如果你只是說他們不是代替呢?

boolean isNotCreatedWithinLastTwelveHours(BankAccount account)
boolean hasLessThanTotalSumCap(BankAccount account)

這使得表達更加簡潔:

if(notNewAccount && notHighEndAccount) { // .. carry on!

當然 ”!” 可以在你喜歡的時候使用。 java中沒有“除非”,在某些情況下你沒有其他選擇。

看起來還是另一個無用的規則。 一般來說,在這種情況下沒有絕對術語,如果你在if-else子句中,那么可能最好寫一下

if(myCondition) {
    doThis()
} else {
    doSomethingElse()
}

代替

if(!myCondition) {
   doSomethingElse()
} else {
   doThis()
}

但是,在某些情況下,實際上使用否定運算符是非常好的,特別是如果沒有提供else子句,例如

if (!tokenDoesCompute()) {
   throw InvalidTockenException("Whatever")
}

實際上在這種情況下,使用“!” 對我來說有點意義。

最后,如果沒有人可以真正解釋為什么規則存在,也許是時候刪除它,我能找到它的唯一好處是提供有關代碼風格的一致性。

好的,我回答了我自己的問題。 正如其他人所說,也許這是為了可讀性而寫的。

“可讀代碼的藝術” (第72頁)中說:

首先處理正面情況而不是負面情況 - 例如if(debug)而不是if(!debug)

我發現下面的帖子:

  • 可讀代碼 - 刪除檢查null

     bool func(String name) { if ( (name != null) && (name.equals("true") ) { //... } else { //... } } 

     bool func(String name) { if ( "true".equals(name) ) { //... } else { //... } } 

當然你可以使用否定運算符! 隨時隨地。

但是,如果您遇到必須在ifelse塊中編寫某些操作的情況,則以下內容更具可讀性:

if(status){
//do something
}
else{
//do something else
}

if(!status){
//do something
}
else{
//do something else
}

但是如果你有這樣的情況你只需要根據一個條件執行某些操作,即如果你只有一個if塊而沒有else塊,那么使用起來相當合理! if

我沒有看到其他人提出過這個問題,這可能是因為他們和我一樣討厭它,但我是為了完整而展示它。

// Using not operator (preferred)
if (! someTest) { ... }

// Using compact not operator (kind of hides it)
if (!someTest) { ... }

// Comparing to false (ok, explicitly states what you want)
if (someTest == false) { ... }

// Comparing to true (a bit obscure)
if (someTest != true) { ... }

他們都這樣做,但請繼續使用! ,請確保在其后添加空格,以便更容易看到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM