【发布时间】:2009-05-14 22:36:45
【问题描述】:
看看你对这行代码的看法:
if ([pickerViewController.picker.bvc.currentResolve.name isEqualToString:message])
...
您认为这是过度使用点运算符吗?
如果没有,我可以保持原样。
但如果是这样,首选的选择是什么?
【问题讨论】:
标签: objective-c design-patterns oop coding-style
看看你对这行代码的看法:
if ([pickerViewController.picker.bvc.currentResolve.name isEqualToString:message])
...
您认为这是过度使用点运算符吗?
如果没有,我可以保持原样。
但如果是这样,首选的选择是什么?
【问题讨论】:
标签: objective-c design-patterns oop coding-style
这更像是Law of Demeter 违规,而不是点运算符的问题。做到这一点的“更干净”的方法是为对象提供逻辑来解决这个问题,所以你可以做类似的事情
if ([pickerViewController hasPickedName:message])
【讨论】:
我认为没有过度使用属性符号。如果一个对象有一个属性,就这样访问它;它向读者展示了程序员的意思。
哦,先发制人“看起来像一个结构”旅;如果您无法从代码中的对象中分辨出结构,请重构您的代码。
【讨论】:
只要每次使用点运算符都确实获取一个属性(即,不是一个主要关注为返回值以外的目的工作的方法),那就没问题了。事实上,如果您查看 Wil Shipley 的博客,他实际上非常喜欢根据需要将尽可能多的函数调用链接到一行中(他不喜欢过度使用局部变量)。
【讨论】:
我发现调试这类事情总是比它的价值更麻烦,所以我倾向于为每个属性访问创建中间变量。或者,正如其他人建议的那样,重构它,使其在使用站点上看起来更简单(通过将智能放入方法中)。
【讨论】:
我同意Chuck 和评论者的观点。您的方法依赖于太多其他对象,但是将hasPickedName: 放在pickerViewController 上意味着pickerViewController 仍然必须以某种方式执行[picker.bvc.currentResolve.name isEqualToString:message]。
相反,您可以将hasPickedName: 放在bvc 上,并使用Interface Builder 将bvc 作为委托(可能输入id<NamePickerDelegate>)注入到您的顶级对象中。要真正符合 Demeter,请让 currentResolve 增长一个方法 nameMatches:,它可以快捷方式 [currentResolve.name isEqualToString:message]。
您应该仔细查看由问题引起的复杂性以及每个解决方案将引入的复杂性。如果您认为原始代码比替代代码更简单且更易于维护,请保留它。
【讨论】: