web-dev-qa-db-ja.com

実行時にパラメータとリターンタイプを比較するにはどうすればよいですか?

いくつかのデータを処理する必要があるJavaアプリケーションがあります。データはフォーマットAで始まります。

このアプリケーションは、それぞれがデータを処理できる多数のモジュールで構成されています。ただし、すべてのモジュールが入力および出力と同じ種類のデータをサポートしているわけではありません。モジュール1はフォーマットAのデータを受け取り、フォーマットBで出力します。モジュール2はフォーマットBのデータを受け取り、フォーマットCで出力します。モジュール3はフォーマットAまたはフォーマットCのデータを受け取り、フォーマットBを出力します。別のモジュールはBまたはCを受け取ります。データを受け取ったのと同じ形式を返します。以下同様に、アイデアが得られます。

そして、この状況がまだ十分に悪くないかのように、多くのモジュールがあり、それぞれが独自の入力形式と出力形式を持っています。一致するものと一致しないものがあります。モジュールは任意の順序で実行でき、その順序はユーザーによって提供されます実行時

モジュールがすべての入力と出力が一致する順序になっていることを確認する必要があります。どうすればそれを達成できますか?これを解決する、私が知らないデザインパターンはありますか?

基本的に、モジュールの入出力形式を取得し、それを別の形式と比較し、場合によっては、私が理解したタイプにオブジェクトをキャストする方法が必要です。

リフレクションを介してパラメーターと戻り値の型を取得するなど、いくつかのアイデアがありましたが、一部のデータ形式には、コンパイル時に消去されるネストされたジェネリックが含まれます。そして、私が思いついた他のことは、それらを適用した場合、実行時にどのタイプにキャストするかをおそらく理解しなければならないという事実を回避できませんでした。

任意の考えや方向性をいただければ幸いです。

1
Namnodorel

A、B、およびCは異なるタイプである必要があります。そうすれば、渡されるタイプによって、どのフォーマットを使用しているかがわかります。リフレクションやジェネリックス、またはあらゆる種類のランタイムチェックは必要ありません。異なる型を取得するために、異なるシグネチャを持つ個別の関数があるだけです。特定の型をモジュールに渡そうとしても、コードはコンパイルされません。それをサポートしていません。

これがうまくいかない特定の理由がある場合は、代替案を決定するために、おそらくあなたの詳細についてのより多くの情報が必要になるでしょう。

1
Sean Burton

まず、Javaの静的型システムが実際に機能していない場合は、すべてをオブジェクトとして扱うだけでオフにできると言いたいです。

その核のオプションからあなたに話すことができれば、aToB()がAを取り、Bを返すことを静的に知ることは、最初のモジュールがAに​​なることを知ることと同じではないことを指摘したいと思います。 。彼らがaToB()を呼び出す場合、Aのようなものに取り組んでいる方がよいことを知っています。すべてのaToB()が作業方法を知っているので、これは理にかなっています。

モジュールは任意の順序で実行でき、その順序は実行時にユーザーによって提供されます。

エラーを引き起こさずにはいられません。ここで私が理解したい大きなことは、ユーザーがこの注文をどのように入力しているかです。注文がデータの知識なしで作成された場合、それは壊れるか、壊れないかのどちらかです。データがわかっている実行時に注文が作成される場合は、無効な操作をクリックする前にグレー表示することで、ユーザー入力を指示できます。

これを実現する非常にクリーンな設計は、あらゆる種類のデータに有効な操作のリストを提供させることです。このデザインパターンに付けた名前は「オブジェクト」です。

1
candied_orange

取り組むべき最初の問題はフォーマットの変換です。フォーマットペアXとYごとに、フォーマットXをフォーマットYに変換するメソッドが必要です。

2番目の問題は、各モジュールNについて、その入力形式と出力形式が何であるかを見つけることです。

次に、一連のモジュール_(1, 2, 3, 4)_を取得し、各モジュール間にマッピング関数を挿入するという簡単なタスク:_(1(A=>B), M(B=>B), 2(B=>C), M(C=>D), 3(D=>A), M(A=>E), 4(E=>B))_。表記M(A=>B)は、フォーマットAを取り、フォーマットBを出力するマッピング関数を意味します。

モジュール_3_がフォーマットCまたはフォーマットDをとることができる場合は、マッピング関数を挿入する必要がない場合があります。

0
BobDalgleish