Как правильно организовать вспомогательные методы для метода класса

У меня есть класс 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

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


person nijshar28    schedule 08.07.2020    source источник


Ответы (2)


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

  1. Начнем с подхода # 1
  2. Если основной метод в сочетании со вспомогательным методом становится слишком большим (›20-30 loc или что-то другое для вас разумно) или нечитаемым - сделайте его методом класса, как вы описали в подходе №2.
  3. Если вспомогательный метод становится общим для нескольких функций в классе - снова сделайте его методом класса
  4. Если вспомогательный метод становится общим для нескольких классов в модуле - поместите его в отдельный файл
person Sergey Dyshko    schedule 08.07.2020
comment
Привет. Спасибо за ответ. Когда вы говорите 20-30 loc, вы имеете в виду количество определений? - person nijshar28; 08.07.2020
comment
Вот хорошее объяснение, @ nijshar28,: stackoverflow.com/questions/611304/ - person Sergey Dyshko; 09.07.2020

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

person alex_noname    schedule 08.07.2020