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

11-05-31 banq
         

你的编程语言能这样做吗? | 外刊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]
<p>

Reduce/Fold模式也是经常碰到:

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

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

         

5
banq
2011-05-31 09:58

这个篇文章也是一管之见,特反驳一下。我举的例子来自于:

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修改过]