下面是一个简单的Node类
class Node: {
let uuid: String
var children = [Node]()
init() {
self.uuid = NSUUID().UUIDString
}
func addChild(node: Node) {
children.append(node)
}
func removeChild(node: Node) {
if let index = self.children.indexOf(node) {
children.removeAtIndex(index)
}
}
}为了使用纯函数,我通过实现“全局”函数appendChildToNode,removeChildFromNode,以addChild和removeChild返回新节点而不是变异内部子数组的方式重写了Node:
struct Node: {
let uuid: String
let children = [Node]()
init(uuid: NSString, children: [Node]) {
self.uuid = uuid
self.children = children;
}
}
func appendChildToNode(node: Node, #child: Node) -> Node {
return Node(uuid: node.uuid, children: node.children + [child])
}
func removeChildFromNode(node: Node, #child: Node) -> Node {
return Node(uuid: node.uuid, children: node.children.filter { $0 != child })
}我没有添加appendChildToNode、removeChildFromNode作为类方法,因为
对我来说,Node.appendChild(子节点)意味着原始节点将被更改,并且不会返回任何内容(尽管它可以实现为返回新节点)。我之所以得到这样的印象,是因为在Swift中,array.appendObject(object)会改变原来的数组,并且经过多年的OO思维方式。
函数式编程的最佳实践/首选是什么?
appendChildToNode(节点、子节点)还是类方法?(Node.appendChild(孩子))?
发布于 2015-01-25 01:27:36
作为一个经验法则,当我不需要的时候,我更喜欢避免使用实例方法。尽管“点表示法”很好,但方法使用动态分派(允许它们的实现在子类中更改),这使得事情比使用常规函数更复杂。
也就是说,我在这里推荐的真正的最佳实践是为你的函数使用听起来不像是变异的东西的名称。例如,appendChildToNode听起来像是在改变列表,即使它被编码为一个静态函数。
https://stackoverflow.com/questions/28128120
复制相似问题