Convention de dénomination des constantes Scala?

97

Quelle est la convention de dénomination des constantes Scala? Une brève recherche sur les suggestions de StackOverflow en majuscules CamelCase (la première ligne ci-dessous), mais je voulais revérifier.

val ThisIsAConstant = 1.23
val THIS_IS_ANOTHER_CONSTANT = 1.55
val thisIsAThirdConstant = 1.94

Quel est le style Scala recommandé?

grautur
la source
2
Lorsqu'elle doit être utilisée comme une constante de style C / Java conventionnelle et totalement prédéfinie, la première. La seconde forme - et les traits de soulignement dans les noms en général - n'est jamais vraiment utilisée. Le troisième est généralement utilisé pour les valeurs immuables qui sont générées dynamiquement.
Destin
3
J'utilise le second, mais surtout pour une expérience java antérieure. Ne tenez pas compte de cela, je pense que la manière la plus officielle est la première (puisqu'elle est utilisée dans scala lib elle-même, par exemple, regardez π qui est défini comme Pi).
om-nom-nom

Réponses:

127

Le style officiellement recommandé (et je veux dire officiellement) est le premier style, les cas de chameau avec la première lettre sont en majuscules. C'est clairement défini par Odersky sur la programmation dans Scala.

Le style est également suivi par la bibliothèque standard et a un certain support dans la sémantique du langage: les identificateurs commençant par des majuscules sont traités comme des constantes dans la correspondance de modèles.

(Section 6.10, p. 107 de la deuxième édition)

Daniel C. Sobral
la source
1
En regardant les directives officielles de dénomination Scala, la variante 3 est en fait le style recommandé: docs.scala-lang.org/style/…
Matthias
4
@Matthias Cela ne couvre pas les constantes. Un terrible oubli, mais croyez-moi, non seulement ce n'est pas correct, mais le troisième style posera des problèmes , dès que vous l'utiliserez sur une correspondance de motif.
Daniel C. Sobral
1
@Matthias J'ai maintenant ouvert un numéro à ce sujet. Normalement, je ferais le correctif et le PR, mais je manque malheureusement de temps ces jours-ci. :(
Daniel C. Sobral
1
@samthebest Non-sens. Cela a un sens parfait dans les traits, et même au niveau des fonctions, il est logique que vous l'utilisiez pour la correspondance de motifs.
Daniel C. Sobral
1
J'ai utilisé scalastyle pour vérifier les violations de style dans mon code. Mais il ne semble pas attraper ces erreurs de convention de dénomination pour les constantes. Existe-t-il un moyen d'activer une vérification qui garantit que les constantes sont nommées en cas de chameau avec la première lettre en majuscule?
jithinpt
43

(Ceci est un commentaire complémentaire à la réponse de Daniel, mais je le publie comme une réponse au profit de la mise en évidence de la syntaxe et de la mise en forme.)

L'argument de Daniel sur le fait que le style d'utilisation d'une première lettre majuscule est important dans la sémantique du langage est plus subtil et important que ce que je lui avais attribué à l'origine lorsque j'ai appris Scala.

Considérez le code suivant:

object Case {
  val lowerConst = "lower"
  val UpperConst = "UPPER"

  def main(args: Array[String]) {
    for (i <- Seq(lowerConst, UpperConst, "should mismatch.").map(Option.apply)) {
      print("Input '%s' results in: ".format(i))
      i match {
        case Some(UpperConst) => println("UPPER!!!")
        case Some(lowerConst) => println("lower!")
        case _ => println("mismatch!")
      }
    }
  }
}

Naïvement, je me serais attendu à ce que cela atteigne tous les cas du match. Au lieu de cela, il imprime:

Input 'Some(lower)' results in: lower!
Input 'Some(UPPER)' results in: UPPER!!!
Input 'Some(should mismatch.)' results in: lower!

Ce qui se passe, c'est que l' case Some(lowerConst)ombre du val lowerConstet crée une variable locale du même nom qui sera remplie à chaque fois Somequ'une chaîne contenant une chaîne est évaluée.

Il existe certes des moyens de contourner ce problème, mais le plus simple est de suivre le guide de style pour une dénomination constante.

Si vous ne pouvez pas suivre la convention de dénomination, alors comme @reggoodwin le souligne dans les commentaires ci-dessous, vous pouvez mettre le nom de la variable entre des coches, comme ceci

case Some(`lowerConst`) => println("lower!")
Leif Wickland
la source
1
Ajout à la réponse de Leif: ce scénario est mentionné dans Programmation dans Scala 15.2. S'il n'y a pas d'autre choix que d'utiliser une constante commençant par une minuscule, elle peut être échappée avec des graduations inversées, par exemple case `pi` => ....
reggoodwin
1
si case Some (lowerConst) occulte la val lowerConst, pourquoi case Some (UpperConst) n'observe-t-elle pas la val UpperConst?
Adrian
@Leif Wickland @Daniel C. Sobral La valeur des constantes est-elle importante pour des raisons de convention de correspondance de motifs? par exemple, d' val UpperConst = "UPPER_CONST"accord ou ça devrait êtreval UpperConst = "UpperConst"
nir
7

Les noms constants doivent être en majuscules de chameau. Autrement dit, si le membre est définitif, immuable et qu'il appartient à un objet de package ou à un objet , il peut être considéré comme une constante ... Les noms de méthode, de valeur et de variable doivent être en minuscules camel.

http://docs.scala-lang.org/style/naming-conventions.html#constants-values-variable-and-methods

samthebest
la source
La valeur des constantes est-elle importante pour des raisons de convention de correspondance de motifs? par exemple val UpperConst = "UPPER_CONST"comme partie java-style ok ou ça devrait êtreval UpperConst = "UpperConst"
nir