2016-07-29 1 views
0

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

Проблема в том, что у меня есть много дублирования кода на протяжении всего моего кода из-за указанного перечисления. Всякий раз, когда я хочу, чтобы изменить перечисление я также должен изменить эти части моего кода, чтобы сделать всю работу вещи:

  • Изменить перечисление самого
  • Изменить определение SQL таблицы (я использую MySql перечисления)
  • Изменение таблицы перевода enumToString в моем слое доступа к данным (мне нужна строка для запроса SQL)
  • Изменить перевод таблицы stringToEnum в моем слое доступа к данным (преобразовать извлеченное значение обратно на правильную запись перечислений)
  • Измените таблицу перевода enumToPrettyString для моего графического интерфейса использование (отображение удобочитаемых строк вместо базы данных хранятся один)
  • Изменить список всех доступных записей перечислений, так что я могу заполнить выпадающий ящик в моем GUI со всеми возможными записями для пользователя, чтобы выбрать

Я знаю, что классы Javas Enum более мощные, и вы можете добавить много этой информации непосредственно в определение записи перечисления, но перечисления C++ являются целыми числами внутри, поэтому я не получаю этого удобства.

Любые идеи, как я мог бы свести к минимуму дублирование кода здесь?

+0

У вас есть '' две большие перечисления' * - хорошо: (1) Что означает «большой»: много элементов? (2) Разве ваша проблема не зависит от количества перечислений: не лучше ли было бы сократить до простого * перечисления? – Wolf

+1

Вы правы, я буду перефразировать вопрос, поскольку он одинаковый для обоих перечислений. «Большой» означает где-то от 10 до 30 записей. –

+0

Предлагает создать 'DLL/.so', который будет абстрагировать все функциональные возможности конверсий и обеспечит именно то, что требуется клиентам' DLL/.so'. Таким образом, только определение «enum» будет меняться при добавлении/удалении/изменении членов/записей enum. – sameerkn

ответ

2

Это хороший кандидат для генерации кода. Напишите единую спецификацию для вашего перечисления, а затем сгенерируйте для нее весь необходимый код перевода во всех языковых средах. Используйте свою систему сборки, чтобы поддерживать все в актуальном состоянии. Основная ошибка заключается в том, что если вы когда-либо храните или сериализуете целочисленное представление низкого уровня, вам нужно быть осторожным, чтобы никогда не удалять/не перерабатывать какие-либо конструкторы перечисления (вместо этого просто добавлять новые в конец).

Смежные вопросы