この問題には、フォームレイアウト、データベースストレージ、および構成可能なビジネスロジックの3つの側面があります。
構成主導のフォームレイアウト
フォームレイアウトへの柔軟なアプローチは、レイアウトを記述子ファイルに移動することで実現できます。これをサポートする3つのGUIツールキットは、QT、WPF、およびXULです。ただし、AFAIKSwingはこの機能を直接サポートしていません。QT Jambiでは、Swingの代わりにJavaでQTを使用でき、QT4.5はLGPLライセンスで利用できるようになります。これは純粋なJavaソリューションではありませんが、これとそれに伴うUIコードの書き直しが許容できる場合は可能性があります。
構成主導型のフォームレイアウトの利点は、顧客ごとに個別のビルドを維持することなくカスタマイズできることです。したがって、既存のコードベースがある場合でも、そのようなものを採用するビジネスケースがあるかどうかを調べることができます。ツールキットと複数の顧客固有のビルドの維持。ただし、コンパイルされた言語の場合でも、生成されたフォームコードに対して何らかのプラグインフレームワークを設定する必要がある場合があります。
構成可能なデータベースストレージ
これはもっと複雑です。これは、長所と短所の3つの方法で行うことができます。
最初のアプローチは、「User1」、「User2」などの一連の「user」フィールドをテーブルに配置することです。フォームの構成済みフィールドはこれらのフィールドにマップできます。一般的なユーザーフィールドマッピング機能は、実装が難しい。これは、データベースクエリの観点からは最も効率的ですが、可能なフィールドの数が限られているという制限があります。フィールド「User1」から「User20」がある場合、サポートできるのは20個のユーザー定義属性のみです。また、それらは素晴らしく、幅の広い汎用varcharである必要があるため、データベースから型の安全性を得ることができません。
2番目のアプローチは、属性テーブルをエンティティにぶら下げることです。これは型の安全性を与えるものではありませんが、必要な数の属性を持つことができます。このための汎用ハンドラーを構築することも非常に実行可能ですが、属性テーブルに対して複数の結合を行うと、クエリのパフォーマンスが影響を受けます。
ユーザー定義フィールドをXMLBLOBに永続化します。これは、データベースを介したデータへのアクセスを困難にするため、推奨することはほとんどありません。しかし、私はそれが行われるのを見てきました。
構成可能なビジネスロジック
これははるかに厄介な問題です。カスタムコードを追加したりビルドを変更したりせずに、構成可能なビジネスルールを実行するためのいくつかのオプションがあります。ルールエンジン、スクリプト言語、または必須フィールドなどの標準のオン/オフ機能のセットです。
ルールエンジン:これらを使用するには、アプリケーションを最初から設計する必要があり、独自の制限と失敗があります。この分野の現職であるILOGもかなり高価です。Javaの場合、JESSがオプションになる可能性があります。
埋め込みスクリプト言語:Jython、Groovy、またはその他のJVMに適したインタープリター言語を追加することで、新しいビルドを発行することなく、システムのプラグインを作成できます。一部のテストワークロードは引き続き発生しますが、これは全体としてメンテナンスのメリットになる可能性があります。
機能のオン/オフ構成。これは最も柔軟性の低いオプションですが、比較的単純であり、外部の依存関係とライセンスコストの点で比較的わずかしか追加されません。特注のアプリケーションとして誕生したものに構成を後付けしようとしている場合も、これが唯一の選択肢となる可能性があります。
上記のどれでもない
答えが「上記のどれでもない」の場合、おそらくカスタムビルドで立ち往生しています。その場合は、フォームのプラグインアーキテクチャを作成して、少なくとも顧客固有のアイテムを別のモジュールに分離できるようにします。