随笔-341  评论-2670  文章-0  trackbacks-0
    这几天写了一个关于面向组合子编程的ppt。几个月前跟某个dev lead借了他翻译的中文版Pattern Hatching,条件是要在公司里面开一场关于设计模式的讲座。其实本来一个月前就要讲了,不过中间出了点事情,所以等到这个月才开始。因此我挑选了面向组合子编程的这个主题,做了个demo和ppt。

    面向组合子编程原本是函数式编程的内容,主要说的是既然我们可以用Composite模式(参见这里这里)来做出像树一样的数据结构,那么我们做出组合起来跟树一样的行为(譬如Command模式,用类代表行为)不也可以吗?这个做法当然是行得通的,只不过一般我们很难看到一个需求的时候,可以意识到可以用面向组合子编程来搞定这个东西。因此我在这个ppt里面就举了这样的一个例子,也就是老掉牙的Log系统了:

    我们编译器在编译代码的时候,会产生下面的文件:
    buildchk.err -- 记录着错误
    buildchk.wrn -- 记录着警告
    buildchk.log -- 记录所有详细信息和时间戳
    命令行窗口 -- 记录摘要,当然错误和警告还是要输出来的,只是内容可以简要一点

    然后我就用面像组合子来开发了一个小巧玲珑的系统,最终通过一个声明式编程的接口暴露出来,然后你还可以往里面添加新的功能。

    当然系统还是要经得起修改的,因此我还举了个例子,如果有了需求变更——
    err和wrn要加错误/警告的序号
    支持GUI了——跟VS的错误列表差不多

    最后展示了面向组合子编程最强大的威力——只需要添加零件,所有已经存在的工具都可以立刻在这个零件上面使用了,因此只需要非常少的代码就可以完成这个需求变更。

    这里就放上我的ppt了。明天还要先开一个内部讲座看看别人有什么意见然后进一步修改,完了demo在放出来。这个demo当然是C#写的了,有GUI,C++写GUI多麻烦啊……
posted on 2010-08-16 09:10 陈梓瀚(vczh) 阅读(4890) 评论(15)  编辑 收藏 引用 所属分类: 作品

评论:
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-16 17:56 | LOGOS
理解不了
ILogger logger = Logger.WriteTo().If();
WriteTo返回的ILogger并没有If方法吧,这些玩意究竟是怎么组合起来的  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-16 18:08 | 空明流转
@LOGOS
static void If(this ILogger logger), 注意这个this。  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-16 19:24 | 陈梓瀚(vczh)
@LOGOS
C#有扩展方法,我在Logger里面写了一个
public static ILogger If (【this ILogger logger】, ...)  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-16 19:33 | LOGOS
@陈梓瀚(vczh)
已经理解了
和同事讨论了一下,C++下面只能写成
logger = Logger.WriteTo()
logger = Logger.If(logger);
达不到C#的效果,比较遗憾  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-16 20:42 | 陈梓瀚(vczh)
@LOGOS
C++用函数啊:
shared_ptr<ILogger> If(shared_ptr<ILogger> logger, function<bool(int)> predicate)
{
....
}
挖掘STL啊
结果就变成

warningLogger = If(WriteTo(X), [](int i){return i==WARNING;});  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-17 00:51 | 空明流转
@LOGOS
顺便说一下,准确的说Composite是它在结构组织上的模式,但是实际上,这是一个很典型的strategy/state模式 + decorator模式的组合运用。Combinator在此处起到的是语法糖的作用。  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-17 01:11 | LOGOS
@空明流转
@陈梓瀚(vczh)
被两位教育了
该模式让我想起java在使用流时候的写法,C++要用也可以写成这样
S s = new S1(new S2(new S3(new S4)))  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-17 01:19 | 空明流转

@LOGOS
C++你要敢这么写,异常会把你弄死。  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-17 05:35 | 陈梓瀚(vczh)
@空明流转
如果构造函数的参数也是shared_ptr就不会死  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt[未登录] 2010-08-17 17:12 | by
基于一个基础的输出,不断的链接特性,形成一个包装链,我的理解对吗?
  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-17 18:54 | 陈梓瀚(vczh)
@by
但这个做法的基础是特性要够正交,要能随意组合。Combinator就是用来做到这一点的。  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt[未登录] 2010-08-18 00:11 | by
@陈梓瀚(vczh)
就是一个一头是插座一头是插头的单位,最终一头是最底层的实现,一头是使用者。

多目标输出,只是多路分支的插座而已,而过滤器,插入,这些都可以在这些单位里面实现。然后输出到下一个单位。

是这样吧。

  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt[未登录] 2010-08-18 00:12 | by
@by
只要保证插头和插座兼容,内部可以随意实现。

我觉得如果这样理解的话,我就明白了。
  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt[未登录] 2010-08-18 00:14 | by
@陈梓瀚(vczh)
我对设计模式不了解。是不是这个可以称为插头插座模式呢。。。。
  回复  更多评论
  
# re: 这几天写了一个关于面向组合子编程的ppt 2010-08-18 02:53 | 陈梓瀚(vczh)
@by
算是吧  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理