Convenzione di denominazione per le costanti di Scala?


97

Qual è la convenzione di denominazione per le costanti Scala? Una breve ricerca sui suggerimenti StackOverflow maiuscolo CamelCase (la prima riga sotto), ma volevo ricontrollare.

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

Qual è lo stile Scala consigliato?


2
Quando deve essere utilizzato come una costante in stile C / Java convenzionale e completamente predefinita, la prima. La seconda forma, e il trattino basso nei nomi in generale, non viene mai utilizzata realmente. Il terzo è generalmente utilizzato per i valori immutabili che vengono generati dinamicamente.
Destin

3
Sto usando il secondo, ma principalmente per esperienza Java precedente. Ignorare questo, penso che il modo più ufficiale sia il primo (poiché è usato nella stessa scala lib, ad esempio guarda π che è definito come Pi).
om-nom-nom

Risposte:


127

Lo stile ufficialmente raccomandato (e intendo ufficialmente) è il primo stile, le maiuscole con la prima lettera del cammello. È stabilito chiaramente da Odersky su Programming in Scala.

Lo stile è seguito anche dalla libreria standard e ha un supporto nella semantica del linguaggio: gli identificatori che iniziano con le maiuscole sono trattati come costanti nella corrispondenza dei modelli.

(Sezione 6.10, p. 107 nella seconda edizione)


1
Guardando le linee guida di denominazione ufficiali di Scala, la variante 3 è in effetti lo stile consigliato: docs.scala-lang.org/style/…
Matthias

4
@ Matthias Quello non copre le costanti. Una svista terribile, ma, credetemi, non solo non è corretto, ma il terzo stile causerà problemi , non appena lo userete su un pattern match.
Daniel C. Sobral

1
@ Matthias ho ora aperto un problema al riguardo. Normalmente farei la correzione e la PR, ma purtroppo mi manca il tempo in questi giorni. :(
Daniel C. Sobral,

1
@samthebest Non-sense. Ha perfettamente senso nei tratti, e anche nell'ambito delle funzioni ha senso se lo userai per il pattern matching.
Daniel C. Sobral

1
Ho usato scalastyle per verificare la presenza di violazioni di stile nel mio codice. Ma non sembra catturare questi errori di convenzione di denominazione per le costanti. C'è un modo per abilitare un controllo che assicuri che le costanti siano nominate in caso di cammello con la prima lettera maiuscola?
jithinpt

43

(Questo è un commento aggiuntivo alla risposta di Daniel, ma lo sto pubblicando come risposta a vantaggio dell'evidenziazione e della formattazione della sintassi.)

Il punto di vista di Daniel sullo stile di usare una lettera maiuscola iniziale che è importante nella semantica del linguaggio è più sottile e importante di quanto inizialmente gli ho dato credito quando ho imparato Scala.

Considera il codice seguente:

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 mi sarei aspettato che arrivasse a tutti i casi della partita. Invece stampa:

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

Quello che sta succedendo è che case Some(lowerConst)ombreggia il val lowerConste crea una variabile locale con lo stesso nome che verrà popolata ogni volta Someche viene valutato un contenente una stringa.

Ci sono certamente modi per aggirare il problema, ma il più semplice è seguire la guida allo stile per la denominazione costante.

Se non puoi seguire la convenzione di denominazione, come sottolinea @reggoodwin nei commenti qui sotto, puoi inserire il nome della variabile in segni di spunta, in questo modo

case Some(`lowerConst`) => println("lower!")

1
In aggiunta alla risposta di Leif: questo scenario è menzionato in Programmazione in Scala 15.2. Se non c'è altra scelta se non quella di utilizzare una costante che inizia con una minuscola, può essere evitata con i segni di spunta indietro, ad esempio case `pi` => ....
reggoodwin

1
se case Some (lowerConst) ombreggia la val lowerConst, perché mai case Some (UpperConst) ombreggia la val UpperConst?
Adrian

@Leif Wickland @Daniel C. Sobral Il valore delle costanti è importante per la convenzione del pattern matching? ad esempio, val UpperConst = "UPPER_CONST"va bene o dovrebbe essereval UpperConst = "UpperConst"
nir

7

I nomi delle costanti dovrebbero essere in maiuscolo. Cioè, se il membro è definitivo, immutabile e appartiene a un oggetto pacchetto oa un oggetto , può essere considerato una costante .... Il metodo, il valore e i nomi delle variabili dovrebbero essere in minuscolo cammello

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


Il valore delle costanti è importante per la convenzione del pattern matching? ad esempio val UpperConst = "UPPER_CONST"come parte in stile java va bene o dovrebbe essereval UpperConst = "UpperConst"
nir
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.