最初の質問: アロー アンチ パターンは Scala で物事を行う方法ですか?
Java から Scala に移行してから約 3 か月が経ちました。アンチ アロー パターンが Scala の標準になっていることがわかり始めています。
たとえば、Java では、できるだけ早くメソッドから戻るのが好きです。私たちは多くの内側の入れ子が好きではありません。それらがたくさんある場合、それはアロー アンチ パターンと呼ばれます。ここでそれについて読むことができます: http://c2.com/cgi/wiki?ArrowAntiPattern
Java の例:
boolean isValid(String input){
if (input.trim().length() <1) return false //return early
if (input.substring(0,3).equals("sth")) return false;
//do some more checks for validity then return true
return true
}
これを Scala で記述した場合、多くのインデントが発生する match-case ステートメントを使用する必要があります。これは、Scala の入れ子とインデントのみを伝えようとするダミーの例にすぎないことに注意してください。
def isValid(input:String): Boolean = {
(input.trim.length < 1) match {
case true =>
input.substring(0,3) match {
case sthCase if(sthCase=="sth") =>
//do some more checks etc
//eventually arrive at the "true" branch
... case valid => true
case sthElse if (sthCase=="bla") => //some more code etc
case _ => false
}
case _ => false
}
}
この例は、Java の例と同じように記述できることはわかっていますが、true または false を返す代わりに、その値を変数に代入したい場合、つまりval valid = (input.trim.length < 1) match ...
、これが唯一の方法です。 val に再割り当てします。var
の代わりに使用することもできますval
が、Scala の代わりに Java を使用することになります。
質問、繰り返し:
質問は、矢印のアンチ パターンは Scala で何かを行う方法なのか、それとも何か不足しているのかということです。私が今書いたことを Scala で行うためのより良い方法はありますか (match ステートメントの結果をval
変数に割り当てたいことに注意してください)。