さまざまな顧客のフォームのカスタマイズをどのように処理しますか?

StackOverflow https://stackoverflow.com/questions/447105

質問

アプリケーションでは、異なる顧客向けにGUIを少し変更する必要がある場合があります。

  • ある顧客には他の顧客にはない入力フィールドがあります。
  • 別の顧客にはすべてデフォルトのフィールドがありますが、オプションの入力フィールドの1つは必須です。
  • 3番目の顧客にはデフォルトのフィールドがありますが、1つのフィールドのキャプションが変更されています
  • 4番目の顧客には複数の新しい入力フィールドがあり、1つの既存の複数行入力フィールドを単一行入力フィールドに変更する必要があります(新しいフィールド用のスペースを確保するため)
  • ...

(注:これらの例は厄介に聞こえるかもしれませんが、これらはお客様が求めたものです)

これらのケースをどのように処理しますか?

  • 一般的に
  • Java / Swingで

現在、最も一般的な方法でフォームを設計しました。実行時に、フィールドの非表示、サイズ変更、再配置などの調整を行います。 入力検証では、アクティブな顧客に応じてコンテンツを検証します。

役に立ちましたか?

解決

この問題には、フォームレイアウト、データベースストレージ、構成可能なビジネスロジックの3つの側面があります。

構成駆動型フォームレイアウト

レイアウトを記述子ファイルに移動することにより、フォームレイアウトへの柔軟なアプローチを実現できます。これをサポートする3つのGUIツールキットは、QT、WPF、およびXULです。ただし、AFAIK Swingはこの機能を直接サポートしていません。 QT Jambiを使用すると、Swingの代わりにJavaでQTを使用することができ、LGPLライセンスでQT 4.5が利用可能になります。これは純粋なjavaソリューションではありませんが、これとそれに伴うUIコードの書き直しが許容される場合、可能性があります。

構成駆動型フォームレイアウトの利点は、顧客ごとに個別のビルドを維持しなくてもカスタマイズできるため、既存のコードベースがある場合でも、ビジネスケースがあるかどうかを調べることができます。そのようなツールキットを採用することと、複数の顧客固有のビルドを維持すること。ただし、コンパイルされた言語の場合は、生成されたフォームコードに対して何らかのプラグインフレームワークを設定する必要があります。

構成可能なデータベースストレージ

これはより複雑です。これには3つの方法があり、長所と短所があります。

  1. 最初のアプローチは、「User1」、「User2」など、一連の「ユーザー」フィールドをテーブルに設定することです。フォーム上の設定済みフィールドは、これらのフィールドにマッピングできます。フィールドマッピング機能を実装するのは難しくありません。これは、データベースクエリの観点からは最も効率的ですが、使用可能なフィールドの数に限りがあるという制限があります。 「User1」から「User20」までのフィールドがある場合、20個のユーザー定義属性のみをサポートできます。また、それらは素晴らしく、広く一般的なvarcharである必要があるため、データベースからタイプセーフティを取得できません。

  2. 2番目のアプローチは、属性テーブルをエンティティにぶら下げることです。これにより、タイプセーフが得られるわけではありませんが、必要な数の属性を使用できます。このための汎用ハンドラーの構築も非常に実現可能ですが、属性テーブルに対して複数の結合を行うと、クエリのパフォーマンスに影響があります。

  3. XML blobのユーザー定義フィールドを永続化します。データベースを介したデータへのアクセスが難しくなるため、これを推奨することはほとんどありません。しかし、私はそれを見ました。

構成可能なビジネスロジック

これは、はるかに厄介な問題です。カスタムコードを追加してビルドを変更することなく、構成可能なビジネスルールを実行するためのいくつかのオプションがあります。ルールエンジン、スクリプト言語、必須フィールドなどの標準のオン/オフ機能のセットです。

  1. ルールエンジン:これらを使用するには、アプリケーションを最初から設計する必要があり、独自の制限と脆弱性があります。この分野の現職であるILOGも非常に高価です。 Javaの場合、JESSはオプションかもしれません。

  2. 埋め込みスクリプト言語:Jython、Groovy、またはその他のJVMに対応したインタープリター言語のインタープリターを追加することにより、新しいビルドを発行することなくシステムのプラグインを作成できます。テストのワークロードは引き続き発生しますが、これは全体的なメンテナンスに役立つ可能性があります。

  3. 機能のオン/オフ構成。これは最も柔軟性の低いオプションですが、比較的単純であり、外部の依存関係とライセンスコストに関してはほとんど追加されません。また、オーダーメイドのアプリケーションとしての生活を始めたものに設定を改造しようとしている場合、それはあなたの唯一の選択肢かもしれません。

上記のいずれでもない

答えが「None of the Above」の場合、おそらくカスタムビルドにこだわっています。その場合は、少なくとも顧客固有のアイテムを個別のモジュールに分離できるように、フォームのプラグインアーキテクチャを作成します。

他のヒント

これにはいくつかの異なる方法があります。ただし、状況に大きく依存します。

  1. 同じ画面に異なる顧客ロジックを追加する代わりに、顧客ごとに異なる画面を用意し、デフォルトでは全員が使用します。

  2. カスタムビルドまたは顧客ブランチ。これはかなり複雑になる可能性があります。

  3. やったこととまったく同じように行い、画面に顧客固有のロジックを埋め込みます。

  4. 何らかのタイプのルールエンジンを使用して、インターフェイスを操作します。

4つのアプローチが考えられます:

  1. しないでください。うん、もう手遅れだということはわかっているが、もしそれで済ませるのであれば、常に標準の製品を販売する。

それが不可能な場合...

  1. 機能マトリックスを作成します。各顧客は、ボックスにチェックマークを付けて独自の要件を定義できます(フィールドを無効にする、必須にする、必須にするなど)。 UIで情報を表示する方法が制限されます-よりシンプルなデザインに向かう傾向がありますが、スケーラブルで柔軟です。
  2. 顧客ごとにカスタムページを用意します。各ページは、ビジネスロジックと検証の観点から自分自身をサポートします。おそらく、各顧客に提供される3つまたは4つのバリアントを回避できます。
  3. 分岐。これを行う場合、高価なPITAであるため、顧客が支払うことを確認してください。

これがどのタイプのアプリケーションなのかわかりませんが、機能要求が競合する場合、通常は各クライアントのバージョンを分岐させ、各分岐に関連するコードのみを含めます。

何らかのタイプのコード管理/バージョン管理システムを使用していますか? SVNは私たちが使用するものであり、メインコードに変更を加えると各ブランチを更新できるため、コードが古くなることはありません。

MS Access内のFORMS作成画面と同様の操作を行い、顧客が自分で入力を追加/削除/変更および設定できるようにします。また、必須フィールドと必須フィールドを設定することもできます。フロントエンドではより多くの作業が必要ですが、バックではより少ない作業です。

何らかのプラグインシステムを使用することをお勧めします。顧客ごとに、アプリケーションのUIを変更して起動時にロードするプラグインを作成するだけです。私はJavaプログラマーではないため、特定のコードスニペットを投稿することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top