¿Convención de nomenclatura para las constantes de Scala?

97

¿Cuál es la convención de nomenclatura para las constantes de Scala? Una breve búsqueda en las sugerencias de StackOverflow CamelCase en mayúsculas (la primera línea a continuación), pero quería volver a verificar.

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

¿Cuál es el estilo Scala recomendado?

grautur
fuente
2
Cuando se va a utilizar como una constante convencional de estilo C / Java totalmente predefinida, la primera. La segunda forma —y los subrayados en los nombres en general— nunca se usa realmente. El tercero se usa generalmente para valores inmutables que se generan dinámicamente.
Destin
3
Estoy usando el segundo, pero principalmente para la experiencia previa de Java. Ignore eso, creo que la forma más oficial es la primera (ya que se usa en scala lib en sí, por ejemplo, mire π, que se define como Pi).
om-nom-nom

Respuestas:

127

El estilo recomendado oficialmente (y quiero decir oficialmente) es el primer estilo, el caso camel con la primera letra está en mayúsculas. Odersky lo establece claramente sobre la programación en Scala.

El estilo también es seguido por la biblioteca estándar y tiene cierto soporte en la semántica del lenguaje: los identificadores que comienzan con mayúsculas se tratan como constantes en la coincidencia de patrones.

(Sección 6.10, p. 107 de la segunda edición)

Daniel C. Sobral
fuente
1
Mirando las pautas oficiales de nomenclatura de Scala, la variante 3 es de hecho el estilo recomendado: docs.scala-lang.org/style/…
Matthias
4
@Matthias Eso no cubre las constantes. Un descuido terrible, pero créame, no solo eso no es correcto, sino que el tercer estilo causará problemas tan pronto como lo use en una coincidencia de patrones.
Daniel C. Sobral
1
@Matthias He abierto un número al respecto. Normalmente haría la reparación y las relaciones públicas, pero lamentablemente me falta tiempo estos días. :(
Daniel C. Sobral
1
@samthebest Sin sentido. Tiene mucho sentido en los rasgos, e incluso en el alcance de las funciones, tiene sentido si lo va a utilizar en la coincidencia de patrones.
Daniel C. Sobral
1
He estado usando scalastyle para verificar violaciones de estilo en mi código. Pero no parece detectar estos errores de convención de nomenclatura para constantes. ¿Hay alguna manera de habilitar una verificación que garantice que las constantes se nombran en mayúsculas y minúsculas con la primera letra en mayúscula?
jithinpt
43

(Este es un comentario de adición a la respuesta de Daniel, pero lo estoy publicando como una respuesta para el beneficio del resaltado de sintaxis y el formato).

El punto de Daniel acerca de que el estilo de usar una letra mayúscula inicial es importante en la semántica del lenguaje es más sutil e importante de lo que originalmente le di crédito cuando aprendí Scala.

Considere el siguiente código:

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!")
      }
    }
  }
}

Ingenuamente, hubiera esperado que eso llegara a todos los casos del partido. En su lugar, imprime:

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

Lo que sucede es que case Some(lowerConst)sombrea el valor lowerConsty crea una variable local con el mismo nombre que se completará cada vez Someque se evalúe un que contenga una cadena.

Es cierto que hay formas de evitarlo, pero la más simple es seguir la guía de estilo para nombrar constantemente.

Si no puede seguir la convención de nomenclatura, entonces, como @reggoodwin señala en los comentarios a continuación, puede poner el nombre de la variable en ticks, así

case Some(`lowerConst`) => println("lower!")
Leif Wickland
fuente
1
Agregando a la respuesta de Leif: este escenario se menciona en Programación en Scala 15.2. Si no hay más remedio que usar una constante que comience con minúscula, entonces se puede escapar con tics posteriores, por ejemplo, case `pi` => ....
reggoodwin
1
si case Some (lowerConst) sombrea el valor lowerConst, ¿por qué no case Some (UpperConst) sombrea el val UpperConst?
Adrian
@Leif Wickland @Daniel C. Sobral ¿Importa el valor de las constantes en aras de la convención de la coincidencia de patrones? por ejemplo, val UpperConst = "UPPER_CONST"está bien o debería serval UpperConst = "UpperConst"
nir
7

Los nombres constantes deben estar en mayúscula camel. Es decir, si el miembro es final, inmutable y pertenece a un objeto de paquete o un objeto , puede ser considerado una constante ... Los nombres de método, valor y variable deben estar en minúsculas camel

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

samthebest
fuente
¿Importa el valor de las constantes en aras de la convención de coincidencia de patrones? por ejemplo, val UpperConst = "UPPER_CONST"como parte de estilo java está bien o debería serval UpperConst = "UpperConst"
nir