2017-03-17 23 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;