J'ai remarqué des projets comme pour stocker des constantes dans leur propre fichier, c'est-à-dire que les constantes utilisées à l'échelle mondiale et dans la boucle principale du programme pourraient encombrer le fichier principal afin qu'ils cherchent peut-être qu'ils les placent ailleurs, puis le fichier/classe d'importation.
Je comprends que lors de l'écriture d'un OOP classe que vous voudriez garder toutes les constantes à l'en-tête du fichier de classe afin de pouvoir être référencées statiquement comme telles:
myCar.setColour(Colour.RED);
Où RED
est une constante de couleur dans la classe Colour
.
Ce qui est bon pratique pour avoir une grande quantité de constantes, devrait-il simplement être au sommet de votre fichier principal ou est-il de quelque manière que ce soit d'avoir peut-être une classe ProgramConstants
qui est purement statique, public et disponible pour lire?
L'idée derrière encapsulation dans la programmation orientée objet consiste à déplacer des données et le code qui l'utilise ensemble.
Il n'y a pas "mais les données sont des constantes, traitez-les spécialement." Si vous avez des couleurs, gardez-les dans une classe Color
. Java Calendar
classe a des constantes de terrain de calendrier. BigDecimal
et BigInteger
chacun contient des constantes de leur propre type.
L'idée est que les constantes de référencement impliquent leur portée: BigDecimal.ZERO
par exemple. Je sais que c'est un zéro décimal parce que j'ai tapé BigDecimal.ZERO
et pas BigInteger.ZERO
.
L'un des pires anti-modèles à cet égard est d'avoir une "interface constante" qui est honnêtement paresseuse et peu claire. Parfois, vous rencontrez une interface contenant un groupe de constantes aléatoires, ainsi que des classes implémenteront l'interface pour faciliter la référence aux constantes. Cela finit généralement par violer [~ # ~ # ~ # ~ ~ ~] et rend difficile de déterminer ce que font ces constantes.
Les constantes doivent être:
Un énumé, le cas échéant, tel que Java.math.RoundingMode
. Les Java champendar champs créés avant enum
existaient devrait être un énumé. Ceci nécessairement des scopes Les autres et garantissent que d'autres constantes ne sont pas dans le même espace de noms (champ final statique de classe).
Situé sur la classe qui définit leur type, le cas échéant. Cela couvre les nombres réutilisables sur BigDecimal
par exemple.
Situé ailleurs où des constantes sont ensemble et ne sont pas mêlées d'autres, contrairement aux constantes.
On pourrait soutenir que c'est une question d'opinion. Je pense que si vous avez demandé à un groupe d'experts de comparer E.G. BigDecimal
et une classe de constantes AWT aléatoire, nous serions un consensus qu'il existe de très mauvaises pratiques en réalité et que certaines qui rendent le code plus clair et plus facile à comprendre.