Ultimamente, ho spesso finisco per scrivere codice così:Scala: meglio nidificato condizione multipla controllo
def doSomethingWithLotsOfConditions(arg1, arg2, arg3...) {
arg1.get(arg2) match {
case Some(value1) =>
arg3.get(value1) match {
case Some(value2) =>
arg4.get(arg5, value2) match {
case Some(value3) =>
finallyDoSomethingInside(value3)
case None =>
log("Some excuse for being unable to work with arg4/arg5...")
}
case None =>
log("Some excuse for being unable to work with arg3")
}
case None =>
log("Some excuse for being unable to work with arg1/arg2")
}
}
Un somewhat related question sembra sostengono pesantemente per tale uso di nidificato match
, anche se, dal mio punto di vista, difficilmente sembra leggibile, conciso o facile da capire: (1) questo tipo di suddivide il controllo stesso e le sue conseguenze, (2) rende il codice annidabile in modo incontrollabile senza alcuna vera ragione per il nidificazione. In questi casi particolari, sarei felice di strutturare il codice qualcosa in linee di:
def doSomethingWithLotsOfConditions(arg1, arg2, arg3...) {
// Step 1
val value1Opt = arg1.get(arg2)
if (value1Opt.isEmpty) {
log("Some excuse for being unable to work with arg1/arg2")
return
}
val value1 = value1Opt.get
// Step 2
val value2Opt = arg3.get(value1)
if (value2Opt.isEmpty) {
log("Some excuse for being unable to work with arg3")
return
}
val value2 = value2Opt.get
// Step 3
val value3Opt = arg4.get(arg5, value2)
if (value3Opt.isEmpty) {
log("Some excuse for being unable to work with arg4/arg5...")
return
}
val value3 = value3Opt.get
// All checked - we're free to act!
finallyDoSomethingInside(value3)
}
Tuttavia, quel modello (vale a dire valueXOpt = (...).get
=> controllare isEmpty
=>value = valueXOpt.get
) sembra davvero brutto ed è anche decisamente troppo prolisso. L'inferno, anche la versione Java apparirebbe più concisa:
Value1Type value1 = arg1.get(arg2);
if (value1 != null) {
log("Some excuse for being unable to work with arg1/arg2");
return;
}
v'è una migliore, un'alternativa più pulita, vale a dire per ottenere il valore e specificando alternativa breve percorso di fuga (che log
una linea + return
), senza andare nidificato con i fiammiferi ?
Penso che tu abbia ragione, ma non mi prendo la briga di leggerlo perché il tuo codice è tutto schiacciato su singole linee, per favore lo puoi valorizzare – samthebest
@samthebest Non potevo essere disturbato neanche io. Oh bene. –