Каковы недостатки использования обратных вызовов для удовлетворения зависимостей? И это анти-паттерн? - PullRequest
0 голосов
/ 09 марта 2019

У меня есть два модуля:

#module_a

def make_a(cb = None):

    global a

    a = 1 # It takes a very long time to make "a", so it is stored as a global in module_a.

    if cb != None:

        cb()

И

#module_b

import module_a

def make_b():

    global b

    #In order to make "b", we need module_a.a, however there is no guarantee it has been made.
    if 'a' not in dir(module_a):

        module_a.make_a(make_b)

        return

    else:

        b = module_a.a + 1

make_b()

print(b) # 2

В приведенном выше коде функция make_b в module_b создает нечто с именем b, что зависит от чего-то с именем a в module_a. Чтобы удовлетворить свою зависимость, он вызывает make_a с обратным вызовом make_b. Как только a сделан, тогда make_b вызывается снова и b сделан.

Этот паттерн имеет для меня смысл, но мне интересно, является ли это общепринятым подходом к этому или же это анти-паттерн.

Существует ли более канонический подход к удовлетворению такой зависимости в Python, т.е. путь Pythonic?

1 Ответ

0 голосов
/ 09 марта 2019

Чтобы сделать это "Pythonic" способом, вы должны ввести шаблон Observer, который генерирует событие после вычисления a, и b должен подписаться на a, чтобы вызываться после завершения a.

Здесь у вас есть пример наблюдателя

...