NonPlayerCharacter エンティティに関する情報を管理するための Swing ウィンドウを設計しています。デザインは簡単に拡張できるように設計されています。エディター フォームの本体はタブ付きペイン内に含まれているため、将来の拡張モジュールでタブを追加してエディターを拡張できます。
タブ付きペインには、NPCEditorTab
インターフェイスを実装するタブを入力できます。「保存」プロセスの一部には、verifyFields()
それぞれのメソッドを呼び出すタブを循環するループが含まれ、すべてのフィールドが適切に入力されていることを確認します (慣例に従って、これを に変更する必要がありますvalidateFields()
)。すべてのタブの検証が成功すると、別のループがsaveNPC()
各タブのメソッドを呼び出し、データを NPC オブジェクトに書き込むように指示します。
私の質問は: 検証が失敗した理由をユーザーに報告できるように、各タブの検証を追跡するための最良の方法は何ですか?
2 つのオプションがあります。
1) メソッドに をスローさせValidationException
ます。
これValidationException
には、ソース タブ、不完全なフォーム フィールドとその理由に関する情報が含まれ、エディターはこれを 1 つのメッセージとしてユーザーに報告できます。コレクションで発生した例外を収集し、すべてのタブからの結果を一度に報告する前にすべての検証を完了するでしょう (ユーザーがタブ 2 からエラーを受け取るケースを防ぐために、それを修正すると、ああ、あなたも持っていますタブ 4 のエラーなど)。
ここや他の場所を読んで、フロー制御に例外を使用するのは悪い設計であるという提案があるため、このオプションの使用をためらっています。
2) メソッドがValidationResult
オブジェクトを返すようにします。
これらのValidationResult
オブジェクトは、反復ごとにコレクションに追加され、検査されます。これらには、ブール フラグ ( isValidated()
)、ソース タブを識別するソース文字列、および検証失敗の理由を説明する文字列のリストが含まれます。
いずれの場合も、検証結果は 1 回のダイアログでユーザーに報告されます。
私(独学のJava愛好家)にとっては、パフォーマンスへの影響が最も少ないように思われるため、最初のオプションに個人的に問題は見られません(オブジェクトは、障害が発生した場合にのみ生成されます。 2番目のオプションと同じように)。
私はカスタム API を開発した経験はありません (私は自分のやり方を感じ、自分で問題を処理する方法を見つけることを楽しんでいます) が、このプログラムを拡張可能に設計して、後で大規模な作業をせずに簡単に機能を追加できるようにしようとしています。既存のコードへの変更 (このプロジェクトの最初のイテレーションでこの問題に遭遇しました。新しい機能が追加されるたびに、基本コードが管理不能になるまでますます複雑になりました)。
これが、私がこの方法でフォームの検証を処理している理由です。ユーザーが個々のタブごとに一意の通知を受け取ることを望まないため、個々のタブに検証レポートを含めることには慎重です。ただし、それを行うのが最善の方法であると思われる場合は (つまり、タブの検証が失敗した場合、ユーザー自身に通知し、検証チェックを終了することJOptionPane
を返しますfalse
)、私に知らせてください。
補遺
外部からのアドバイスにより、私はマルチタブ検証スキーム全体を廃止し、代わりに、フォーカスが失われたイベントをキャプチャし、無効な入力が入力された直後にユーザーに修正を強制することで、個々のフォーム要素を検証することにしました。