【问题标题】:How should I document property setters?我应该如何记录属性设置器?
【发布时间】:2014-02-05 01:08:16
【问题描述】:

我偶尔会覆盖 Objective-C 属性的设置器,并且想知道。如果我大幅更改方法的默认行为,我应该在标题中的哪个位置记录它?还是我应该完全使用一种新方法?

在我目前的情况下,我在界面生成器中将视图设置为占位符视图。以编程方式,将有一种方法可以用新视图(图标或任意自定义视图)替换此视图。替换占位符视图的方法会自动将属性设置为新视图,从父视图中删除占位符视图,将新视图添加到父视图,并适当地重新定位/调整新视图的大小。

我想出了三个选择:

A) 覆盖属性的设置器,并连同属性一起记录:

// Documentation goes here
// The setter of this property actually does <etc>
@property (nonatomic, retain) IBOutlet UIView* placeholderView;

B) 覆盖setter,并在header中声明:

// Documentation goes here
-(void)setPlaceholderView:(UIView*)view;

C) 使用完全不同的方法并将属性设置为只读:

@property (nonatomic, retain, readonly) IBOutlet UIView* placeholderView;
-(void)replacePlaceholderView:(UIView*)view;

选项 C 看起来很吸引人,因为它非常清楚该方法的作用。很明显,由于它与普通的 setter 不同,它的行为可能会有所不同(它会这样做)。我在这里看到的缺点是它似乎没有遵循正常的 Objective-C 趋势。

你们认为做这种事情最干净的方法是什么?

【问题讨论】:

  • 您根本不应该“彻底改变 [setter] 方法的默认行为”。一个 setter 方法应该设置一个属性,如果是这样,你不需要在任何地方的头文件中记录覆盖,因为它完全符合用户的期望,并且覆盖是一个实现细节,可以记录在实施文件。从根本上改变预期行为只会造成混乱,是应该避免的。选择 (C) 选项,除非您期望的行为是用户在设置该属性时合理期望发生的行为。
  • 听起来像是一个答案。

标签: objective-c coding-style


【解决方案1】:

您根本不应该“彻底改变 [setter] 方法的默认行为”。一个 setter 方法应该设置一个属性,如果是这样,你不需要在任何地方的头文件中记录覆盖,因为它完全符合用户的期望,并且覆盖是一个实现细节,可以记录在实施文件。从根本上改变预期行为只会造成混乱,是应该避免的。选择 (C) 选项,除非您希望的行为是用户在设置该属性时合理期望发生的行为。

【讨论】:

    【解决方案2】:

    实际上,IBOutlet 只能在从 nib 文件初始化期间设置。如果我要重构它,我将声明属性

    @property (nonatomic, weak) IBOutlet UIView *initialPlaceholderView;
    @property (nonatomic, weak) UIView *placeholderContainerView;
    @property (nonatomic, weak) UIView *currentPlaceholderView;
    

    然后将replacePlaceholderView:重命名为

    -(void)updatePlaceholderContainerWithNewView:(UIView*)newPlaceholderView;
    

    这是自记录代码。您已经可以仅通过属性和方法名称来假设行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2011-01-16
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多