2015-04-07 51 views
2

我正在構建一個路徑規劃器,它將幫助人們通過RPG控制檯遊戲規劃路徑。對象如何溝通而不違反依賴倒置原則?

我想創建一個表格,顯示舞臺上的每一步。我實際上有implemented a working version of this,但是,它看起來很糟糕的OOP設計;它打破了各種原則,我相信它甚至不是合法的OOP。 問題是,顯然Table是上帝階級。

由於這個原因,我決定重寫它,同時試圖記住適當的OOP原則。我想把Table分成多個類。

我的問題是我需要各種對象互相交談。但是,我的解決方案是總是使用構圖。這打破了依賴原則以及單一責任原則。

這裏是將存儲播放器的步驟主要表:

class PathTable(object): 
    ''' A path table. ''' 

    def __init__(self): 
    # table is a list of dicts, representing rows 
     self._table = [] 

    @property 
    def table(self): 
     return self._table 

    def addStep(self, step): 
     ''' Adds a step to the table. ''' 
     self._table.append(step) 

    def rmStep(self): 
     ''' Removes the last step from the table. ''' 
     try: 
      del self._table[-1] 
     except: 
      raise IndexError('Tried to remove item from an empty table.') 

現在,我已經創建了一個InputManager,負責接受和驗證用戶輸入:

class InputManager(object): 
    ''' Responsible for managing user input. ''' 
    def __init__(self): 
     pass 
    def addFight(self, position): 
     ''' Add a 'fight' at table[position]. ''' 
     # table._table[position]['input'] = 'fight' 
     # Need to somehow edit a particular row in the Table. 

不過,現在我不知道如何才能訪問PathTable._table[position]。沒有打破各種OO設計原則。

這很令人沮喪,因爲InputManager的整個工作是訪問PathTable。但是我不能用裏面的PathTable,因爲它是壞設計。

什麼是乾淨的方法來實現這一目標?

我是初學者,我正在努力學習。

+1

爲什麼不添加一個'getStep'方法' PathTable'?此外,'rmStep'的內容可以替換爲'self._table.pop()' –

+1

「我的問題是我需要各種對象進行對話」=>看起來像一個調解人http:// en .wikipedia.org/wiki/Mediator_pattern –

回答

1

首先增加對你的PathTable類編輯一個步驟的一行:

class PathTable(object): 
    def __init__(self): 
     self._table = [] 

    ## NB : This defeats the whole point of making `_table` private 
    #@property 
    #def table(self): 
    # return self._table 

    def add_step(self, step): 
     ''' Adds a step to the table. ''' 
     self._table.append(step) 

    def rm_step(self): 
     ''' Removes the last step from the table. ''' 
     return self._table.pop() 

    def update_step(self, position, key, value): 
     self._table[position][key] = value 

然後傳遞PathTable實例您InputManager

class InputManager(object): 
    ''' Responsible for managing user input. ''' 
    def __init__(self, path_table): 
     self._path_table = path_table 

    def add_fight(self, position): 
     ''' Add a 'fight' at table[position]. ''' 
     self._path_table.update_step(position, 'input', 'fight') 
+0

這樣可以嗎,因爲現在InputManager依賴於PathTable? – BBedit

+0

調解器或控制器(主要是你的'InputManager')怎麼可能不依賴於它必須使用的對象?但是如果你重新讀取代碼,'InputManager'不依賴於'PathTable' * class *,它只是希望用一個暴露與'PathTable'相同(隱式)接口的對象來初始化。 FWIW,具有取決於領域模型層對象的UI層對象是預期的 - 他們還能如何執行他們的工作? - ,你不想要的是取決於UI層的領域模型層。 –