锁定老帖子 主题:论面向组合子程序设计方法 之 微步毂纹生
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-08-09
TiGEr.zZ 写道 ajoo,我只是觉得不应该忽视细节,程序员在乎细节比在乎理论重要,不要一说起来就要吵架的架势。其他的就不说了。
听起来好像你看懂我说的是什么了?我怎么从你的发言里面一点也看不出来? 如果你根本就没明白,讨论细节不是浪费时间? 不是吵架,你要是真想讨论,来点实在的,别总虚头八脑的。 |
|
返回顶楼 | |
发表时间: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)是早晚要写的,并且写出来之后可以复用,我觉得就挺好了。 |
|
返回顶楼 | |
发表时间:2005-08-09
我可能以为自己是懂了或者我以为的错了,或者有偏差,这也都很正常。
我在看你的东西,基本上还是比较仔细的,至少每个都希望能理解到你是如何做的,和你表达上的关联。 理解了就一定要说点什么,似乎是不理解的才有提问的必要吧?有些问题,别人提出来了,不也一样吗? 我也没说是要讨论,我们在听你讲课。但我其实是希望能够讨论讨论的,但是毕竟这里不是讨论的地方,所以就提些我的意见,你倒也不谦虚些,呵呵 |
|
返回顶楼 | |
发表时间:2005-08-09
问题在于,我觉得-1、0、1重要,而你觉得0、1重要。如何协调呢?
同时就如你所说,不管多复杂的场景,都可以使用基本的运算组合的combinator来表现。那么该如何确定使用co和oo究竟那个会更加节省呢? |
|
返回顶楼 | |
发表时间: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做例子的时候会仔细讲一下的。 |
|
返回顶楼 | |
发表时间:2005-08-09
ozzzzzz 写道 问题在于,我觉得-1、0、1重要,而你觉得0、1重要。如何协调呢?
同时就如你所说,不管多复杂的场景,都可以使用基本的运算组合的combinator来表现。那么该如何确定使用co和oo究竟那个会更加节省呢? 所以,我说需要一些经验和数学上的基础。基本上,这里,我没有能力论证0比-1重要。只能说,你就暂时相信这个吧。0是最最重要的(你说的-1是什么意思?没太明白) 至于什么时候oo,什么时候co,如果你是超级大牛,自然基本什么时候都能co,但是对一般人,还是经验说了算。这个方法论并不比oo精确。 |
|
返回顶楼 | |
发表时间:2005-08-09
TiGEr.zZ 写道 我可能以为自己是懂了或者我以为的错了,或者有偏差,这也都很正常。
我在看你的东西,基本上还是比较仔细的,至少每个都希望能理解到你是如何做的,和你表达上的关联。 理解了就一定要说点什么,似乎是不理解的才有提问的必要吧?有些问题,别人提出来了,不也一样吗? 我也没说是要讨论,我们在听你讲课。但我其实是希望能够讨论讨论的,但是毕竟这里不是讨论的地方,所以就提些我的意见,你倒也不谦虚些,呵呵 我对认真提意见和甩闲话摆酷的人是区别对待的。没办法,就这脾气。 |
|
返回顶楼 | |
发表时间:2005-08-09
ajoo 写道 ozzzzzz 写道 问题在于,我觉得-1、0、1重要,而你觉得0、1重要。如何协调呢?
同时就如你所说,不管多复杂的场景,都可以使用基本的运算组合的combinator来表现。那么该如何确定使用co和oo究竟那个会更加节省呢? 所以,我说需要一些经验和数学上的基础。基本上,这里,我没有能力论证0比-1重要。只能说,你就暂时相信这个吧。0是最最重要的(你说的-1是什么意思?没太明白) 至于什么时候oo,什么时候co,如果你是超级大牛,自然基本什么时候都能co,但是对一般人,还是经验说了算。我这个方法论并不比oo精确。 -1的意思就是“减法”操作。没记错的话,丘奇貌似是证明了只要有lambda就足够,并且数的基础也只有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应该怎么改写呢? |
|
返回顶楼 | |
发表时间: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说的超级大牛,所以很可能会在某些时候迷失,那么有什么好的指导性的建议呢? |
|
返回顶楼 | |