2017-04-07 1 views
0

Ich versuche, objektorientiertes Design auszusprechen und bin auf ein Problem gestoßen, das ich merkwürdig finde, und ich bin mir einer guten Strategie nicht sicher, meine zu strukturieren Daten.Java Datenstruktur Design für Daten verschiedener Typen durch Zeitskala dargestellt

Die API Ich bin Zugreifen auf Daten bestimmt:

<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 

Quelle: https://www.kraken.com/help/api#get-tradable-pairs

Das Bit Ich habe Probleme beim Ausarbeiten wie die array(<today>, <last 24 hours>) Bits zu handhaben sind. Ich hätte gerne eine Struktur, die dem entspricht, in die jeder passt. Ich würde sie in Volume, TotalTrades und HighLow-Objekte (oder so ähnlich) unterscheiden, aber der Typ für heute/letzten 24 Stunden variiert (manchmal int manchmal double).

Ich dachte, ich würde versuchen, entweder das:

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

oder etwas ähnliches:

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

Dann erstreckt/für jeden Datentyp einen von denen zu implementieren. Aber ich bin mir nicht sicher, ob diese überhaupt Sinn machen.

Kann mir jemand einige Hinweise geben, wie man etwas so strukturiert, bitte?

+0

Was Sie beschreiben, ist keine API, es ist eine Reihe von Daten. Die API würde von den Datennutzern gesteuert werden. IOW, für OO-Design müssen Sie überlegen, wie die Daten verwendet werden. – Arkadiy

+0

Ha, ok, ich habe diese Unterscheidung nicht gemacht.Der Titel der Seite, von der ich es bekommen habe, war "API: Erfahren Sie mehr über unsere API". In Bezug darauf, wie ich es verwenden könnte, möchte ich vielleicht einen Knopf, der alle Daten zwischen den heutigen und den letzten 24 Stunden wechselt. Ich habe kein Problem, es zu entwickeln, das ist mehr für mein Verständnis von OOP. – Sarcoma

+0

Aha! Dann ist das erste, was mir in den Sinn kommt, etwas in der Linie von 'interface AccumulatedData' und' interface AccumulaedDataSource {AccumulatedData getDataFor (PeriodType period);} '. Dann bauen Sie Ihre Ansicht um 'AccumulatedData' – Arkadiy

Antwort

1

Eine Schnittstelle gibt Methoden, aber keine Felder an, daher können Sie diese Methode nicht verwenden. Man könnte so etwas wie folgt verwenden:

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

seit einem Doppel kann auch eine ganze Zahl darstellen. Verwenden Sie dann einfach Objekte dieses Typs als Felder.

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

Wenn jedoch jede dieser seine eigenen spezifischen Methoden benötigt, können Sie in der Tat machen DayTimeFrameData abstrakt und erweitern sie für jeden Typ. Zum Beispiel:

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

Wenn Sie möchten die Typen der Felder beschränken, um speziell doppelt oder Integer für spezifische Implementierungen, könnten Sie verwenden Generika:

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

Eine Implementierung kann Geben Sie dann an, welche Typen zulässig sind.

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

Die oben würde sagen, dass der today Wert eine ganze Zahl ist, und der lastTwentyFourHours Wert ist ein Doppel. Wenn beide immer vom selben Typ sein müssen, können Sie mit einem Typparameter in DayTimeFrameData auskommen. Beachten Sie, dass wir in diesem Fall die Wrapper-Typen (Double, Integer) anstelle der primitiven Typen (double, int) verwenden müssen.

+0

Perfekt das letzte abstrakte mit variablen Typen ist genau das, was ich suche, vielen Dank. – Sarcoma

+0

Ich bin richtig, wenn ich nachdenke, um mehr zu erfahren, müsste ich nach Generika suchen? – Sarcoma

+0

@Sarkom In der Tat. Überprüfen Sie die Java-Tutorials zum Thema: https://docs.oracle.com/javase/tutorial/java/generics/ Und auch nach verwandten Fragen hier suchen. –

Verwandte Themen