2017-03-17 49 views
2

我想知道關於在我的開發過程中多次出現的情況的一般意見。 問題本身即將知道哪一個是最乾淨的代碼。目標C:清潔代碼三元操作符創建NSDictionary

很多時候我不得不向服務器發送一個請求,我需要發送一個帶有不同鍵/值的NSDictionary。事情是,只要值存在發送參數,其他情況下不發送它。

因此,典型的解決方案可以使用if聲明:

A)

NSMutableDictionary *parameters = [NSMutableDictionary alloc] init]; 
if (param1) { 
    parameters[key1] = param1; 
} 
if (param2) { 
    parameters[key2] = param2; 
} 
..... 

或者替代

B)

NSMutableDictionary *parameters = [NSMutableDictionary alloc] init]; 
if (param1) parameters[key1] = param1; 
if (param2) parameters[key2] = param2; 
..... 

但在另一方面,你可以使用一個三元操作?(我喜歡這個解決方案),所以:

C)

NSMutableDictionary *parameters = [NSMutableDictionary alloc] init]; 
param1 ? parameters[key1] = param1 : nil; 
param2 ? parameters[key2] = param2 : nil; 
..... 

而且還和替代

d)

NSMutableDictionary *parameters = [NSMutableDictionary alloc] init]; 
param1 ? parameters[key1] = param1 : ^{}(); 
param2 ? parameters[key2] = param2 : ^{}(); 
..... 

你更喜歡哪一個?或者如果你有更好的主意,請讓我知道

謝謝!

UPDATE

,在我所顯示的示例中,條件相當simples,只是param1!=nil但通常我有不同的條件。例如,如果參數是一個NSUInteger,並且我只是在它不同於NSNotFound時發送它。 所以它可能是這樣的:

NSMutableDictionary *parameters = [NSMutableDictionary alloc] init]; 
param1!=NSNotFound ? parameters[key1] = @(param1) : nil; 
param2!=NSNotFound ? parameters[key2] = @(param2) : nil; 
+0

對於這種情況,我更喜歡使用設置值:對於鍵:而不是三元。這是無安全和更清潔的恕我直言。 ref:https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc –

+0

那麼,在這個例子中可以適合。但總是沒用。如果實例的參數是一個'NSUInteger',並且我們只是發送參數,如果它不同於'NSNotFound'或'-1'或類似...,那麼選項'setValue:forKey'因爲一個@( -1)'是一個對象,'@(NSNotFound)'也是。 您的建議將需要以前的轉換才能在具體情況下反對。 – fjtrujy

+0

最後,使用'setValue:forKey',你不能有一個複雜的條件,如果你的條件是'object!= nil',你就可以使用它。 – fjtrujy

回答

1

的一點是:我很高興與三元操作儘可能的代碼是可讀的,優雅的。我認爲基本條件和簡單的任務很容易理解和清潔。

所以,鑑於我決定在這種情況下使用三元組,我會繼續選擇C)。我認爲創建一個空白塊可以在可讀性方面產生相反的感覺。

如果需要更復雜的條件,我仍然繼續C),但在布爾參數外定義條件以使其更清潔。例如:

BOOL isValid = param1 != nil && (param1 > 2 || param1 < -1); 
isValid ? parameters[key1] = param1 : nil; 
+0

選項C和D不應該被使用。你從不使用三元運算符的結果,並且依賴評估每個表達式的副作用。非常不好的做法。 – rmaddy

0

從清潔的角度來看,我會說A是最乾淨和最可讀的解決方案。然而,就風格而言,我更喜歡使用三元運算符而不是經典的if-else結構。因此,我會選擇C.

儘管如此,我不喜歡在else子句中使用太多的硬編碼nil。在這種情況下,我會選擇C'解決方案:

NSMutableDictionary *parameters = [NSMutableDictionary alloc] init]; 
!param1 ? : parameters[key1] = param1; 
!param2 ? : parameters[key2] = param2;