[英]string = string.trim(); bad practice?
好的,我正在使用Sonar來檢查代碼質量。 它告訴我這個簡單的方法導致兩個嚴重警告。
public static String formatString(String string) {
if(string==null) {
return null;
}
string = string.trim();
string = string.toUpperCase();
return string;
}
由於可以直接訪問參數,因此我可以理解警告。 如您所見,這種方法幾乎沒有什么用。 刪除空格並將其置於大寫形式。 但是問題是什么呢,因為最后它返回一個字符串。 考慮到創建字符串的開銷,創建一個值持有者字符串似乎超出了要求。
所以我的問題是我在做不好的編碼,如果是為什么?
我不認為您做錯了什么:盡管可以像這樣將整個代碼折疊成一行
return string == null ? null : string.trim().toUpperCase();
我知道有人更喜歡多行閱讀。 編譯器應該找出所有與兩個“不必要地”寫回string
相關的必要優化,所以我認為你很好。
好吧, 某些編碼人員可能會假設參數值不會更改。 我通常不會更改參數,但是在一種簡短的方法中,我很樂意這么做。 另一方面,我可能將其寫為:
public static String formatString(String text) {
return text == null ? null : text.trim().toUpperCase();
}
我也可能會更改方法的名稱,並將語言環境設置為toUpperCase
。
我個人認為您的代碼沒有什么錯。 我會這樣寫(在空檢查之后):
return string.trim().toUpperCase();
這樣可以避免修改參數,而這通常會使代碼更易於分析。 但是,在這樣瑣碎的例行程序中,我認為這並不是一個有效的問題。
假設您的示例像這樣編碼,則可以正常工作
public static void main(String[] args) {
String greeting = "Hello greetings ";
String greeting2 = formatString(greeting);
System.out.println("Hi ["+greeting +"]");
System.out.println("Hi ["+greeting2 +"]");
}
private static String formatString(String string) {
if(string==null) {
return null;
}
string = string.trim();
string = string.toUpperCase();
return string;
}
將會抱怨您正在直接修改參數,在Java中,這並不是一個真正的問題,因為最終的代碼最終會輸出
Hi [Hello greetings ]
Hi [HELLO GREETINGS]
但是,進入給定其他語言的不良習慣不會以這種方式表現,您可以修改原始變量,以便輸出為
Hi [HELLO GREETINGS]
Hi [HELLO GREETINGS]
它的可讀性也較低,我見過的大多數編碼標准都不會直接修改傳入的參數,除非您完全更改了基礎引用,並且從簽名中可以明顯看出這將發生。
我傾向於避免像瘟疫這樣的代碼(出於習慣),所以我會說是不好的做法,但從技術上來說並不是錯誤的。
為了完整起見,我會這樣寫formatString
private static String formatString(String string) {
String output = null;
if (string != null) {
output = string.trim().toUpperCase();
}
return output;
}
我接受我可以在此處使用三元測試( ?
運算符)並在一行上全部完成,但是我傾向於認為這對於更多的初中生來說可讀性較差,因此我再次避免了這一點,並且我認為這更具可讀性,但是當然...我的意見。
該警告是因為您更改了輸入變量。 在某些約定中(例如spartan編程),更改輸入值被認為是不好的做法。
一些約定如使用變量$
,如果它還包含返回值:
只是把String $ = string;
在代碼的第一行-在方法的其余部分使用$
而不是string
。
真正的“斯巴達方式”將是使用三進制運算符(cond ? val1 : val2)
檢查是否為空,然后一起返回string.trim().toUpperCase()
。
編輯:
盡管已聲明某些約定支持在返回值時使用變量$
,如@StephenC所述,但這是一種不好的做法,因為它[ $
]保留用於生成的源代碼,
樣式檢查器確實在抱怨您正在修改方法參數的值。 很多人會認為這是不好的風格。 由於人們不希望參數值被更改,因此很難閱讀代碼。 (這是一個循環參數,但它確實反映了許多人實際讀取/誤讀代碼的方式。)
一個更時尚的解決方案是:
public static String formatString(String string) {
if (string == null) {
return null;
}
String tmp = string.trim();
tmp = tmp.toUpperCase();
return tmp;
}
要么 ....
public static String formatString(String string) {
return (string == null) ? null :
string.trim().toUpperCase();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.