函数式编程是否使用"类方法"? OO - >功能性思维

时间:2015-01-24 17:18:46

标签: swift functional-programming

这是一个简单的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))?

1 个答案:

答案 0 :(得分:0)

根据经验,我宁愿避免在我不需要它时制作实例方法。虽然"点符号"很好,方法使用动态调度(允许它们的实现在子类中更改),这使得事情比使用常规函数更复杂。

那就是说,我在这里推荐的真正最佳做法是为你的功能使用名称,听起来不像是在改变事物。例如,appendChildToNode听起来像是在改变列表,即使它被编码为静态函数。而不是我更喜欢像cons(这个操作在不可变链表上的传统名称)或listNode(表示操作结果的名词而不是动词指示动作)