【问题标题】:Objective C : Clean code Ternary operator creating NSDictionary [closed]目标C:创建NSDictionary的清洁代码三元运算符[关闭]
【发布时间】: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;

【问题讨论】:

  • 对于这种情况,我更喜欢使用 set​Value:​for​Key:​ 而不是三进制。恕我直言,它是零安全且更清洁的。参考: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


【解决方案1】:

重点是:我对三元运算符很满意,因为代码可读性强且优雅。我认为一个基本条件和简单的赋值很容易理解和清理。

因此,考虑到在这种情况下我决定使用三元组,我会选择 C) 选项。我认为创建一个空块会在可读性方面产生相反的感觉。

如果需要更复杂的条件,我仍然会继续使用 C),但在布尔参数中定义外部条件以使其更清晰。比如:

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

【讨论】:

  • 决不能使用选项 C 和 D。您永远不会使用三元运算符的结果,而是依赖于评估每个表达式的副作用。非常糟糕的做法。
【解决方案2】:

从清洁的角度来看,我会说 A 是最清洁和最易读的解决方案。但是,在风格上,我更喜欢使用三元运算符而不是经典的 if-else 结构。因此,我会选择 C。

尽管如此,我不喜欢在 else 子句中对nil 进行如此多的硬编码。在这种情况下,我会选择 C' 解决方案:

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

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2012-10-18
    • 2018-11-08
    • 2020-12-31
    相关资源
    最近更新 更多