Как объекты могут общаться, не нарушая принцип инверсии зависимости?
Я создаю Path Planner, который поможет людям спланировать путь через консольную игру RPG.
Я хочу создать таблицу, которая показывает каждый шаг на этапе. Я на самом деле реализовал рабочую версию этого, однако, это выглядит ужасно ООП дизайн; это нарушает все виды принципов, и я считаю, что это даже не законный ООП. Проблема, очевидно, в том, что Table
это класс бога.
В связи с этим я решил переписать его, стараясь помнить о надлежащих принципах ООП. Я хочу расстаться 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]
, Не нарушая все виды принципов проектирования ОО.
Это расстраивает, потому что вся работа InputManager
это доступ PathTable
, Но я не могу использовать композицию для размещения InputManager
внутри PathTable
, потому что это плохой дизайн.
Как правильно это сделать?
Я новичок, и я пытаюсь учиться.
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')