Declarative programming声明性编程

DDD中经常谈到一个名词是Declarative Design声明式设计,目前比较流行,尤其是并行计算开始走热背景下。


定义:无需表达程序控制流程。只要表达逻辑计算即可,就是表达应该干什么,而不是详细说明如何去完成它。 declarative 设计意思是一种目标设计。

比如MDA和DSL都属于一种declarative Design,它们描述业务目标应该是这样,通过代码生成器生成代码,这样我们无需关注软件语言细节,不再纠缠于数据库的数据和算法,也不要成天在OO和数据之间徘徊选择了。


declarative design能够降低边界影响side effects 或者是意料外的结果,本来我设计目的是这样,但是会产生额外的副作用,其他没有想到的坏影响,这是设计的大忌讳。


Martin Fowler提出Functional programming最小化甚至忽视边界影响,所以被认为是declarative的。function的定义是这个方法只要是相同输入永远是相同输出,无论被执行多少遍,这样,这个方法就可以被多CPU并行计算,这是多核并行计算的基础要求。

所以,并行计算的前提是OO足够好。而不是满嘴数据怎么样怎么样。这也就是为什么你学了国内计算机课程后,看目前世界最新软件技术文献,还是看不懂的原因,因为就是两个世界观。

象Domain specific languages 类型的并行计算语言Scala等框架,都是非常好的declarative Design,可以准确表达设计意图,不会与设计产生意外效应。还有Hybrid languages。

正如Evans 在DDD中所说:当你设计时使用了明确的接口 无边际影响的方法function和断言,我们就能逐渐进入declarative王国。如果能够熟练掌握DDD的Specification(规定 规则 规格),我们可以在任何语言比如Java上构建自己的declarative王国。

新的软件王国就在那里,你是否认识它的存在,抑或已经站在它的门口,或者已经在其中游弋?

原文:
http://en.wikipedia.org/wiki/Declarative_programming

[该贴被admin于2009-04-21 11:33修改过]
[该贴被admin于2009-04-21 12:01修改过]

DDD提炼核心领域章节中谈到了关于声明性设计的重点。

无需专业业务知识容易能理解的领域模型能引起程序员的兴趣,他们认为只有解决这些问题才能积累自己专业知识,同时为自己简历增光添彩,这对于公司是浪费。

银团贷款系统:大多数技术天才和技术高手都对数据库映射层和消息接口津津乐道,而业务模型却交给一些刚刚涉足面向对象技术的新手们打理。最后这个项目差点失败。

算法或计算非常复杂,导致设计受到了冲击,模型中的概念变成了用“怎么做”来解释,而不是用“是什么”表达(banq按:声明性设计)。
设计中产生了一大堆用来实现算法 解决问题的方法,而描述这个问题的方法变得模糊不清。

banq按:其实在中国,很多程序员都是从算法数据学习上来的,这些知识重要性已经在它脑海里根深蒂固,如果再加上实际项目计算复杂,更容易使他舍本求末,

所以,我们要声明设计,要描述问题需求是什么,而不要把重点放在怎么解决上,虽然怎么解决也很重要,这其实还是象数之争,是什么就是象,而数是怎么解决。

象数之争


http://www.jdon.com/jivejdon/forum/messageList.shtml?thread=34907&message=23121178#23121178

[该贴被admin于2009-04-21 12:02修改过]