Как объекты могут общаться, не нарушая принцип инверсии зависимости?

Я создаю 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')
Другие вопросы по тегам