【问题标题】:What is the alternative to excessive use of the dot operator in Obj-C?在 Obj-C 中过度使用点运算符的替代方法是什么?
【发布时间】:2009-05-14 22:36:45
【问题描述】:

看看你对这行代码的看法:

if ([pickerViewController.picker.bvc.currentResolve.name isEqualToString:message])
  ...

您认为这是过度使用点运算符吗?

如果没有,我可以保持原样。

但如果是这样,首选的选择是什么?

【问题讨论】:

    标签: objective-c design-patterns oop coding-style


    【解决方案1】:

    这更像是Law of Demeter 违规,而不是点运算符的问题。做到这一点的“更干净”的方法是为对象提供逻辑来解决这个问题,所以你可以做类似的事情

    if ([pickerViewController hasPickedName:message])
    

    【讨论】:

    • 我要支持这个。您不必是 LoD 的狂热和严格的用户或粉丝,也可以欣赏对它的严重滥用,也许会努力将这些东西编码掉。
    • 同意。您的顶级对象对太多低级对象的内部运作了解太多,这些低级对象可能暴露了应该是私有的属性。在相关的说明中,公共属性永远不应该有像“bvc”这样的名称(这听起来很像另一个视图控制器,暗示可能混淆了 MVC)。 Objective-C 的基础是阅读清晰,而不是写作简洁。缺乏强大的编译器检查使得严格一致的命名成为防止错误的最有力保障之一。
    【解决方案2】:

    我认为没有过度使用属性符号。如果一个对象有一个属性,就这样访问它;它向读者展示了程序员的意思。

    哦,先发制人“看起来像一个结构”旅;如果您无法从代码中的对象中分辨出结构,请重构您的代码。

    【讨论】:

      【解决方案3】:

      只要每次使用点运算符都确实获取一个属性(即,不是一个主要关注为返回值以外的目的工作的方法),那就没问题了。事实上,如果您查看 Wil Shipley 的博客,他实际上非常喜欢根据需要将尽可能多的函数调用链接到一行中(他不喜欢过度使用局部变量)。

      【讨论】:

        【解决方案4】:

        我发现调试这类事情总是比它的价值更麻烦,所以我倾向于为每个属性访问创建中间变量。或者,正如其他人建议的那样,重构它,使其在使用站点上看起来更简单(通过将智能放入方法中)。

        【讨论】:

          【解决方案5】:

          我同意Chuck 和评论者的观点。您的方法依赖于太多其他对象,但是将hasPickedName: 放在pickerViewController 上意味着pickerViewController 仍然必须以某种方式执行[picker.bvc.currentResolve.name isEqualToString:message]

          相反,您可以将hasPickedName: 放在bvc 上,并使用Interface Builder 将bvc 作为委托(可能输入id<NamePickerDelegate>)注入到您的顶级对象中。要真正符合 Demeter,请让 currentResolve 增长一个方法 nameMatches:,它可以快捷方式 [currentResolve.name isEqualToString:message]

          您应该仔细查看由问题引起的复杂性以及每个解决方案将引入的复杂性。如果您认为原始代码比替代代码更简单且更易于维护,请保留它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-10-28
            • 2011-12-29
            • 2017-01-08
            • 2016-09-27
            • 2015-01-15
            • 1970-01-01
            • 2021-10-16
            • 2023-04-06
            相关资源
            最近更新 更多