【发布时间】:2017-03-17 16:27:15
【问题描述】:
我想了解我在开发过程中多次遇到的情况的一般意见。 问题本身就是要知道哪一个是最干净的代码。
很多时候我必须向服务器发出请求,在那里我需要发送具有不同键/值的 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 : ^{}();
.....
你更喜欢哪一个?或者如果你有更好的想法,请告诉我
谢谢!!
更新
在我展示的示例中,条件非常简单,只是param1!=nil,但通常我有不同的条件。例如,如果参数是 NSUInteger,如果它与 NSNotFound 不同,我将发送它。
所以它可能是这样的:
NSMutableDictionary *parameters = [NSMutableDictionary alloc] init];
param1!=NSNotFound ? parameters[key1] = @(param1) : nil;
param2!=NSNotFound ? parameters[key2] = @(param2) : nil;
【问题讨论】:
-
对于这种情况,我更喜欢使用 setValue:forKey: 而不是三进制。恕我直言,它是零安全且更清洁的。参考:developer.apple.com/reference/foundation/nsmutabledictionary/…
-
嗯,在例子中可以适合。但并不总是有用。例如,如果参数是
NSUInteger,并且如果它与NSNotFound或-1或类似参数不同,我们只发送参数.... 选项setValue:forKey无效,因为@(-1)是一个对象还有@(NSNotFound)。您的建议将需要在具体情况下对对象进行先前的转换。 -
最后,
setValue:forKey不能有复杂的条件,如果你的条件是object!=nil就可以使用它 -
决不能使用选项 C 和 D。您永远不会使用三元运算符的结果,而是依赖于评估每个表达式的副作用。非常糟糕的做法。
-
我从来没有听说过软件有错误,或者至少因为从上面选择了错误的选项而无法读取。我听说过几次,那个软件没有进入生产级别,因为开发人员没完没了地讨论这些小事。你真的认为,这个问题的正确答案会让糟糕的资源变得更好吗?
标签: objective-c coding-style ternary-operator