Scala是高层级的
程序员总是在和复杂性纠缠。为了高产出的编程,你必须明白你工作的代码。过度复杂的代码成了很多软件工程崩溃的原因。不幸的是,重要的软件往往有复杂的需求。这种复杂性不可避免;必须(由不受控)转为受控。
Scala可以通过让你提升你设计和使用的接口的抽象级别来帮助你管理复杂性。例如,假设你有一个String变量name,你想弄清楚是否String包含一个大写字符。在Java里,你或许这么写:
boolean nameHasUpperCase = false;
for (int i = 0; i < name.length(); ++i) {
if (Character.isUpperCase(name.charAt(i))) {
nameHasUpperCase = true;
break;
}
}
在Scala里,你可以写成:
Java代码把字串看作循环中逐字符步进的低层级实体。Scala代码把同样的字串当作能用论断:predicate查询的字符高层级序列。明显Scala代码更短并且——对训练有素的眼睛来说——比Java代码更容易懂。因此Scala代码在通盘复杂度预算上能极度地变轻。它也更少给你机会犯错。
论断,_.isUpperCase,是一个Scala里面函数式文本的例子。它描述了带一个字符参量(用下划线字符代表)的函数,并测试其是否为大写字母。
原则上,这种控制的抽象在Java中也是可能的。为此需要定义一个包含抽象功能的方法的接口。例如,如果你想支持对字串的查询,就应引入一个只有一个方法hasProperty的接口CharacterProperty:
interface CharacterProperty {
boolean hasProperty(char ch);
}
然后你可以在Java里用这个接口格式一个方法exists:它带一个字串和一个
CharacterProperty并返回真如果字串中有某个字符符合属性。然后你可以这样调用exists:
exists(name, new CharacterProperty {
boolean hasProperty(char ch) {
return Character.isUpperCase(ch);
}
});
然而,所有这些真的感觉很重。重到实际上多数Java程序员都不会惹这个麻烦。他们会宁愿写个循环并漠视他们代码里复杂性的累加。另一方面,Scala里的函数式文本真地很轻量,于是就频繁被使用。随着对Scala的逐步了解,你会发现越来越多定义和使用你自己的控制抽象的机会。
你将发现这能帮助避免代码重复并因此保持你的程序简短和清晰。