Question

J'ai un objet de valeur, qui stocke les informations pour le montant exemple. Le getter getAmount () retourne montant en cents. Cependant, dans divers endroits, nous devons obtenir le montant en dollars. Il y a 2 approches que je peux penser à:

  1. écrire une méthode de conversion et le placer dans une classe utilitaire.
  2. ajouter un getter getAmountInDollar () dans l'objet de valeur.

Je préfère la deuxième approche. Qu'est-ce que tu penses? Quels sont les avantages et les inconvénients des deux approches?

Était-ce utile?

La solution

C'est un peu une question de goût. Mais, à mon avis, si cette information est sans rapport avec le modèle en question, alors je préfère la première approche. Il garde le modèle propre et l'autre avantage est qu'il est pour reuseable toutes les autres valeurs de ce genre. Il serait beaucoup plus agréable et si vous faites la monnaie de type un autre argument de cette méthode d'utilité, de cette façon, il est encore plus flexible. Astuce:. NumberFormat

Autres conseils

Je pense qu'il pourrait être préférable de généraliser getter avec une surcharge qui indique quelles unités, donc je pourrais appeler getAmount() pour obtenir la valeur par défaut, mais getAmount(Units.Dollar) ou getAmount(Units.Euro) seraient également disponibles sans avoir à créer un nouveau getter dans toutes les monnaies possibles conversion.

Bien sûr, cela se généralise encore plus loin pour que vous puissiez avoir une valeur de température enregistrée en interne dans Kelvins, mais pourrait permettre getAmount(Units.Celsius) ou getAmount(Units.Rankine) pour obtenir la température dans d'autres échelles.

Pour être honnête, je suis aux prises avec cela parce que je pense que l'argent devrait être représenté toujours comme une décimale, utilisée comme un nombre décimal en interne, puis formaté au besoin sur la sortie. Donc, je serais probablement traiter la question dollar / cents dans le formatter de sortie.

Si je devais gérer les conversions à d'autres unités monétaires, alors je créer une classe d'argent et le retourner comme cela avec la classe d'argent contenant la quantité et l'information unité (et probablement une connexion à un service à utiliser pour les conversions au besoin).

Je préfère garder l'API publique d'une classe assez concentré. Une fois que vous commencez à ajouter des méthodes à ce qui ne font pas partie du « noyau », vous courez le risque d'avoir une bête très complexe. Dans le cas d'une classe qui tient à peu près juste des données, je s'efforcer de garder cette façon.

A la fin il n'y a pas de coupe claire « meilleure » réponse ... il va juste en fonction de votre expérience personnelle. Le mien dit une fois que vous commencez à « polluer » l'API, il est difficile d'arrêter, et finalement vous avez besoin de briser la classe jusqu'à toute façon.

La classe utilitaire vous donne également un endroit pour mettre les autres associés, mais pas tout à fait, les méthodes que vous trouverez sans doute au fil du temps.

Si votre objectif est de réduire le nombre de classes, je dirais pas. Si vous pensez que ayant la méthode dans la classe rend le code plus « propre » que de le faire de cette façon.

Parce que l'encapsulation est sur les données et le comportement dans un scénario « boîte noire », je préfère le second, pour la persuasion orientée objet.

J'aime l'option 1, donc il peut être utilisé sur une valeur qui peut être en cents, et pas seulement ce champ spécifique dans cette classe spécifique. Il laisse la possibilité d'utiliser ailleurs dans votre code sans duplication de code.

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