2017-04-07 7 views
0

オブジェクト指向の設計を捨てようとしています。問題を見つけました。私は奇妙な発見をしています。データ。タイムスケールで表現されたさまざまなタイプのデータのJavaデータ構造の設計

私は次のようにアクセスがデータを提供していAPI:

<pair_name> = pair name 
    a = ask array(<price>, <whole lot volume>, <lot volume>), 
    b = bid array(<price>, <whole lot volume>, <lot volume>), 
    c = last trade closed array(<price>, <lot volume>), 
    v = volume array(<today>, <last 24 hours>), 
    p = volume weighted average price array(<today>, <last 24 hours>), 
    t = number of trades array(<today>, <last 24 hours>), 
    l = low array(<today>, <last 24 hours>), 
    h = high array(<today>, <last 24 hours>), 
    o = today's opening price 

ソース:https://www.kraken.com/help/api#get-tradable-pairs

ビット、私はどのように処理するかワークアウトトラブルを抱えているがarray(<today>, <last 24 hours>)ビットです。私はこれに合った構造をそれぞれに収めたいと思っています。 Volume、TotalTrades、HighLowオブジェクト(またはそれに類するもの)に分割しますが、今日/過去24時間のタイプは異なります(時にはint時にはdouble)。

私はこのどちらか試してみようと思いました:

public abstract class DayTimeFrameData { 
    protected Object today; 
    protected Object lastTwentyFourHours; 
} 

またはこのような何か:

public interface DayTimeFrameData { 
    Object today = null; 
    Object lastTwentyFourHours = null; 
} 

次に、各データ・タイプのものの一つを実装/拡張を。しかし、私はこれらが全く意味をなしているとは確信していません。

誰かが私にこのようなものを構造化する方法についてのいくつかの指針を提供できますか?

+0

説明しているのはAPIではなく、一連のデータです。 APIは、データユーザーによって駆動されます。 IOW、オブジェクト指向設計では、データの使用方法を検討する必要があります。 – Arkadiy

+0

Ha、ok私はその区別をしていませんでした。私が得たページのタイトルは「API:APIについて学んでください」でした。どのように使用できるかについては、今日と過去24時間の間にすべてのデータを切り替えるボタンが必要な場合があります。私はそれを工学上問題ないです、これはOOPの私の理解のためのものです。 – Sarcoma

+0

Aha!そして、最初に気になるのは 'interface AccumulatedData'と' interface AccumulaedDataSource {AccumulatedData getDataFor(PeriodType period);} 'の行に沿ったものです。その後、あなたは 'AccumulatedData'の周りを見ることができます。 – Arkadiy

答えて

1

インターフェイスではメソッドが指定されますが、フィールドは指定されないため、その方法は使用できません。ダブルも整数を表すことができるので

public class DayTimeFrameData { 
    protected double today; 
    protected double lastTwentyFourHours; 
} 

:あなたはこのようなものを使用することができます。次に、このタイプのオブジェクトをフィールドとして使用します。

public class PairInfo { 
    protected DayTimeFrameData volume; 
    protected DayTimeFrameData numberOfTrades; 
    protected DayTimeFrameData low; 
} 

これらのそれぞれが独自の具体的な方法を必要とする場合は、あなたは確かにDayTimeFrameDataが抽象的にし、それぞれのタイプのためにそれを延長することができます。たとえば、次のように

public class NumberOfTrades extends DayTimeFrameData { 
    /* methods and fields specific to NumberOfTrades */ 
} 

あなたが特定の実装のために特別ダブルまたは整数フィールドの種類を制限したい場合は、ジェネリックを使用することができます

public abstract class DayTimeFrameData<T extends Number, L extends Number> { 
    protected T today; 
    protected L lastTwentyFourHours; 
} 

実装することができます許可されるタイプを指定します。

public class NumberOfTrades extends DayTimeFrameData<Integer, Double> { 
    /* methods and fields specific to NumberOfTrades */ 
} 
today

上記値は整数であり、lastTwentyFourHours値ダブルされた状態になります。両方が常に同じ型である必要がある場合は、DayTimeFrameDataの1つの型パラメータで取得できます。この場合、プリミティブ型(double、int)の代わりにラッパー型(Double、Integer)を使用する必要があることに注意してください。

+0

変数タイプの最後の要約は、まさに私が探しているものです。ありがとうございます。 – Sarcoma

+0

私はジェネリックスを調べる必要があることをもっと知るために、私は考えているのですか? @Sarcoma確かに。 – Sarcoma

+0

次のトピックに関するJavaチュートリアルを確認してください。https://docs.oracle.com/javase/tutorial/java/generics/また、ここで関連する質問を調べてください。 –

関連する問題