2016-04-14 94 views
1

一個新的代碼審查過程已經到位,現在我的團隊不能將一個字符串聲明爲局部變量,否則提交將不會通過代碼審查。我們現在要改用常量。這種方法有什麼問題?

因此,這是絕對不允許的,即使我們死了肯定的字符串將永遠不會在其他任何地方使用

String operationId = "create"; 

這是應該使用:

private static final String OPERATION_ID = "create"; 

雖然我完全同意在代碼中出現+2次的字符串使用常量,但我發現它完全不具備在僅使用一次的情況下聲明字符串的能力。

只是爲了確保它的清晰,這一切都是任何情況下都允許以下:

  • String div = "div1";
  • Catch(Exception ex){ LOGGER.log("csv file is corrupt") }
  • 字符串連接String str = "something ...." + someVar + "something" ...我們是來取代someVar%s,將整個事物聲明爲全局字符串,然後使用String.format(....)

  • if(name.equals("Audi"){....}

  • String value = map.get("key")

任何想法的傢伙?我想要一些有力的論據。我準備好接受任何有良好論點支持的立場。

謝謝。

+0

也許更多的代碼審查問題? – 3kings

+0

你還允許與'List '交互嗎?即'String elm0 = lst.get(0)'? – Mshnik

+1

@Mshnik \t我不明白這是怎麼回事。那裏沒有直接的字符串。 –

回答

0

首先,讓我們拋出你的假設:沒有什麼本質上錯誤與所述的方法。

這不是關於在多個地方使用字符串,而是關於常量易於查找和記錄,並且您的代碼是一致的

private static final String OPERATION_ID = "create"; 

真的,這是不使用任何地方其他?如果我將其更改爲字符串「beetlejuice」,什麼都不會中斷?如果有什麼東西會被破壞,那麼其他東西就會使用這個常量......如果「其他東西」碰巧是不同語言的代碼庫,那就是爲什麼它們不共享字符串常量 - 這是例外,而不是規則。一致性!


這就是說,有幾件事我會在一個稍微不同的方式標準化,但我還是總歸它們標準化:

我會建議讓字符串字面量在枚舉的構造函數:

public enum Operation { 
    CREATE("create"), 
    ... 
} 

因爲在這裏,枚舉是在代碼中引用的常量,而不是字符串文字。將常量聲明爲枚舉或作爲private static final String等同於我,並且沒有必要同時執行這兩個操作。

此外,我不會在任何地方使用這種模式,它會破壞IDE的能力來警告您缺少字符串 - 例如,從.properties文件查找字符串。當你在一個不存在的.properties文件中查找關鍵字時,許多IDE會給你適當的警告,但是額外的間接級別可能會破壞這個關係,這取決於你的IDE有多聰明。

Catch(Exception ex){ LOGGER.log("csv file is corrupt") } 

這對我來說是一個灰色區域 - 這是一個內部唯一的消息嗎?這些日誌是否僅由您,開發人員見過,還是爲了用戶的利益?

如果它只適用於應用程序的開發人員這些可能不需要本地化。

如果您希望用戶查看日誌,那麼它們應該外部化爲.properties文件。

0

當值/文字多次使用時,爲值/文字定義常量是一種很好的編碼風格。

強加的編碼風格強制您使用的每個字符串常量的常量。

不錯該編碼風格的影響是:所有真正應該聲明爲常量的字符串現在被聲明爲常量。

蘊涵的是編碼風格是:你 - 開發商 - 不能決定是否一個字符串文字應被定義爲恆定。這是一個沉重的打擊。

因此,您應該提出您的擔憂,即編碼風格的好意並不能彌補開發人員資格標準中的不信任。

相關問題