这是一个简单的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)
}
}
}
要使用纯函数,我以addChild和removeChild的方式重新编写Node,返回新的Node而不是改变内部子数组,通过实现" global"函数appendChildToNode,removeChildFromNode:
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(child)意味着原始节点将被更改,并且不会返回任何内容(尽管可以实现它以返回新节点)。我得到的印象是因为在Swift array.appendObject(object)中会改变原始数组,并经过多年的OO思维方式。
函数式编程的最佳实践/偏好是什么?
appendChildToNode(node,child)或类方法? (Node.appendChild(child))?
答案 0 :(得分:0)
根据经验,我宁愿避免在我不需要它时制作实例方法。虽然"点符号"很好,方法使用动态调度(允许它们的实现在子类中更改),这使得事情比使用常规函数更复杂。
那就是说,我在这里推荐的真正最佳做法是为你的功能使用名称,听起来不像是在改变事物。例如,appendChildToNode
听起来像是在改变列表,即使它被编码为静态函数。而不是我更喜欢像cons
(这个操作在不可变链表上的传统名称)或listNode
(表示操作结果的名词而不是动词指示动作){} p>