反驳“你的编程语言能这样做吗? ”

你的编程语言能这样做吗? | 外刊IT评论

这篇文章讥笑Java是一个名词王国,其实C也是,“名词”是因为来自于领域建模,现实世界中有很多结构性名词,也就是实体,反映到软件世界的名词,DDD本身也是一种名词建模方法,结合SOA服务,名动词可以完美结合,当然函数式语言可以认为是将SOA服务动词织入语言层次的一种做法。

文中提到因为名词语言的局限,便不容易有Map/Reduce这样伟大云计算产生,这其实也有失偏颇,首先Map/Reduce分两层含义,一种是抽象层面的方法学:分与合;还有一种层面是实现执行层面,也就是算法,很多注重算法的人包括那个李开(始)复(制)一开始介绍google的Map/Reduce也是加上算法两个字,这其实盲人摸象,一管之见而已,

我们看看Map/Reduce其实在每天Java中经常碰到(抽象层面):
我们经常做下面的事情:
1.创建一个输出集合list,
2.从输入集合中遍历每个元素,再调用相应转换方法,然后把转换结果保存到另外一个输出集合中。
3.返回这个输出集合list.

这三步模式其实一种Map操作模式,使用Google Guava 的 Iterables 类 提供Map操作如下:


List<Double> exVat = Arrays.asList(new Double[] { 99., 127., 35. });
Iterable<Double> incVat = Iterables.transform(exVat, new Function<Double, Double>() {
public Double apply(Double exVat) {
return exVat * (1.196);
}
});
System.out.println(incVat); //print [118.404, 151.892, 41.86]

Reduce/Fold模式也是经常碰到:
Fold是这样一个方法someMethod(T),方法内部有一个的可变状态。 反复调用输入集合中每一个元素,直至到最后,我们得到fold操作的结果。


public double totalAmount(List<Double> amounts){
double sum = 0;
for(double amount : amounts){
sum += amount;
}
return sum;
}

这个篇文章也是一管之见,特反驳一下。我举的例子来自于:
Thinking Functional Programming with Map and Fold in your Everyday Java

名词和动词在Java中结合:
SOA(动词) + DDD(名词)

当然,名词和动词在语言中自然混合肯定是有益处的,至少能够为DCI架构实现提供便利,在DCI中,名词和动词交会结合部分应该认为是一种场景Context,名词通过角色实现动词交互,这些发生背景在Context。按照这个模型,Actor模型可能比Javascript要更加符合一些(包括考虑并发性):
U-DCI理论


[该贴被banq于2011-05-31 10:18修改过]