Какие шаблоны дизайна соответствуют этому запаху кода? - PullRequest
3 голосов
/ 07 сентября 2011

У меня есть PDF-форма, содержащая 450 полей, и я собираюсь заполнить ее, используя данные, которые есть в моей базе данных. Каждое поле в PDF имеет уникальное имя, и я могу сделать сопоставление, например:

switch (fieldname)
{
    case "Name":
        value = GetData(Name);
        break;  // Etc...
    case "Date":
        value = Date();
        break;
    default:
        value = "";
        break;
}

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

* РЕДАКТИРОВАТЬ * Итак, давайте просто скажем, что у меня есть гигантский оператор switch ~ 450 ветвей, который направляет имена полей PDF, такие как «Имя», «Адрес», «Телефон», в правильный запрос к базе данных для выполнения. Какие еще способы можно решить, кроме включения имен полей, когда имена полей являются переменными, в зависимости от того, какой документ был выбран конечным пользователем.

* ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ * Я думал об этом в течение дня и придумал решение благодаря всем предложениям. У меня есть функция под названием GetElement (). Он принимает имя поля PDF в качестве параметра и выполняет хранимую процедуру, которая возвращает столбец базы данных и другое имя процедуры в виде карты. Затем, используя динамический SQL, я передаю имя процедуры и столбец, который я ищу, и возвращаю результаты. Трудно найти правильный ответ здесь, но я воздаю должное тому, который подтолкнул меня к самому близкому.

Ответы [ 6 ]

4 голосов
/ 07 сентября 2011

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

1 голос
/ 08 сентября 2011

Больше, чем шаблон проектирования, я бы выбрал более простой подход, поправьте меня, если я сделал неправильные предположения:

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

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

Карты инициализируются, когда приложение запускается из некоторых файлов конфигурации (некоторых свойств или файлов XML), и карты кэшируются, поэтому вам не нужно их заново создавать.

При обработке документа нужно только выбрать правильный объект карты и сделать цикл: foreach($field in $document): $field['value'] = getData(pdfMap.getValue($field));

Если вам нужно изменить или добавить некоторую конфигурацию, просто измените файлы сопоставления и перезапустите приложение (или обновите карту, если вы не хотите перезапускать)

1 голос
/ 08 сентября 2011

Я думаю, что вы пытаетесь реализовать систему Object-Property-Value, объект здесь представляет собой документ, который имеет различные свойства ... с разными значениями в разных случаях.но лучше хранить в хранилище, отличном от обычной СУБД, возможно, в базе данных xml.

0 голосов
/ 15 сентября 2011

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

Другой способ: если тип данных имеет значение, вам понадобится отображение поля-> типа данных где-нибудь (скажем, ENUM в Java).Затем создайте одну функцию с именем getValue (fieldName), которая вызывает getString (fieldName) или getDate (fieldName) или getCurrency (fieldName) в зависимости от типа данных.

Ваш регистр коммутатора для типа данных будет 5-10 при макс.

0 голосов
/ 08 сентября 2011

Не можете ли вы вернуть все 450 элементов данных из базы данных с помощью SELECT, а затем проиндексировать это с помощью fieldname?Какой язык вы используете?

например

datarow dr = GetAllData();
foreach field in document {
  field.value = dr[field.Name];
};
0 голосов
/ 07 сентября 2011

Как структурированный документ, я думаю Посетитель будет вашим лучшим выбором.

...