2016-10-11 110 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