valori nulli vs singleton "vuoti" per campi opzionali

4

Prima di tutto sto sviluppando un parser per un formato basato su XML per la grafica 3D chiamato XGL. Ma questa domanda può essere applicata a qualsiasi situazione in cui i campi della tua classe sono facoltativi, vale a dire che il valore di questo campo può essere mancante.

Dato che stavo seguendo un corso di Scala su coursera c'era un modello interessante quando si crea una classe astratta con tutti i metodi necessari e quindi si crea una sottoclasse normale completamente funzionale e una sottoclasse singleton "vuota" che restituisce sempre false per il metodo isEmpty e genera eccezioni per gli altri.

Quindi la mia domanda è: è meglio semplicemente assegnare null se il valore del campo opzionale è mancante o fare una gerarchia sopra descritta e assegnargli un'implementazione singleton vuota?

    
posta Uko 23.11.2012 - 10:16
fonte

2 risposte

3

Ho anche frequentato lo stesso corso di Scala e sono d'accordo con e-i-s che dovresti usare il tipo Option[T] per implementare un campo facoltativo. Ecco alcune idee in più.

Il pattern che coinvolge

  • un tratto con metodo isEmpty
  • diverse classi o oggetti che estendono il tratto
  • un oggetto unico il cui metodo isEmpty restituisce sempre true

è anche usato per implementare strutture immutabili come le liste, i flussi e così via.

Confronto:

  1. Un tipo Option[T] contenente i valori Some(t) , per ogni valore t in T e il valore aggiuntivo None .
  2. Un tipo List[T] contenente oggetti creati da due sottoclassi (e dai rispettivi costruttori) Cons[T](h: T, t: List[T]) e Nil : questi rappresentano elenchi immutabili i cui elementi hanno tipo T . Nota che qui il metodo Nil.isEmpty restituisce true.

None indica l'assenza di un valore, mentre Nil indica una lista vuota.

Quindi un valore facoltativo None è non uguale a un elenco vuoto Nil .

Nota

Se devi testare se un valore facoltativo è definito o meno puoi utilizzare il metodo isEmpty del tipo Option , o la corrispondenza del modello:

class MyClass(f: Option[String])
{
  val field = f
}

e quindi, per verificare se il campo di un'istanza obj di MyClass è definito:

if (obj.field.isEmpty)
{
}
else
{
}

o

obj.field match
{
  case Some(s) => /* do something with s */
  case None    => /* ... */
}
    
risposta data 23.11.2012 - 11:09
fonte
2

Se la tua implementazione è in Scala, è idiota usare il tipo Option[T] .

    
risposta data 23.11.2012 - 10:47
fonte

Leggi altre domande sui tag