Как правильно организовать "вспомогательные" методы для метода класса - PullRequest
1 голос
/ 08 июля 2020

У меня есть класс Python, который имеет несколько «основных» методов, которые последовательно изменяют один из его атрибутов, например,

def method1(self):
    # modify an attribute of self
    return self

def method2(self):
    # modify the same attribute of self
    return self 

Каждый из этих основных методов, в свою очередь, вызывает несколько «помощников». методы класса, которые также изменяют тот же атрибут, т.е.

def method1(self):
    self = self.helper_method1().helper_method2()
    return self

def method2(self):
    self = self.helper_method3().helper_method4()
    return self 

Существует ли консенсус относительно того, где (на каком уровне) должны быть определены эти «вспомогательные» методы внутри класса?

Т.е. это:

def helper_method1_to_be_called_by_method1(self):
    # modify at attribute of self
    return self

def helper_method2_to_be_called_by_method1(self):
    # modify at attribute of self
    return self

def method1(self):
    self = self.helper_method1().helper_method2()
    return self

предпочтительнее этого (или наоборот):

def method1(self):

    def helper_method1_to_be_called_by_method1(self):
        # modify at attribute of self
        return self

    def helper_method2_to_be_called_by_method1(self):
        # modify at attribute of self
        return self

    self = self.helper_method1().helper_method2()
    return self

Или есть третья стратегия, которая лучше всего работает с точки зрения производительности, простоты чтения и обслуживания?

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Вложенная функция имеет доступ к переменным в своей внешней области функций. Это так называемый function closure. Я считаю, что если это не то, что вам нужно, то, вероятно, вложенная функция в этом случае не нужна.

1 голос
/ 08 июля 2020

Дело в том, что никогда не знаешь, насколько гибким должен быть твой дизайн. Один крайний случай будет заключаться во вложении каждого связанного вспомогательного метода (ваш подход №2). Другой крайний случай - поместить каждый вспомогательный метод в отдельный файл (модуль) и назвать его как-то вроде "method1_helper_utils.py". Если вы заранее не знаете точный дизайн программного обеспечения, я бы предложил сделать это следующим образом:

  1. Начните с подхода # 1
  2. Если основной метод в сочетании с вспомогательным методом станет слишком большой (> 20-30 lo c или что-то еще, что является разумным для вас) или нечитаемым - сделайте его методом класса, как вы описали в своем подходе # 2
  3. Если вспомогательный метод становится общий для нескольких функций в классе - опять же, сделайте его методом класса
  4. Если вспомогательный метод становится общим для нескольких классов в модуле - поместите его в отдельный файл
...