Python中公共方法和私有方法之间的重构

时间:2018-06-28 12:26:44

标签: python refactoring private-methods

我正在查看教程“使用算法和数据结构解决问题”(http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html)中的“二叉搜索树”部分。在某些情况下,他们使用名称相同的“公共”和“私人”帮助程序方法,例如对于“放置”方法:

def put(self,key,val):
    if self.root:
        self._put(key,val,self.root)
    else:
        self.root = TreeNode(key,val)
    self.size = self.size + 1

def _put(self,key,val,currentNode):
    if key < currentNode.key:
        if currentNode.hasLeftChild():
               self._put(key,val,currentNode.leftChild)
        else:
               currentNode.leftChild = TreeNode(key,val,parent=currentNode)
    else:
        if currentNode.hasRightChild():
               self._put(key,val,currentNode.rightChild)
        else:
               currentNode.rightChild = TreeNode(key,val,parent=currentNode)

我在其他地方也看到过这种方法,但是我并不真正理解这种动机。与将所有内容直接放入一种方法相比,它的优点是什么,仅仅是为了提高可读性?

2 个答案:

答案 0 :(得分:1)

基本原理是该类的用户对“当前节点”一无所知。当前节点仅在递归插入过程中才有意义,它不是树的永久属性。用户将树视为一个整体,仅对其进行插入/查找操作。

也就是说,您可以通过使用默认值currentNode=None并进行检查,将两种方法混合在一起。但是,这两种方法做的事情截然不同。 put方法仅初始化根,而_put执行递归插入,因此最好将它们分开。

答案 1 :(得分:1)

这里,动机是使用递归。您可能已经注意到,_put方法本身和方法签名是不同的。如果将_put方法放入公共方法,则必须更改公共方法的签名才能处理给定节点上的放置操作。只需添加currentNode参数。但是,原始的公共方法没有此参数。我想是因为作者不想向最终用户公开此功能。