2013-10-04 125 views
1

在方法參數中構造具有嵌入表達式的代碼通常被認爲是不好的做法嗎?應該聲明變量嗎?嵌入方法參數表達式是不好的做法嗎?

(爲例Android的代碼片段)

((EditText)view.findViewById(R.id.fooEditText)) 
    .setText(
    someExpression 
     ? getResources().getString(R.string.true_expression_text) 
     : getResources().getString(R.string.false_expression_text) 
); 

我個人認爲它看起來不錯,但如果這被認爲是擊退:)

回答

2

我幾乎肯定會簡化,在只是想知道許多方式:

EditText editText = (EditText) view.findViewById(R.id.fooEditText); 
String resourceName = someExpression ? R.string.true_expression_text 
            : R.string.false_expression_text; 
editText.setText(getResources().getString(resourceName)); 

做這一切在一個聲明使得它更難閱讀更難d Ebug,IMO。請注意,我也刪除了重複,但使用的是事實,即您在條件運算符的兩個操作數中調用了getResources().getString(...),只是使用不同的資源名稱。

我的主要牛肉與原來的代碼是調用鑄造結果的方法 - 除了其他任何東西,它引入了比你需要更多的括號,這通常是令人困惑的。

1

我想說這取決於情況,例如。

player.setName(User.getName()); 

會好一些,但是,訓練如下衝倒這樣......

player.setName(getGroup().getUsers().get(0).getName()); 

我想說的是不好的做法,並在Clean Code by Bob Martin關於火車殘骸的危險被提及。還有@Jon Skeet提到的重複調用是使用變量而不是方法調用的另一個原因。

+0

我甚至不會打電話給後面的代碼火車殘骸。它仍然比問題中的代碼顯着簡單。 –

+0

我確實認爲它比OP提到的代碼簡單得多(特別是由於三元運算符),我只是把它作爲一個簡單的例子。 – david99world

+0

我想我可能只需要購買那本書。 – elimirks

0

「repulsing」這個詞是你的,但它肯定描述了我的反應。我無法專注於這個陳述是做什麼的,因爲它有一個if語句,一個搜索,並且至少有5個解除引用在它開始之前發生。

我發現trinary操作符特別有害,因爲在我解析其他所有內容時,我必須在腦海中持有兩個不相交的狀態集。有些人喜歡簡潔的本地變量(我不是其中之一),但嵌入在其他語句中的三元運算符(或任何其他分支)是特別不可愛的。如果您因爲喜歡複雜的陳述而忽略了Clean Code或類似工作的其餘部分,至少要將條件分開。

相關問題