2012-03-17 7 views
2

効率的なプログラムの作成方法に関する一般的な質問があります。たとえば、Blackberryのユニットコンバータプログラム(究極ユニットコンバータ)を作成しました。これは、5〜7の異なるユニット間を変換します。これをコード化するために、私はすべての可能なユニットのためのメソッドを作成するだけで大​​胆なやり方をしました。例えば、センチメートルからセンチメートル、センチメートルからメートル、センチメートルからセンチメートル、センチメートルからセンチメートル、メートルからインチのすべてのメソッドを作成しました。効率的な通貨/ユニットコンバータを作成するには?

私の質問です:これをより効率的にコーディングする方法はありますか?ユニットに追加する必要があるときに痛みを感じるので、別のメソッドセットを作成する必要があるためです。

ありがとうございました!

答えて

4

シンプル:abに変換するために、ただ一つの「標準」ユニットを選択し、それにして、それからの変換(SI単位を言うことができます)。 たとえば、「インチからメートル」、「メートルからインチ」、「センチメートルからメートル」、「メートルからセンチメートル」などにします。インチからセンチメートルに変換するには、単に「インチをメートルに変換」し、次に「メートル〜センチメートル "。

新しいユニットを追加するには、「NewUnit to meters」と「meters to NewUnit」の2つのメソッドを追加するだけです。

もちろん、あなたの方法を整理する方法はあなた次第です。たとえば、単位を引数として取る1つのメソッドを持つことができます。

3

SI単位を使用してください(いずれも使用できますが、ほとんどの単位は最も合理的なSI単位で定義されているため)。

このように、ユニットごとに1つの値を保存するだけで、ユニットAからBに変換することができます。 O(N^2)ではなくO(N)です。これは単純なアプローチです。また、これはenumと単なる関数を使って簡単に行うことができます。ユニット数を増やすということは、ユニットを列挙型に追加することと、(1!)正しい変換係数を追加することを意味します。

+0

[OK]をありがとう。わかりました。私はこの効率的なやり方を使って通貨変換を行います。 – sameetandpotatoes

1

はいあります。測定のすべてのタイプ(例えば、距離、時間、エネルギー、お金、等)について

  • ベースユニットを定義します。 SIが適用される場合、私はそれを提案します。それ以外の場合は、必要なものを選択します。サポートされているすべてのユニットについては
  • 、二つの方法(OOスタイルで書かれたが、しかし何もすることができます)にするユニットのすべての変換のために
    1. base to_base_unit()
    2. from_base_unit(base)
  • 、2段階の変換を行います。例えば。 b.from_base_unit(a.to_base_unit())
0

最も簡単な方法は、「ベースユニット」を決定することです。長さはmetersとしましょう。

メーターとメーターの間で変換する方法をall-to-allではなくx => meters => yに変換すると、x => yに変換できます。

もちろん、各単位の変換係数をメートルに保存するだけで、2つ以上の関数を作成する必要はありません。 to_metersおよびfrom_meters。

0

ホイールを改造しないでください。 JSR 275は、この問題を解決するために目標とされてきた、とJScienceプロジェクトはJSRことを実装しています

Amount<Length> lengthInCm = Amount.valueOf(5, SI.CENTIMETER); 
Amount<Length> lengthInInches = lengthInCm.to(NonSI.INCH); // conversion 

long inches = lenghtInCm.longValue(NonSI.INCH); // unboxing and conversion 
long meters = lenghtInCm.longValue(SI.METER); // unboxing and conversion 
関連する問題