2010-11-23 8 views
4

私は趣味のプロジェクトとしてアプリケーションに取り組んでいます。スキューバダイビングの減圧スキームを計算するためにJavaとシステムの一部で書かれています。 私が持っている問題は、私のダイブプランを保管するクラスにあります。うまくいけばそれほど問題はありませんが、私はそれがより良いデザインになるという気持ちがあるので、いくつかのフィードバックをお願いしたいと思います。Javaの設計の質問

私が今得意とするのは以下のとおりです。

クラスDivePlanには、DiveOperations(ArrayList<DiveOpperation>)のArrayListがあります。 DivePlanクラスには3つの機能があります。 1つは降下を計画し、1つは上昇を計画し、もう1つは同じ深さで平坦な潜水を計画する。これらの関数はすべて、DiveOpperationオブジェクトをArrayListに追加します。しかし、上昇と下降には、同じ深さにとどまるダイビングとしてのいくつかの属性があります。例えば、上昇/下降の速度(m/s)。私はフラットダイブのスピードを0に設定しましたが、それは正しいとは思いません。 DiveOpperationを拡張する別のクラスを作成する必要があることは承知していますが、配列から取り出したときにascentdescentまたはflatdiveクラスであるかどうかわかりません。

このような機能にはどのような優れた設計がありますか?

+1

これは答えることができません。あなたの一般的なアプローチがかなり良いように聞こえますが、平らな部分を0のスピードで行うことは本質的に間違っていません。 – Falmarri

+0

他人にあなたのコードを使用させ、怪我につながる誤ったダイビングプランを提出すると、法的責任を問われる可能性があります。 –

答えて

1

verticalSpeed変数を決めるのはどうですか?

値が0の場合、DiveOperationはフラットダイブを表し、正または負の値はそれぞれ上昇または下降を表しますか?

あなただけ上昇/下降速度よりも、他の性質を持っている場合、あなたはおそらく、抽象クラスにDiveOperationを回し、そして3 subclases AscentOperationDescentOperationFlatDiveOperationを作成したいです。しかし、あなたが正しく理解していれば、DiveOperationの実際のタイプがわからないので、繰り返しなどのトラブルが発生します。これは、多くのinstanceof小切手(醜い!)を使用するか、visitor pattern(はるかに良い)を使用して解決できます。この場合、おそらくDecompressionCalculatorVisitorのようなものがあり、それぞれDiveOperationを順番に訪れることができます。

visitorパターンの詳細な例については、私の答えover hereをご覧ください。

+0

それは私が今得たものですが、より良いデザインがあるのだろうかと思います。上昇と下降には、フラットダイブと同じ開始と終了の深さがあります。そして私は、さまざまな関数を使用して、さまざまなタイプに必要な圧縮解除を計算します。 –

+0

が答えを更新しました。 – aioobe

+0

訪問者のパターンはすばらしく見えます。それを調べます。 –

0

私はあなたが問題を正確に理解しているとは確信していませんが、 1.実際のタイプのDiveOperationを知る必要はないと思います。コマンドパターンを使用して、コマンドメソッドを呼び出してください。コマンドはその作業を行います。 2.タイプを知る必要がある場合は、instanceof演算子を使用してタイプを取得できます。

2

この多態的な解決策は、DiveOperationクラスをAscentOperation、DescentOperation、およびFlatOperationに拡張し、既存のArrayList型を保持することです。私はあなたがここでこれを行う必要があるかどうかは、実装がどのように単純かを考えればわかりません。

より多くの機能に対応するために複雑さを増す必要が生じた場合、より簡単にリファクタリングできる単体テストの開発に役立つでしょう。

+0

は、DescentOperationと負のAscentOperationの間に違いがありますか? – Marc

+0

の違いは、降下中に上昇がスキューバダイバーのスピード制限を有するため、昇降中および検証のために速度が負であるという違いのみです。 –

+0

地獄もし私が知っている、私はダイビングしていない!彼の質問には「継承」というタグが付いているので、論理的に判断するのではなく、操作の種類を指定するためのOOP回答を求めていると仮定しました。 –

0

拡張します。アレイから取り出して(object instanceof AscentDive)などをチェックすることで、サブクラスがどのようなサブクラス(上昇、下降、フラット)であるかを判断できます。

実行時にジェネリックが消去されることを忘れないでください。したがって、あなたが実際に定義したArrayListには、JVMの観点からは「オブジェクト」しか含まれていません。ジェネリックはコンパイル時の検証のためにそこにあります。 DiveOperationをサブクラス化してArrayList<DiveOperation>と定義すると、そのリストにサブクラスを追加できます。

関連する問題