Реализация вложенной таблицы (просмотр в таблицу): проектирование отношений классов - PullRequest
1 голос
/ 18 ноября 2010

Я использую Python 3, но вопрос на самом деле не связан с конкретным языком.

У меня есть class Table, который реализует таблицу с первичным ключом.Экземпляр этого класса содержит фактические данные (которые очень велики).

Я хочу разрешить пользователям создавать вложенную таблицу, предоставляя фильтр для строк таблицы.Я не хочу копировать таблицу, поэтому я планировал оставить в подтаблице только подмножество первичных ключей из родительской таблицы.

Очевидно, подтаблица - это просто представлениеродительская таблица;он изменится, если изменится родительская таблица, станет недействительным, если родительская таблица будет уничтожена, и потеряет некоторые из ее строк, если они будут удалены из родительской таблицы.[ РЕДАКТИРОВАТЬ : чтобы уточнить, если родительская таблица изменилась, мне все равно, что происходит с подстатьей;любое поведение в порядке.]

Как мне соединить два класса?Я думал о:

class Subtable(Table):
  def __init__(self, table, filter_function):
    # ...

Мое предположение состояло в том, что Subtable сохраняет интерфейс Table, за исключением небольшого переопределения унаследованных методов только для проверки, находится ли строка. Это хорошая реализация?

Проблема в том, что я не уверен, как инициализировать экземпляр Subtable, учитывая, что я не хочу копировать переданный ему объект таблицы.Это вообще возможно?

Также я подумал дать class Table метод экземпляра, который возвращает Subtable instance;но это создает зависимость Table от Subtable, и я думаю, что лучше избегать?

1 Ответ

1 голос
/ 19 ноября 2010

Я собираюсь использовать следующее (я пропустил много методов, таких как sort, которые довольно хорошо работают в этой схеме; также пропущена обработка ошибок):

class Table:
    def __init__(self, *columns, pkey = None):
        self.pkey = pkey
        self.__columns = columns
        self.__data = {}

    def __contains__(self, key):
        return key in self.__data

    def __iter__(self):
        for key in self.__order:
            yield key

    def __len__(self):
        return len(self.__data)

    def items(self):
        for key in self.__order:
            yield key, self.__data[key]

    def insert(self, *unnamed, **named):
        if len(unnamed) > 0:
            row_dict = {}
            for column_id, column in enumerate(self.__columns):
                row_dict[column] = unnamed[column_id]
        else:
            row_dict = named
        key = row_dict[self.pkey]
        self.__data[key] = row_dict

class Subtable(Table):
    def __init__(self, table, row_filter):
        self.__order = []
        self.__data = {}
        for key, row in table.items():
            if row_filter(row):
                self.__data[key] = row

По сути, я копирую только первичные ключи и создаю ссылки на привязанные к ним данные. Если строка в родительской таблице будет уничтожена, она все равно будет существовать в дополнительной таблице. Если строка изменена в родительской таблице, она также изменяется в подстол. Это нормально, так как мои требования заключались в том, что «все идет, когда модифицируется родительская таблица».

Если вы видите какие-либо проблемы с этим дизайном, дайте мне знать, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...