Convenção de nomenclatura para constantes Scala?

97

Qual é a convenção de nomenclatura para constantes Scala? Uma breve pesquisa no StackOverflow sugere CamelCase maiúscula (a primeira linha abaixo), mas eu queria verificar novamente.

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

Qual é o estilo Scala recomendado?

Grautur
fonte
2
Quando deve ser usado como uma constante de estilo C- / Java convencional e totalmente predefinida, a primeira. A segunda forma - e sublinhados nos nomes em geral - nunca é realmente usada. O terceiro é geralmente usado para valores imutáveis ​​que são gerados dinamicamente.
Destin
3
Estou usando o segundo, mas principalmente com experiência anterior em java. Desconsidere isso, acho que a forma mais oficial é a primeira (uma vez que é usada no próprio scala lib, por exemplo, olhe para π que é definido como Pi).
om-nom-nom

Respostas:

127

O estilo oficialmente recomendado (e quero dizer oficialmente) é o primeiro estilo, a caixa do camelo com a primeira letra é maiúscula. É estabelecido claramente por Odersky em Programação em Scala.

O estilo também é seguido pela biblioteca padrão e tem algum suporte na semântica da linguagem: identificadores que começam com maiúsculas são tratados como constantes na correspondência de padrões.

(Seção 6.10, p. 107 na segunda edição)

Daniel C. Sobral
fonte
1
Olhando para as diretrizes oficiais de nomenclatura Scala, a variante 3 é de fato o estilo recomendado: docs.scala-lang.org/style/…
Matthias
4
@Matthias Isso não cobre constantes. Um descuido terrível, mas, acredite em mim, não só isso não é correto, mas o terceiro estilo causará problemas , assim que você usá-lo em uma correspondência de padrão.
Daniel C. Sobral
1
@Matthias Agora abri uma edição sobre isso. Eu normalmente faria a correção e as relações públicas, mas infelizmente estou sem tempo atualmente. :(
Daniel C. Sobral
1
@samthebest Sem sentido. Faz todo o sentido em termos de características e, mesmo no âmbito das funções, faz sentido se você for usá-lo na correspondência de padrões.
Daniel C. Sobral
1
Tenho usado o scalastyle para verificar violações de estilo em meu código. Mas não parece detectar esses erros de convenção de nomenclatura para constantes. Existe uma maneira de habilitar uma verificação que garanta que as constantes sejam nomeadas em camel case com a primeira letra maiúscula?
jithinpt de
43

(Este é um comentário adendo à resposta de Daniel, mas estou postando-o como uma resposta para o benefício de realce de sintaxe e formatação.)

O argumento de Daniel sobre o estilo de usar uma letra maiúscula inicial sendo importante na semântica da linguagem é mais sutil e importante do que originalmente dei crédito quando aprendi Scala.

Considere o seguinte 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, eu esperava que isso atingisse todas as caixas da partida. Em vez disso, imprime:

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

O que está acontecendo é que case Some(lowerConst)sombreia o val lowerConste cria uma variável local de mesmo nome que será populada sempre que um Somecontendo uma string for avaliado.

Certamente, existem maneiras de contornar isso, mas a mais simples é seguir o guia de estilo para nomenclatura constante.

Se você não pode seguir a convenção de nomenclatura, então como @reggoodwin aponta nos comentários abaixo, você pode colocar o nome da variável em ticks, assim

case Some(`lowerConst`) => println("lower!")
Leif Wickland
fonte
1
Somando-se à resposta de Leif: este cenário é mencionado em Programação no Scala 15.2. Se não houver escolha a não ser usar uma constante começando com minúsculas, então ela pode ser escapada com marcações para trás, por exemplo, case `pi` => ....
reggoodwin
1
se case Some (lowerConst) sombreie o val lowerConst, por que case Some (UpperConst) não sombreie o val UpperConst?
Adrian
@Leif Wickland @Daniel C. Sobral O valor das constantes é importante por causa da convenção de casamento de padrões? por exemplo, val UpperConst = "UPPER_CONST"tudo bem ou deveria serval UpperConst = "UpperConst"
nir
7

Nomes constantes devem estar em caixa alta de camelo. Ou seja, se o membro for final, imutável e pertencer a um objeto de pacote ou a um objeto , pode ser considerado uma constante .... Os nomes de métodos, valores e variáveis ​​devem estar em letras minúsculas

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

o melhor
fonte
O valor das constantes é importante por causa da convenção de correspondência de padrões? por exemplo, val UpperConst = "UPPER_CONST"like part java-style ok ou deveria serval UpperConst = "UpperConst"
nir