Эта проблема имеет три аспекта: макет формы, хранение базы данных и настраиваемая бизнес-логика.
Конфигурация, управляемая макетом формы
Гибкий подход к макету формы может быть достигнут путем перемещения макета в файл дескриптора. Три инструментария GUI, которые поддерживают это, являются QT, WPF и XUL. Однако AFAIK Swing не поддерживает эту возможность напрямую. QT Jambi позволяет вам использовать QT на Java в качестве альтернативы Swing, и QT 4.5 будет доступен с лицензированием LGPL. Это не чисто Java-решение, но может быть возможно, если это и переписывание кода UI сопровождающим лицом приемлемо.
Преимущество макета формы, основанного на конфигурации, заключается в том, что настройки могут быть выполнены без необходимости поддерживать отдельную сборку для каждого клиента, поэтому даже если у вас есть действующая кодовая база, вы можете проверить, существует ли экономическое обоснование принять такой инструментарий вместо поддержки нескольких сборок для конкретного клиента. Однако для скомпилированного языка вам все равно может потребоваться установить какую-то инфраструктуру плагинов для сгенерированного кода формы.
Настраиваемое хранилище базы данных
Это сложнее. Вы можете сделать это тремя способами, которые имеют свои плюсы и минусы.
Первый подход состоит в том, чтобы иметь в таблице ряд полей 'user', таких как 'User1', 'User2' и т. Д. Сконфигурированные поля в формах могут быть сопоставлены с этими полями - и универсальный пользователь Полевое картографическое средство не должно быть сложным для реализации. Это наиболее эффективно с точки зрения запроса к базе данных, но страдает от ограничения конечного числа возможных полей. Если у вас есть поля 'User1' до 'User20', вы можете поддерживать только 20 пользовательских атрибутов. Кроме того, они должны быть хорошими, широкими универсальными вариантами, так что вы не получите безопасность типов из базы данных.
Второй подход заключается в том, чтобы таблица атрибутов свисала с сущности. Это не дает вам безопасности типов, но позволяет вам иметь столько атрибутов, сколько вы хотите. Создание универсального обработчика для этого также вполне осуществимо, но это повлияет на производительность запроса, так как вы выполняете несколько соединений с таблицей атрибутов.
Сохранять определенные пользователем поля в BLOB-объекте. Это мало что может рекомендовать, так как это затрудняет доступ к данным через базу данных. Тем не менее, я видел это сделано.
Настраиваемая бизнес-логика
Это гораздо более сложный вопрос. Без добавления пользовательского кода и изменения сборки у вас есть несколько вариантов выполнения настраиваемых бизнес-правил: механизмы правил, языки сценариев или набор стандартных функций включения / выключения, таких как обязательные поля.
Движки правил: вам действительно нужно разработать приложение с нуля, чтобы использовать их, и у них есть свои ограничения и недостатки. ILOG, занимающий должность в этой области, также довольно дорог. Для Java, JESS может быть вариантом.
Встроенный язык сценариев. Добавив интерпретатор для Jython, Groovy или какого-либо другого дружественного к JVM языка интерпретации, вы можете создавать подключаемые модули для системы без необходимости создания новой сборки. Некоторая нагрузка на тестирование все еще будет возникать, но это может быть выигрыш в обслуживании в целом.
Конфигурация включения / выключения для функций. Это наименее гибкий вариант, но он относительно простой и относительно мало добавляет внешних зависимостей и затрат на лицензирование. Это также может быть вашим единственным выбором, если вы пытаетесь адаптировать конфигурацию к тому, что запустило жизнь как заказное приложение.
Ничего из вышеперечисленного
Если ответ «Ни один из вышеперечисленных», вы, вероятно, застряли с пользовательскими сборками. В этом случае создайте подключаемую архитектуру для форм, чтобы вы могли, по крайней мере, изолировать специфичные для клиента элементы в отдельном модуле.