锁定老帖子 主题:失踪的链环
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-10
ddd 写道 树的组织数据的方法和语言无关,计算最后的discount自然会出现if else,但方法之优雅恐怕不是什么消息分派这些解决方法能达到的。
erlang看不懂,python那段如果碰上复杂规则恐怕描述都会出问题,整个就是个枚举规则。 举个例子:4项(a1,a2,a3,a4)满足两项=50就加10 discount_rules=[(lambda member:member.a1==50 and member.a2==50,discount_add10), (lambda member:member.a1==50 and member.a3==50,discount_add10), (lambda member:member.a1==50 and member.a4==50,discount_add10), (lambda member:member.a2==50 and member.a3==50,discount_add10), ... ] 只要出现交叉条件,枚举性描述必然会混乱不堪。 ErLang写法 discount(50, 50, _, _) -> ... discount(_, 50, 50, _) -> ... discount(_, 50, _, 50) -> ... discount(_, _, 50, 50) -> ... .... 写起来也很烦琐。 这类有规律的 Rule 应该可以用程序来表达。 比如,假设一个 List, 包含 a1, ... an. for ( a in List ) if ( a == 50 ) counter ++; if (count == 2) .... 如果是没有规律的,就没有办法了。只能采取枚举 if, else, switch case. |
|
返回顶楼 | |
发表时间:2006-10-10
buaawhl 写道 ErLang写法 discount(50, 50, _, _) -> ... discount(_, 50, 50, _) -> ... discount(_, 50, _, 50) -> ... discount(_, _, 50, 50) -> ... .... 写起来也很烦琐。 这类有规律的 Rule 应该可以用程序来表达。 比如,假设一个 List, 包含 a1, ... an. for ( a in List ) if ( a == 50 ) counter ++; if (count == 2) .... 如果是没有规律的,就没有办法了。只能采取枚举 if, else, switch case. 大马鹿 discount(E,E,_,_,_)->whwere E=50 %%%+10 discount(A,B,C,D)-> discount(B,C,D,A,A). discount(A,B,C,D,A1)-> discount(B,C,D,A,A1). discount(A,B,C,D,A)-> discount(B,C,D,none,none) discount(none,none,none,none)-> ok. 这样管你a有多少个,只要不嫌参数表太长,这四句话就够了. |
|
返回顶楼 | |
发表时间:2006-10-10
>member.alist=[member.a1,member.a2,member.a3,member.a4........],
discount_rules=[(lambda member:length([for T in [(X,Y )for X in member.alist for Y in member.alist if id(X)!=id(Y)] if (T[1]==50 and T[2]==50)])!=0 ,discount_add10), ... ] 这个……太乱了吧。 如果是这4项满足两项并且那4项也要满足两项(这恐怕属于比较简单的了),这个式子…… 不用组合模式必然会出现这种看起来不爽的表达。组合模式就是让这种复杂东西简单化的。 prolog也不懂。 你说的递归不就是组合模式么? |
|
返回顶楼 | |
发表时间:2006-10-10
ddd 写道 >member.alist=[member.a1,member.a2,member.a3,member.a4........],
discount_rules=[(lambda member:length([for T in [(X,Y )for X in member.alist for Y in member.alist if id(X)!=id(Y)] if (T[1]==50 and T[2]==50)])!=0 ,discount_add10), ... ] 这个……太乱了吧。 如果是这4项满足两项并且那4项也要满足两项(这恐怕属于比较简单的了),这个式子…… 不用组合模式必然会出现这种看起来不爽的表达。组合模式就是让这种复杂东西简单化的。 prolog也不懂。 你说的递归不就是组合模式么? 所谓的消息传递只是一个对消息的响应。lambda里面是十么对于消息分派来说根本不关心.消息分派并不是说要你一定要在一张表内解决所有的问题,维持范式必须进行表分解,这我已经说过很多遍了.就像邮政系统,会从国家分发到省分发到市分发到区.但是对于发送者和接收者来说我不用关心你是怎么分发的,分多少及分发的.我只关心接和收.至于里面用啥模式,就是属于你如何去构造一张或者几张表的问题. |
|
返回顶楼 | |
发表时间:2006-10-10
哦,你一直在提消息分派。
我早说过了:跑个题。 我说的是对这个规则问题本身的解决方法,在我的解决方法里根本没有消息分派的概念(在我的思维中也没有消息分派的概念,认为这个概念没有实际价值)。 |
|
返回顶楼 | |
发表时间:2006-10-10
ddd 写道 我说的是对这个规则问题本身的解决方法,在我的解决方法里根本没有消息分派的概念(在我的思维中也没有消息分派的概念,认为这个概念没有实际价值)。 我在开头就写过了 引用 本文的目的并不在于构造一种新的软件设计方法,或者是对已有的软件设计技术进行批评,而是希望以Message dispatch机制来从新解释现有的几种常用程序设计技巧
没有什么新发明也没有新东西.只是对这些已有的设计方法的内在工作机制做些简单的介绍,对于普通程序员来说也没有什么帮助,原来该怎么干还怎么干.就像Java编译器的内部工作原理,对于普通的程序员自然也是没有什么实际使用价值的. |
|
返回顶楼 | |
发表时间:2006-10-10
Java编译器的内部工作原理那是实在的东西,和实际联系紧密。
消息分派这种是抽象出来的东西,本身和实际是脱钩的,所以才要看看这个概念的提出对实际有没有推动力。 |
|
返回顶楼 | |
发表时间:2006-10-10
脱不脱钩,我不太清楚.有没有实际推动力这个问题上.我是非常赞同你的观点的.我的看法和你一样,我也认为这个东西肯定不太会推动什么语言新发展了.虽然消息分派是,<SICP>,<CPL>,<PLAI>这些国外程序语言设计权威教材里面的标准篇章,但是也是30多年前的老技术了.当年的确由此推动过大批OO语言到现在,现在么估计也是发展到头了.Ruby还不是一直在炒smalltalk的Message passing的冷饭阿不是么?这点上你看得比我深.
|
|
返回顶楼 | |
发表时间:2006-10-10
深是没有的,因为我在这方面的理论几乎为0,我只不过极端偏向实用主义而已。
我重新从“学术”的思维思考你这个消息分派思考了近2个小时(当然不是连续思考这么长时间),还是感觉到纯抽象的思考的那种快感,似乎这个东西是为了达到完全解耦出现的(但实际上没达到完全),要说学术这个东西是无法预料将来的,没准什么时候结合另外的技术后焕发第二春,随便说说,没准能和web service,什么智能agent一起再抽象点东西出来。 |
|
返回顶楼 | |
发表时间:2006-10-11
T1关于二维表比喻的rule匹配让我想起最早期的决策工具:decision table(决策表)。JBoos Rules(Drools)就支持在Excel里的decision table方式的DSL规则描述。形如:
Condition | Action C1 | C2 A1 | A2 Yes __ | x No Yes | x 条件一般是最大的可组合单位,像前面提到的“4个里有两个数是50”,如果没别的条件,是可以写成“第一个是50,第二个是50。。。”4个条件;但是如果还有其它条件,“4个里有两个数是50”就只是一个条件了(T1说的high order)。 决策表缺点也不少:首先它默认表达AND条件组合,OR条件组合就要拆成多条表达,造成冗余。其次为了简单,决策表不要求穷举所有的条件组合,在“超强类型”的OCaml里pattern match没有穷举完所有的可能pattern的话是会出警告的(Erlang? Haskell?)。最后就是ajoo说的条件冲突问题,这确实不是决策表的事,但一般的rule engine在走完rete网络后如果发现冲突的话会根据rule优先级或别的条件判断处理,FP pattern match好像除了自己安排条件把高优先级的放前面外没什么好办法。。。 |
|
返回顶楼 | |