Constantes ou variables de classe dans ruby?
je programmais à Ruby depuis quelques mois maintenant, et je me demande quand il est approprié d'utiliser les constantes sur les variables de classe et vice versa. (Je travaille dans les Rails, je pense aux constantes dans les modèles).
class Category
TYPES = %w(listing event business).freeze
end
ou
class Category
@@types = %w(listing event business).freeze
cattr_reader :types
end
existe t-il des circonstances où l'un est préférable à l'autre? Ou est-ce juste une question de goût/style?
5 réponses
l'essentiel est qu'en utilisant la notation constante, vous le faites comprendre au lecteur. le cas inférieur, chaîne gelée donne l'impression est pourrait être réglable, forçant quelqu'un à revenir en arrière et lire le RDoc.
si ce sont vraiment des valeurs constantes que vous définissez dans le code source et que vous ne voulez pas changer pendant l'exécution du code, alors je recommande d'utiliser constant.
si vous prévoyez de définir et/ou de modifier ces valeurs de manière dynamique pendant l'exécution, utilisez la variable de classe avec getters et setters.
en gros, vous pouvez le mettre comme ceci: si vous voulez quelque chose qui est constant, utilisez une constante. Si vous voulez quelque chose qui est variable, utilisez une variable. Il semble que votre liste de types sont des constantes, car c'est une gelée de tableau, donc je dirais que c'est logique d'utiliser une constante dans ce cas.
si vous ne voulez pas que la valeur change pendant l'exécution de votre programme, et vous êtes à l'aise de permettre l'accès à la valeur en dehors de votre classe, utilisez une constante.
Sinon, vous pouvez utiliser une variable de classe. Cependant, sachez que les variables de classe sont partagées entre les sous-classes et les instances de sous-classes. Donc, si vous pouvez à un moment donné dans le futur mettre en œuvre une classe d'enfant, vous devez être très prudent sur votre utilisation des variables de classe.
référez-vous aux réponses ici pour plus sur ce: variables de classe dans Ruby
si vous voulez rendre votre vie privée constante, vous pouvez toujours faire:
FOO = 18
private_constant :FOO