Один очевидный из них - не использовать преимущества вложенной области видимости, которую допускает scala, плюс задержка побочных эффектов (или осознание того, что все в scala является выражением):
public InputStream foo(int i) {
final String s = String.valueOf(i);
boolean b = s.length() > 3;
File dir;
if (b) {
dir = new File("C:/tmp");
} else {
dir = new File("/tmp");
}
if (!dir.exists()) dir.mkdirs();
return new FileInputStream(new File(dir, "hello.txt"));
}
Может быть преобразованоas:
def foo(i : Int) : InputStream = {
val s = i.toString
val b = s.length > 3
val dir =
if (b) {
new File("C:/tmp")
} else {
new File("/tmp")
}
if (!dir.exists) dir.mkdirs()
new FileInputStream(new File(dir, "hello.txt"))
}
Но это можно улучшить намного.Это может быть:
def foo(i : Int) = {
def dir = {
def ensuring(d : File) = { if (!d.exists) require(d.mkdirs); d }
def b = {
def s = i.toString
s.length > 3
}
ensuring(new File(if (b) "C:/tmp" else "/tmp"));
}
new FileInputStream(dir, "hello.txt")
}
Последний пример не «экспортирует» никакую переменную за пределы области действия, которая ему необходима.Фактически, он не объявляет никаких переменных вообще .Это означает, что рефакторинг легче выполнить позже.Конечно, этот подход действительно приводит к огромному раздутию файлов классов!