Son zamanlarda, sık sık böyle kod yazarken sona:Scala: Daha iyi iç içe birden koşul denetimi
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")
}
}
somewhat related question, iç içe match
böyle kullanımı için savunan ağır görünüyor A, her ne kadar benim bakış itibaren, bu okunaklı, özlü veya kolay anlaşılır gibi görünmüyor: (1) çekinin kendisinin ve sonradan ayrıldığını, (2) kodun kontrolsüz bir şekilde yuvalama için gerçek bir gerekçe olmadan iç içe geçmesini sağlar. Bu özel durumlarda, ben hatları kod şey yapılandırmak için mutluluk olacaktır: Ancak
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)
}
, o model (yani valueXOpt = (...).get
=>isEmpty
=>value = valueXOpt.get
kontrol edin) gerçekten çirkin görünüyor ve kesinlikle de çok ayrıntılı olduğunu. Cehennem, hatta Java sürümü daha özlü görünecektir:
Value1Type value1 = arg1.get(arg2);
if (value1 != null) {
log("Some excuse for being unable to work with arg1/arg2");
return;
}
maçlarla iç içe gitmeden, daha iyi, daha temiz bir alternatif, alternatif kısa kaçış yolu değerini alma ve belirtmek için yani (yani
log
bir çizgi +
return
) var mı ?
Bence haklısın ama bunu okumaktan sıkılmıyorum çünkü kodun hepsi tek bir satırda ezildi, lütfen onu güzelleştirebilirsin – samthebest
@samthebest Rahatsız edemedim. Oh iyi. –