2008-11-25 100 views
4

請賜教:Java:代碼重構/優化

您更喜歡哪一個?爲什麼? [可讀性?記憶關注?其他一些問題?]

String strSomething1 = someObject.getSomeProperties1(); 
strSomething1 = doSomeValidation(strSomething1); 
String strSomething2 = someObject.getSomeProperties2(); 
strSomething2 = doSomeValidation(strSomething2); 
String strSomeResult = strSomething1 + strSomething2; 
someObject.setSomeProperties(strSomeResult); 

2.

someObject.setSomeProperties(doSomeValidation(someObject.getSomeProperties1()) + 
          doSomeValidation(someObject.getSomeProperties2())); 

如果你會做一些其他的方式,那會是什麼呢?你爲什麼要那樣做?

回答

12

我可能會去在兩者之間:

String strSomething1 = doSomeValidation(someObject.getSomeProperties1()); 
String strSomething2 = doSomeValidation(someObject.getSomeProperties2()); 
someObject.setSomeProperties(strSomething1 + strSomething2); 

選項#2好像很多在一線做。它是可讀的,但需要一點努力來解析。在選項#1中,每條線的意圖都非常可讀並且清晰,但是當我仔細閱讀時,詳細程度會降低我的速度。我會盡量平衡簡潔和清晰度,每行代表一個簡單的「句子」的代碼。

1

個人而言,我更喜歡第二個。它不那麼混亂,我不必跟蹤這些臨時變量。但是,使用更復雜的表達式可能會輕易改變。

17

我會去用:

String strSomething1 = someObject.getSomeProperties1(); 
String strSomething2 = someObject.getSomeProperties2(); 

// clean-up spaces 
strSomething1 = removeTrailingSpaces(strSomething1); 
strSomething2 = removeTrailingSpaces(strSomething2); 

someObject.setSomeProperties(strSomething1 + strSomething2); 

我個人的偏好是用行動來組織,而不是序列。我認爲它會更好。

4

選項2爲可讀性。如果方法只做他們的名字所表示的內容,我不會在這裏看到任何內存問題。雖然我會因連接而異。由於Java字符串的不變性,性能肯定會隨着字符串連續數的增加而增加。

只是想知道,你真的寫自己的removeTrailingSpaces()方法,或者它只是一個例子嗎?

+0

當然是一個例子..我刪除它,因爲你可能會想爲什麼我的版本.. :) – DragonBorn 2008-11-25 15:29:08

6

我更喜歡第二個。您可以使其具有一點格式化的可讀性,而無需聲明額外的中間引用。

someObject.setSomeProperties(
    doSomeValidation(someObject.getSomeProperties1()) + 
    doSomeValidation(someObject.getSomeProperties2())); 

您的方法名稱提供了所有需要的解釋。

2

對我來說,它取決於上下文和周圍的代碼。

[編輯:沒有任何意義,對不起] 如果是像「setSomeObjectProperties()」方法,我寧願變2,但也許會創造一個私有方法「的getProperty(字符串名稱)」,這刪除尾隨空格,如果去掉空格是不是一個重要的操作 [/編輯]

如果驗證屬性是你方法的一個重要步驟,那麼我會調用該方法「setValidatedProperties()」,並希望您的第一個建議的變體:

validatedProp1 = doValidation(someObject.getSomeProperty1()); 
validatedProp2 = doValidation(someObject.getSomeProperty2()); 
someObject.setSomeProperties(validatedProp1, validatedProp2); 

如果驗證不是該方法的重要部分(例如,我試圖把驗證步驟放在「getSomePropertyX()」

1

我喜歡格雷格和比爾版本,我想我會更自然地編寫像格雷格的代碼一。中間變量的一個優點是:更容易調試(在一般情況下)。

3

我嘗試每行有一個操作。主要原因是這樣的:

setX(getX().getY()+getA().getB()) 

如果你在這裏有NPE,哪個方法返回null?所以我喜歡在代碼落入調試器的強大手臂之後看到某些變量的中間結果,而不必重新啓動!