Dois-je charger les données de mon objet Java sur la construction, ou explicitement par un appel de méthode?

StackOverflow https://stackoverflow.com/questions/2419393

  •  19-09-2019
  •  | 
  •  

Question

Ceci est une question de conception. Je suis en train de décider entre 2 implémentations.

Pour bien expliquer ce que je besoin d'un exemple. Donc, pour le bien de l'exemple:

J'ai une classe qui génère un rapport sur, disons, certaines valeurs du marché boursier sur un jour précis. Je crée un objet StockMarketReportGenerator, en lui passant la date d'aujourd'hui, et il génère un rapport basé sur les valeurs du marché d'aujourd'hui.

Le StockMarketReportGenerator "a un" objet StockMarketData. Le but de l'objet StockMarketData doit contenir toutes les valeurs boursières qui sont stockées dans une table (probablement appelée :) Stockmarket) dans la base de données, et quelques autres valeurs calculées à partir des données de la table. Il a des méthodes privées qui se connectent avec la base de données, récupérer les données, effectuer les calculs nécessaires, et stocker les valeurs finales dans les variables membres de l'objet. (Il a alors des méthodes de lecture pour exposer ces valeurs, mais aucune méthode setter.) La classe StockMarketData est essentiellement un « porteur » pour les valeurs de données boursières. J'ai une fonction centrale appelée quelque chose comme « calculateStockMarketData() » qui appelle toutes ces méthodes d'assistance privée et met en place l'objet. (Je suis conscient que tout ce traitement pourrait vraiment être plus facile à manipuler par un cadre comme Hibernate;. Mais la décision a été prise de le faire manuellement comme il est un très petit projet quelque peu temporaire et ne vaut pas la configuration)

Ma question est - de ma classe ReportGenerator, je ne ai besoin l'objet StockMarketData afin d'accéder à ses propriétés / variables membres - post-traitement et post-calculs. Ce qui signifie que vraiment, je veux l'objet pré-rempli avec des données. Et donc je garde la méthode calculateStockMarketData privée et appelle automatiquement à partir du StockMarketData constructeur. Mais je me sens un peu mal à l'aise de faire tout mon traitement dans un constructeur et ne pas avoir des méthodes publiques. Est-ce un défaut de conception? Ou est-ce vraiment la façon la plus logique de le faire? Au fond, lequel des 2 implémentations suivantes est mieux?

1) (Ma mise en œuvre actuelle) Faire le secteur privé et appeler la méthode de calculateStockMarketData() centrale à partir du constructeur de la méthode de StockMarketData (en passant la date d'aujourd'hui), de sorte que chaque fois que vous avez un objet StockMarketData, il est déjà rempli. Donc, tout ce que je aurais besoin de la classe ReportGenerator avant de commencer à utiliser les propriétés de l'objet est la ligne:

StockMarketData myData = new StockMarketData(someDate);

2) Faire la méthode calculateStockMarketData() publique centrale, de sorte que pour mettre en place un objet StockMarketData vous devez appeler explicitement la méthode. Donc, de la classe ReportGenerator je code:

StockMarketData myData = new StockMarketData(someDate);
myData.calculateStockMarketData();

La première me semble que la meilleure conception, d'autant plus qu'il n'y a donc pas possibilité d'utiliser les propriétés de l'objet avant qu'ils ne soient initialisés. Mais je suis aussi incertain au sujet des normes en ce qui concerne l'exécution d'une grande partie de code d'un constructeur ... Que dois-je choisir?

Était-ce utile?

La solution

Je vais avec le numéro 2, surtout s'il y a une possibilité d'ajouter des méthodes à la classe qui ne repose pas sur ces données étant là.

Par contre, si vous considérez la classe d'être dans un état non valide sans les données peuplées, vous devriez le faire sur la construction.

Autres conseils

Martin Fowler a écrit un bon essai sur injection de dépendance (par rapport à l'injection Constructor Setter) . Son conseil est « autant que possible, de créer des objets valides au moment de la construction ».

OMI, il est préférable de construire des objets valides si possible, car il est plus facile à lire / observer le comportement du code, puisque vous pouvez supposer que les objets ont été construits correctement, et vous avez moins de bugs liés à des objets non étant rempli correctement. La question du compositeur par rapport à l'injection de constructeur est différent de ce que vous demandez au sujet mais, ce qui est une question de savoir où exécuter votre logique métier. Je pense qu'il est préférable d'utiliser le constructeur pour créer un objet valide et puis exécuter la logique métier réelle dans une autre méthode publique (votre n ° 2), de sorte que la construction de l'objet peut se produire à un autre moment que la logique métier réelle.

Je charge toujours explicitement, après la construction.

L'appel d'une base de données à partir d'un constructeur peut faire pour le débogage difficile, plus fragile, le code inflexible, et causer des problèmes de performance si votre utilisation de l'objet change.

Une bonne pratique est de ne pas exécuter beaucoup de code dans un constructeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top