论坛首页 Java企业应用论坛

论面向组合子程序设计方法 之 微步毂纹生

浏览 87446 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-08-09  
TiGEr.zZ 写道
ajoo,我只是觉得不应该忽视细节,程序员在乎细节比在乎理论重要,不要一说起来就要吵架的架势。其他的就不说了。

听起来好像你看懂我说的是什么了?我怎么从你的发言里面一点也看不出来?

如果你根本就没明白,讨论细节不是浪费时间?

不是吵架,你要是真想讨论,来点实在的,别总虚头八脑的。
0 请登录后投票
   发表时间:2005-08-09  
firebody 写道
ajoo 写道

可以的。不管你的系统多复杂,也能重用+-*/这些基本的组合子把?为什么?因为它们足够简单。更何况,如果你的组合子足够简单,那么本身就没花多少工作量,就算有几个如firebody所说,不能重用,又如何?

反过来 呢?  脱离了需求,你怎么知道你推导的组合子够用了呢? 估计更多的情况时还得回到需求再根据需求推导一遍。

说实在话,虽然ajoo提到CO看起来很美丽,但是脱离了需求的设计也是足够“恐怖“的。 而且,即使像ajoo所说,如果你的CO足够“原子“ 或者“简单“,那么你的CO能够被复用的概率就越大(这句话是我设想的) ,那么,看起来,这些COs应该以一种颇为精妙的搭建思路 搭建起来,以应付更多更复杂的需求了。 那么,搭建COs的思路似乎也是一个设计瓶颈所在,这个瓶颈再没有需求的检验下,似乎冒的风险很大,而且,因为这个瓶颈是整个COS发挥 “作者一相情愿的足够强大的组和能力“的构建基础,这意味着对它的任何改动都会带来不可估量的影响。

按照这样的分析下来,似乎,越复杂的系统,CO的设计并没有足够的能力将复杂的系统 抽丝剥简 般 分离出足够简单的CO组合来。


我就举一个以前实际用过的例子
//部门中所有员工薪水提100块
new Iterate();.eval(new SalaryAdd(100);, dept.getEmployees(););;
//部门中所有女员工薪水再提20块
new Iterate();.eval(new SalaryAdd(20);, 
    new Filter();.eval(new IsGender(Gender.Female);, dept.getEmployees();););;
//获得部门中所有员工的薪水
new Map();.eval(new GetEmployeeSalary();, dept.getEmployees(););;
//求一个部门的薪资总额
new Cumulate();.eval(0, new GetEmployeeSalary();, dept.getEmployees(););;

Iterate、Map、Cumulate、Filter描述“如何对列表进行操作”,SalaryAdd、IsGender、GetEmployeeSalary描述“如何对一个员工进行简单操作”,组合起来就可以完成以上的各种、以及其他很多种“对一组员工进行某些复杂操作”的逻辑。这两个维度上的组合子,彼此不知道对方的存在。
对于firebody的问题:“你怎么知道你推导的组合子够用了呢”。在我这个例子里面,我确实不知道什么时候才算够用。不过,这些基本的组合子(例如IsGender、SalaryAdd)是早晚要写的,并且写出来之后可以复用,我觉得就挺好了。
0 请登录后投票
   发表时间:2005-08-09  
我可能以为自己是懂了或者我以为的错了,或者有偏差,这也都很正常。
我在看你的东西,基本上还是比较仔细的,至少每个都希望能理解到你是如何做的,和你表达上的关联。
理解了就一定要说点什么,似乎是不理解的才有提问的必要吧?有些问题,别人提出来了,不也一样吗?
我也没说是要讨论,我们在听你讲课。但我其实是希望能够讨论讨论的,但是毕竟这里不是讨论的地方,所以就提些我的意见,你倒也不谦虚些,呵呵
0 请登录后投票
   发表时间:2005-08-09  
问题在于,我觉得-1、0、1重要,而你觉得0、1重要。如何协调呢?
同时就如你所说,不管多复杂的场景,都可以使用基本的运算组合的combinator来表现。那么该如何确定使用co和oo究竟那个会更加节省呢?
0 请登录后投票
   发表时间:2005-08-09  
charon 写道
此外,log4j可以做到针对某个类层次输出某个级别的日志信息这件事情,至少比现在CO的那个要强上那么一点点。或者说,CO怎么能够做到对于org.charon下面的DEBUG以上的信息,输出到charon_debug.log,而对于org.charon下的WARN以上的信息,输出到charon_warn.log, 也许,同时又会对 org.ajoo做一些类似的设置。


这是一个很好的例子,让我想到了怎么在ioc容器级别自动地注射合适的Logger实现。对这个,好像pico和spring的支持都有限。


需求如下:
有一个静态工厂:

Logger getLogger(Class c);;







不希望让每个需要用Logger的类主动调用这个方法。而是IOC进来,如下:


class MyClass{
  private final Logger logger;
  MyClass(..., Logger logger, ...);{
    this.logger = logger;
  }
}


这样的类有很多。

利用yan的组合子,我们可以达到如下效果:

Component setLogger(Component c);;


任何组件,经过setLogger函数的调用,所返回的组件会自动调用Loggers.getLogger(component_type)来注射任何一个类型为Logger的参数或者property。


不需要额外的aop支持,就是一个组合子就搞定一切。


对这个,后面当我用yan做例子的时候会仔细讲一下的。
0 请登录后投票
   发表时间:2005-08-09  
ozzzzzz 写道
问题在于,我觉得-1、0、1重要,而你觉得0、1重要。如何协调呢?
同时就如你所说,不管多复杂的场景,都可以使用基本的运算组合的combinator来表现。那么该如何确定使用co和oo究竟那个会更加节省呢?

所以,我说需要一些经验和数学上的基础。基本上,这里,我没有能力论证0比-1重要。只能说,你就暂时相信这个吧。0是最最重要的(你说的-1是什么意思?没太明白)

至于什么时候oo,什么时候co,如果你是超级大牛,自然基本什么时候都能co,但是对一般人,还是经验说了算。这个方法论并不比oo精确。
0 请登录后投票
   发表时间:2005-08-09  
TiGEr.zZ 写道
我可能以为自己是懂了或者我以为的错了,或者有偏差,这也都很正常。
我在看你的东西,基本上还是比较仔细的,至少每个都希望能理解到你是如何做的,和你表达上的关联。
理解了就一定要说点什么,似乎是不理解的才有提问的必要吧?有些问题,别人提出来了,不也一样吗?
我也没说是要讨论,我们在听你讲课。但我其实是希望能够讨论讨论的,但是毕竟这里不是讨论的地方,所以就提些我的意见,你倒也不谦虚些,呵呵


我对认真提意见和甩闲话摆酷的人是区别对待的。没办法,就这脾气。
0 请登录后投票
   发表时间:2005-08-09  
ajoo 写道
ozzzzzz 写道
问题在于,我觉得-1、0、1重要,而你觉得0、1重要。如何协调呢?
同时就如你所说,不管多复杂的场景,都可以使用基本的运算组合的combinator来表现。那么该如何确定使用co和oo究竟那个会更加节省呢?

所以,我说需要一些经验和数学上的基础。基本上,这里,我没有能力论证0比-1重要。只能说,你就暂时相信这个吧。0是最最重要的(你说的-1是什么意思?没太明白)

至于什么时候oo,什么时候co,如果你是超级大牛,自然基本什么时候都能co,但是对一般人,还是经验说了算。我这个方法论并不比oo精确。

-1的意思就是“减法”操作。没记错的话,丘奇貌似是证明了只要有lambda就足够,并且数的基础也只有0和加法操作,并没有减法。
0 请登录后投票
   发表时间:2005-08-09  
ajoo, 假设有如下的代码:
foreach(e: entities){
    logger.println(Logger.DEBUG, "entity id: " + e.getId());
    e.blah();
}


如果循环数目过多,那么改写成这样的代码,对于性能会比较好:
foreach(e: entities){
    if(logger.isEnable(Logger.DEBUG)){
        logger.println(Logger.DEBUG, "entity id: " + e.getId());    
    }
    e.blah();
}


那么对于你原先的Logger Interface得加上
public boolean isEnable(int level);

那么所有组合出来的各种Logger的实现也得加上这个方法的实现,那么能否show一下,TimestampLogger, SequenceLogger应该怎么改写呢?
0 请登录后投票
   发表时间:2005-08-09  
gigix 写道
ajoo 写道
ozzzzzz 写道
问题在于,我觉得-1、0、1重要,而你觉得0、1重要。如何协调呢?
同时就如你所说,不管多复杂的场景,都可以使用基本的运算组合的combinator来表现。那么该如何确定使用co和oo究竟那个会更加节省呢?

所以,我说需要一些经验和数学上的基础。基本上,这里,我没有能力论证0比-1重要。只能说,你就暂时相信这个吧。0是最最重要的(你说的-1是什么意思?没太明白)

至于什么时候oo,什么时候co,如果你是超级大牛,自然基本什么时候都能co,但是对一般人,还是经验说了算。我这个方法论并不比oo精确。

-1的意思就是“减法”操作。没记错的话,丘奇貌似是证明了只要有lambda就足够,并且数的基础也只有0和加法操作,并没有减法。

如果作为数其实只要有0,和单位就够了。但是在实际的情况中,没有那么多公理性的东西怎么办?我不是ajoo说的超级大牛,所以很可能会在某些时候迷失,那么有什么好的指导性的建议呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics