Я нахожусь в анти-паттерне и хочу уйти - PullRequest
15 голосов
/ 11 августа 2010

Я разрабатываю веб-приложение на Java с использованием jsp / jquery / ejb / jboss.

У меня есть веб-форма, позволяющая пользователю выбирать любую комбинацию из 100 полей (все из разных несвязанных таблиц / объектов)) из базы данных.Эти поля затем выводятся через сервлет Java в электронную таблицу Excel.Выполняется хранимая процедура, которая всегда возвращает все 100 полей.

Веб-форма устанавливает 100 логических значений в объекте переноса (TO), чтобы определить, следует ли затем отображать данные.Затем к этому TO обращаются для создания строки заголовка электронной таблицы, а также для каждой строки из базы данных, которая повторяется.

Все работает нормально, однако кажется, что это неправильно.Я не могу придумать жизнеспособного способа, который не ссылается на 100 логических значений (N + 1 раз), чтобы определить, должно ли поле быть включено в выведенную электронную таблицу.Когда я говорю «жизнеспособный», я имею в виду, например, что я не хочу переписывать хранимую процедуру или создавать 100 различных хранимых процедур.

Ответы [ 4 ]

3 голосов
/ 11 августа 2010

Наше решение было в подобных ситуациях для создания динамического объекта передачи. По сути, это был Map вместо POJO, имеющего несколько методов получения и установки.

Коды, которые заполняют и считывают этот передаточный объект, были простыми итерациями.

1 голос
/ 11 августа 2010

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

0 голосов
/ 11 августа 2010

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

static final FIELD1 = 1;
static final FIELD2 = 2;
static final FIELD3 = 4;
static final FIELD4 = 8;
static final FIELD5 = 16;
etc

Каждое поле формы будет иметь значение своего битового значения, если оно выбрано, или 0, если оно не выбрано.При отправке формы, суммируйте поля и отправьте значение.Таким образом, если FIELD1 и FIELD3 были проверены, вы должны передать значение 5 (00101 в двоичном виде). ​​

Затем вы применяете простую битовую маску для каждого поля, чтобы определить, какие из них были выбраны (есть ли лучший способполе за полем?):

boolean field1Selected = sum & FIELD1;
boolean field2Selected = sum & FIELD2;
etc

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

0 голосов
/ 11 августа 2010

Вы можете исключить ручное перечисление полей:

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

  • при отправке формы отображаются все включенные поля с префиксом.

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