Шаблон для обработки извлечения общих и типовых полей из курсора? - PullRequest
1 голос
/ 03 марта 2012

У меня есть курсор, где каждая строка представляет атрибуты объекта в той же иерархии. Эти объекты не принадлежат к одному и тому же классу. Каждая строка используется для создания экземпляра подкласса из одной иерархии. Курсор включает в себя столбец типа, который определяет конкретный подкласс для создания экземпляра. Каждому подклассу нужны значения из общего набора столбцов от курсора плюс набор столбцов, уникальных для конкретного подкласса. Некоторые столбцы применяются к одной строке, а не к другим - подумайте над большой таблицей соединений.

Я хочу избежать дублирования в моем коде синтаксического анализа при сохранении кода в чистоте. До сих пор я играл с несколькими подходами, ни один из которых не кажется идеальным:

  1. Имеется один метод фабрики, который извлекает все общие столбцы, проверяет тип, а затем использует его для извлечения дополнительных столбцов и создания экземпляра класса. Pro: без дублирования Con: один большой уродливый метод

  2. Иметь заводской метод для каждого типа, который выбирается с использованием только столбца типа. Pro: очень близкий код, который легко поддерживать Con: дублирует код, который извлекает общие столбцы каждый раз

  3. Имейте единственный метод, который извлекает значения из общих столбцов и затем передает их другим фабричным методам каждого типа. Pro: без дублирования, довольно близко к Con: методы большого старого с большим количеством параметров

  4. Включить конструкторы для моих объектов, которые принимают курсор. Подклассы извлекают то, что им нужно, а затем передают курсор в супер, чтобы получить общие вещи. Pro: Очень близко к Con: нарушает инкапсуляцию. Вносит риск в конструкторы из задач Курсора

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

1 Ответ

0 голосов
/ 03 марта 2012

Возможно, это:

Аннотируйте сеттеры в вашем классе столбцом, из которого они должны получать данные.

есть один метод, который принимает курсор; сделайте так, чтобы экземпляр объекта основывался на значении столбца типа. Изучите аннотации к результирующему объекту, чтобы определить, какие сеттеры вызывать для каждого столбца.

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

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