2017-04-07 32 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,對於OO設計,您需要考慮數據將如何使用。 – Arkadiy

+0

哈,好吧,我沒有做出這樣的區分。我從中獲得的頁面標題是「API:瞭解我們的API」。就我如何使用它而言,我可能需要一個可以在今天和過去24小時之間切換所有數據的按鈕。我在工程方面沒有任何問題,這更多的是我對OOP的理解。 – Sarcoma

+0

啊哈!然後,想到的第一件事就是沿着「接口cumulativeData」和「接口AccumulaedDataSource {cumulativeData getDataFor(PeriodType週期);}」行的東西。然後建立你''Accumulate''查看' – 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上使用一個類型參數。請注意,在這種情況下,我們確實需要使用包裝類型(Double,Integer)而不是基本類型(double,int)。

+0

完美的最後一個抽象與變量類型正是我正在尋找,非常感謝。 – Sarcoma

+0

我是對的,想了解更多信息,我需要查找泛型? – Sarcoma

+0

@Sarcoma的確。查看關於此主題的Java教程:https://docs.oracle.com/javase/tutorial/java/generics/並在此處查找相關問題。 –

相關問題