2016-10-11 5 views
0

Говорят, что круговые зависимости плохие и анти-шаблоны. Итак, мой вопрос в том, что не так с кодом ниже? Является ли это примером круговой зависимости вообще? Код находится в псевдокоде python, но его следует понимать.Это круговая зависимость?

class Manager: 
    _handlers = [] 

    def on_config(self): 
     # do something... 
     # and notify about "event" 
     for handler in self._handlers: 
      handler() 

    def add_change_handler(self, handler): 
     self._handlers.append(handler) 

    def get_value(self): 
     return some_value 

class Consumer: 
    def __init__(self, manager): 
     self._manager = manager 
     self._manager.add_change_handler(self._on_event) 

    def _on_change(self): 
     print('Got event') 

    def do_something(self): 
     self._manager.get_value() 

Итак: Потребитель получает менеджера:

  • get_value от него
  • зарегистрироваться для Litening на события изменения

Аргумент от ребят, которые выступают против этого решения заключается в том, что лучше создать другой класс, который будет:

  • знают о менеджере и потребителя
  • прослушивать событие конфигурации
  • обработчик on_change операторского потребителя
  • Потребитель будет использовать менеджер только get_value
+3

Это не квалифицируется как * "зависимости" *. Это круговая * связь * возможно, но не зависимость. – deceze

+2

В коде отсутствует циклическая зависимость. –

+0

ОК, спасибо. Но разве этот проект испорчен? Что случилось с этим, если это так? Является ли предлагаемый в конечном решении лучший выбор? – user2146414

ответ

-1

Circular (or cyclic) imports in Python. Этот ответ поможет вам узнать больше о циклических импортах в python.

Этот код не касается круговой зависимости. Вы можете также рассматривать эту ситуацию как сделку между bussinessmans.

#!/bin/python 
class Businessman: 
    _trader_list = [] 

    def __init__(self, name, goods): 
     self.m_name = name 
     self.m_goods = goods 

    def on_get_goods(self): 
     for trader in self._trader_list: 
      trader.buy_some(self) 

    def add_change_handler(self, handler): 
     self._trader_list.append(handler) 

    def del_change_handler(self, handler): 
     self._trader_list.remove(handler) 

    def buy_some(self, from_bussinessman): 
     print "{0} will buy some {1}s from {2}".format(
      self.m_name, from_bussinessman.m_goods, from_bussinessman.m_name) 

    def get_goods(self): 
     print("{0} gets new {1}s.".format(self.m_name, self.m_goods)) 
     self.on_get_goods() 

if __name__ == "__main__": 
    bob = Businessman('Bob', 'apple') 
    jack = Businessman('Jack', 'banana') 
    cream = Businessman('Cream', 'rice') 
    # Bob notifys Jack and Cream to buy apples when he gets some. 
    seller1 = bob 
    seller1.add_change_handler(jack) 
    seller1.add_change_handler(cream) 
    seller1.get_goods() 

В результате

Bob gets new apples. 
Jack will buy some apples from Bob 
Cream will buy some apples from Bob 

 Смежные вопросы

  • Нет связанных вопросов^_^