我原本打算写:
-(void) setLeftChild:(NSNode *) leftChildNode {
_leftChildNode = leftChildNode;
leftChildNode.parent = self;
// ...
}
为节点的子节点设置所有合适的值,子节点的父节点应该指向自身,子节点的树对象应该和父节点的树对象(节点所属的树)相同。
但后来我意识到这样做会影响简单的线node.leftChild = something;
所以这条线会有“副作用”,否则可能会出乎意料。
此外,如果setLeftChild
实际使用其他属性的 setter(例如 using leftChildNode.parent = self
,这是正确的接口),而这些 setter 又使用节点的leftChild
setter 怎么办——这样会变成无限循环。如果某些特殊情况导致了这个无限循环,那就不是很好了,你总是要担心潜在的无限循环。
另一种方法是永远不要覆盖任何合成的setter,而只需使用名称addLeftChildNode
而不是setLeftChildNode
,在里面addLeftChildNode
,我们可以无忧无虑地自由使用属性setter。但是如果我们真的想“设置”它怎么办——“添加”这个名字可能意味着只有当它为空时才添加它,所以“设置”这个名字更合适。如果我将其称为addLeftChild
而不是addLeftChildNode
,那么这两个名称会令人困惑。也许如果使用约定,例如调用它setAndConfigLeftChildNode
,那么它不会令人困惑并且显然不会覆盖 setter,并且可以成为代码中遵循的约定。(使用setAndConfig
而不是覆盖设置器)
所以我们有以下问题:
1) 被覆盖的 setter 的意外副作用(在问题的开头)
2) 无限循环
3) 方法的命名,可能会造成混淆
有没有好的通用/最佳实践?