Quelle est la meilleure pratique en matière d'instructions de branche dans scala?

Disons que j'ai ce code:

val initial  = Something(...)
val afterOp1 = initial.op1()
val afterOp2 = afterOp1.op2()
val result   = afterOp2.op3()

Mais maintenant, il y a deux options pour op2: op2a, op2b

Je peux facilement écrire le code avec var:

val initial  = Something(...)
val afterOp1 = initial.op1()
var afterOp2 = Nil
if (useA) {
  afterOp2 = afterOp1.op2a()
} else {
  afterOp2 = afterOp1.op2b()
}
val result = afterOp2.op3()

Mais alors je perds l'immuabilité. Une autre solution sans vars est

val initial  = Something(...)
val afterOp1 = initial.op1()
var afterOp2 = Nil
if (useA) {
  val afterOp2 = afterOp1.op2a()
  val result   = afterOp2.op3()
} else {
  val afterOp2 = afterOp1.op2b()
  val result   = afterOp2.op3()
}

Mais ce n'est évidemment pas souhaitable car je dois répéter le code.

Quelle est la meilleure pratique ici? J'ai le sentiment d'oublier quelque chose de simple

1
Dotan 30 avril 2017 à 14:31

3 réponses

Meilleure réponse

Une belle propriété de if-else dans Scala est qu'il s'agit d'une expression, il renvoie une valeur.

En supposant que op2a et op2b donnent le même type, la chose la plus simple que vous puissiez faire est:

val initial  = Something(...)
val afterOp1 = initial.op1()
val afterOp2 = if (useA) afterOp1.op2a() else afterOp1.op2b()
val result = afterOp2.op3()
5
Yuval Itzchakov 30 avril 2017 à 13:02

Une autre façon serait d'utiliser la correspondance de modèles:

val afterOp2 = useCase match {
  case useA => afterOp1.op2a()
  case useB => afterOp1.op2b()
}

De cette façon, vous pouvez prendre en charge plus de deux cas d'utilisation.

2
summerbulb 30 avril 2017 à 13:13

Je ne sais pas exactement ce que vous voulez réaliser, mais vous pouvez traiter l'ensemble de l'expression if comme suit:

val afterOp2 = if (useA) {
  afterOp2 = afterOp1.op2a()
} else {
  afterOp2 = afterOp1.op2b()
}

Si vous parlez d'avenir et de succès / échecs, il existe des options plus élégantes

0
Arnon Rotem-Gal-Oz 30 avril 2017 à 11:36