Рефакторинг между публичными и приватными методами в Python - PullRequest
0 голосов
/ 28 июня 2018

Я смотрю на раздел Деревья бинарного поиска в учебном пособии «Решение проблем с помощью алгоритмов и структур данных», (http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html). Несколько раз они используют вспомогательные и публичные методы с вспомогательными то же имя, например, для метода "put":

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 голосов
/ 28 июня 2018

Здесь мотивация заключается в использовании рекурсии. Как вы, наверное, заметили, метод _put вызывает сам себя, а сигнатуры методов разные. Если вы поместили метод _put в открытый метод, вам придется изменить сигнатуру открытого метода для обработки операции put на данном узле. Просто вы должны добавить currentNode параметр. Однако оригинальный открытый метод не имеет этого параметра. Я предполагаю, что это потому, что автор не хочет предоставлять эту функциональность конечному пользователю.

0 голосов
/ 28 июня 2018

Смысл в том, что пользователь класса не должен ничего знать о "текущем узле". Текущий узел имеет смысл только во время процесса рекурсивной вставки, он не является постоянным свойством дерева. Пользователь обрабатывает дерево в целом и выполняет только операции вставки / поиска.

Тем не менее, вы можете смешать оба метода в один, используя значение по умолчанию currentNode=None и проверив его. Тем не менее, два метода делают разные вещи. Метод put просто инициализирует корень, а _put выполняет рекурсивную вставку, поэтому, вероятно, было бы лучше оставить их разделенными.

...