2011-10-17 7 views
0

私は粒子輸送コードを書いています。このコードでは、物理オブジェクトはインタフェースVolumeを実装しています。 Volumeの実装者の一人は、このコードの対象となるのはParticleクラスです。私の設計では、ボリュームには他のボリュームが含まれています。これは、Particlesが相互作用を持つボリュームを介して監視されていない飛行したい限り、素晴らしい動作をします。実行時のJavaでオブジェクトのタイプを判別する必要があります。デザインが悪いですか?

しかし、パーティクルに関する情報を記録する、ある種のパーティクル検出器のボリュームを実装したいと思う瞬間、私は問題があります。ボリュームインタフェースには、パーティクルに固有の情報を取得する方法はありません。パーティクルが検出器のボリュームに入る場合、ボリュームからパーティクルにキャストする前に、パーティクルのメソッドを呼び出す前に、そのタイプを反射で確認する必要があります。一般的に(私が見たものから)、このタイプのものには「悪いデザイン」のラベルが付いています。

VolumeインターフェイスのVolume境界を越えてパーティクルだけが交差するようにすることができます(特殊ケースのパーティクルへのインターフェイスを結びます)が、私のコードにその制限を課すことは本当にありません。ボリュームを移動して後で参加できるようにすることができます。

この音は悪いデザインのようですか?この問題を処理する別の明白な方法はありますか?必要に応じてコードを添付しますが、一般的な問題は私の詳細とは独立しているように見えます(そして、言語にはまったく依存しません)。

ありがとうございます。私は本当にここにすべての知識をありがとう。

答えて

1

私が読んだところでは、動的なキャスティングはJavaではひどいとは見なされません。シンプルな型チェックは、完全なReflection APIを使用するよりはるかに極端ではありません。

キャストする前に、動的キャストを試みて可能な限りClassCastExceptionをキャッチするか、isinstance Particleチェックを行うかのいずれかを行うことができます。

概念的には、パーティクルが、パーティクルディテクタが記録したい情報を持っていることを示すインターフェイスを実装する方が意味があります。あなたのデザインについてもっと知らないと、私たちは言うことができません。

+0

私はボリュームが世界に何か他のボリュームがあることを知りたくないので、私は特別なインターフェースを作りたくありませんでした。 – user487100

1

パーティクルのような音は実際にはボリュームではありません。ボリュームには他のボリュームが含まれている可能性があります。これはLiskov Subsitiution Principleに違反しています。パーティクルをVolumesインターフェイスから継承せず、代わりに他のものから継承することを検討する必要があります。

+0

これは私の最大の問題を解決するわけではありませんが、おそらく正しいでしょう。 – user487100

+0

さて、一日の終わりに、それはちょうどボリュームではない粒子のように聞こえる。その知識に武装して、あなたは前進できるはずです。 –

+0

しかし、「コンテナ」という概念を「コンテナ」から分離することは、それがボリュームに追加されたときにパーティクルの特殊なプロパティを公開することはありません。論理的には、コンテナにコンテナを追加したほうが理にかなっています。 – user487100

0

リファレンスに格納されている可能性があるすべての型を制御できない場合や、型の一部に他の型がない機能がある場合は、最も実用的な方法は、オブジェクトが所望のインタフェースを実装しているかどうかをチェックし、オブジェクトがあればそれをキャストします。しかし、型を制御できれば、他のアプローチが良いかもしれません。

たとえば、アプリケーションに、そのアプリケーションに固有の共通基本タイプからすべて継承したオブジェクトのコレクションがあり、何かが発生したときに新しいオブジェクトタイプを通知する必要がある場合、そのようなアプリケーションにすべてのオブジェクトをループさせ、インタフェースを実装するものに通知を送信させますが、基底型にno-nothingの「通知」メソッドを追加して、その型のすべてのオブジェクトに対してそのメソッドを呼び出すこともできますコレクション。通知が必要かどうかをテストする方法(アプリケーションに、そのような通知を必要とするオブジェクトのみを含むコレクションを保持するオプションを許可する)もありますが、多くの場合do-nothingメソッドを呼び出す方が簡単であり、メソッドを呼び出す必要があるかどうかをテストするよりも効率的です。

関連する問題