2017-04-07 1 views
0

Je suis en train d'étudier la conception orientée objet et j'ai rencontré un problème que je trouve bizarre, et je ne suis pas sûr d'une bonne stratégie pour structurer mon Les données.Java structure de données pour les données de différents types représentés par l'échelle de temps

L'API Je suis fournit des données comme accédant suivantes:

<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 

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

Le bit que je vais avoir du mal à travailler sur la façon de gérer sont les array(<today>, <last 24 hours>) morceaux. J'aimerais avoir une structure conforme à celle dans laquelle chacun s'intègre. Je les séparerais dans les objets Volume, TotalTrades et HighLow (ou quelque chose comme ça) mais le type pour aujourd'hui/les dernières 24 heures varie (parfois int parfois double).

Je pensais que je vais essayer soit ceci:

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

ou quelque chose comme ceci:

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

Puis extension/mise en œuvre de l'un de ceux pour chaque type de données. Mais je ne suis pas sûr que cela ait du sens. Est-ce que quelqu'un peut m'offrir quelques conseils pour structurer quelque chose comme ça, s'il vous plaît?

+0

Ce que vous décrivez n'est pas une API, c'est un ensemble de données. L'API serait pilotée par les utilisateurs de données. IOW, pour la conception OO, vous devez considérer comment les données vont être utilisées. – Arkadiy

+0

Ha, ok je n'ai pas fait cette distinction.Le titre de la page que je l'ai eu était "API: En savoir plus sur notre API". En ce qui concerne la façon dont je pourrais l'utiliser, je pourrais vouloir un bouton qui permuterait toutes les données entre aujourd'hui et les dernières 24 heures. Je n'ai aucun problème à l'ingénierie, c'est plus pour ma compréhension de la POO. – Sarcoma

+0

Aha! Ensuite, la première chose qui vient à l'esprit est quelque chose le long de la ligne de 'interface AccumulatedData' et' interface AccumulaedDataSource {AccumulatedData getDataFor (Période PeriodType);} '. Puis construisez votre vue autour de 'AccumulatedData' – Arkadiy

Répondre

1

Une interface spécifie des méthodes mais pas des champs, donc vous ne pouvez pas utiliser cette approche. Vous pouvez utiliser quelque chose comme ceci:

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

depuis un double peut également représenter un entier. Ensuite, utilisez simplement des objets de ce type en tant que champs.

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

Cependant, si chacun de ces besoins spécifiques de ses propres méthodes, vous pouvez en effet faire DayTimeFrameData abstrait et l'étendre pour chaque type. Par exemple:

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

Si vous souhaitez restreindre les types de champs spécifiquement double ou entier pour les implémentations spécifiques, vous pouvez utiliser les génériques:

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

Une mise en œuvre peut puis spécifiez quels types sont autorisés.

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

Ce qui précède indiquer que la valeur today est un entier, et la valeur lastTwentyFourHours est double. Si tous les deux doivent toujours être du même type, vous pouvez vous débrouiller avec un paramètre de type sur DayTimeFrameData. Notez que nous devons utiliser les types wrapper (Double, Integer) au lieu des types primitifs (double, int) dans ce cas.

+0

Perfectionnez le dernier résumé avec les types variables est exactement ce que je cherche, merci beaucoup. – Sarcoma

+0

J'ai raison de penser, pour en savoir plus, je devrais chercher des génériques? – Sarcoma

+0

@Sarcoma En effet. Consultez les didacticiels Java sur le sujet: https://docs.oracle.com/javase/tutorial/java/generics/ Et regardez aussi les questions connexes ici. –