簡體   English   中英

字符串= string.trim(); 不好的做法?

[英]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.

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