Я строю Планировщик путей, который поможет людям спланировать путь через консольную игру RPG.Как объекты могут взаимодействовать без нарушения принципа инверсии зависимостей?
Я хочу создать таблицу, которая показывает каждый шаг по сцене. У меня на самом деле implemented a working version of this, однако это, по-видимому, ужасный дизайн ООП; он нарушает всевозможные принципы, и я считаю, что это даже не законный ООП. Проблема в том, что 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]
. Без нарушения всех принципов проектирования OO.
Это расстраивает, потому что вся работа InputManager
- это доступ к PathTable
. Но я не могу использовать композицию для размещения InputManager
внутри PathTable
, потому что это плохой дизайн.
Что такое чистый способ достичь этого?
Я новичок, и я пытаюсь учиться.
Почему бы не добавить 'метод getStep' для' PathTable'? Также содержимое 'rmStep' можно просто заменить на' self._table.pop() ' –
« Моя проблема в том, что мне нужны разные объекты, чтобы разговаривать друг с другом »=> выглядит как кандидат для посредника http: // en .wikipedia.org/wiki/Mediator_pattern –