Как избежать разработки классов, функции-члены которых зависят друг от друга? - PullRequest
1 голос
/ 01 апреля 2019

Допустим, у меня есть класс Adder:

class adder(object):
  def __init__(self, a, b):
     self.a=a
     self.b=b
     self.result = None

  def perform_addition(self):
     self.result = self.a + self.b
     return self.result

Если я создаю экземпляр этого класса:

myAdder = adder(1,2)

Тогда значение myAdder.result сначала зависит от вызова execute_addition (), в противном случае оно всегда останется None. Другими словами, существует зависимость от execute_addition () для значения self.result. И если мы экстраполируем, более сложный класс может иметь цепочку зависимостей: то есть вы должны вызывать функции A, B и C перед D, потому что они, в свою очередь, заполняют необходимые переменные, которые нужны следующей функции.

Это плохой дизайн класса? Каково средство от этого? Я думаю, что выше пример: https://en.wikipedia.org/wiki/Sequential_coupling

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Я думаю, все зависит от того, что вы хотите сделать и как вы хотите это сделать. код, который у вас есть, не обязательно плохой, если вам нужна статическая зависимость от «execute_addition ()» для значения «self.result». Но если вам нужна динамическая зависимость, то приведенный ниже код будет хорошим и простым подходом. таким образом, когда объект создается путем создания экземпляра класса со значениями «a» и «b», автоматически вычисляется «self.result». Вы также можете использовать более продвинутые инструменты, такие как свойства, декораторы, дескрипторы и т. д. Как я уже сказал, все зависит от того, что вы хотите.

Class adder(object):
    def __init__(self, a, b):
        self.a=a
        self.b=b
        self.result = self.perform_addition()

    def perform_addition(self):
        self.result = self.a + self.b
        return self.result
1 голос
/ 01 апреля 2019

Было бы неплохо вместо этого сделать result свойством, чтобы добавление выполнялось только при обращении к атрибуту result:

class adder(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def result(self):
        return self.a + self.b

myAdder = adder(1,2)
print(myAdder.result)

Это выводит: 3

В случае, если к атрибуту result ожидается многократный доступ и что это требует значительных вычислений, вы можете сохранить результат в переменной экземпляра, чтобы избежать повторных вычислений:

class adder(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self._result = None

    @property
    def result(self):
        if self._result is None:
            self._result = self.a + self.b
        return self._result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...