﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-wadise-随笔分类-软件工程</title><link>http://www.blogjava.net/wadise/category/6056.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 04:42:19 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 04:42:19 GMT</pubDate><ttl>60</ttl><item><title>一篇讨论DSL的文章</title><link>http://www.blogjava.net/wadise/archive/2006/04/19/41987.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Wed, 19 Apr 2006 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2006/04/19/41987.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/41987.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2006/04/19/41987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/41987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/41987.html</trackback:ping><description><![CDATA[江南白衣 10:00:26<br />
JetBrains opens Meta Programming System for Early Access<br /><br />
http://www.theserverside.com/news/thread.tss?thread_id=34619 <br />
江南白衣 10:00:46<br />
JetBrains那个DSL制造器终于放出来溜达了 <br />
magicgod 10:00:55<br />
是不是以idea为依靠？ <br />
江南白衣 10:01:09<br />
an IDE-like language workbench for creating domain-specific languages
(DSLs) and programs. It includes a plugin for IntelliJ IDEA which helps
to generate Java code from your DSLs.<br />
 <br />
magicgod 10:01:15<br />
dsl跟rules有什么区别？ <br />
江南白衣 10:02:39<br />
Martin Flower最近出来凑热闹,写了一篇关于Language workbench的blog阿,非常综合的总结了面向语言编程,你看他的好了<br />
http://martinfowler.com/articles/languageWorkbench.html <br />
江南白衣 10:03:44<br />
不是说,面向对象的封装不能真的一一映射现实世界.<br />
而面向人类语言习惯的封装,从逻辑学上,更能影射人类的思维. <br />
magicgod 10:04:00<br />
看了一下，真的有点奇怪 <br />
江南白衣 10:04:43<br />
他那篇blog,一开始举的例子太长太无聊了,搞得大家频频起身吃零食,去厕所.... <br />
buaawhl 10:04:43<br />
LOP. <br />
magicgod 10:05:22<br />
哈哈，是的 <br />
magicgod 10:05:41<br />
但我总觉得还是有点隐隐不对劲 <br />
buaawhl 10:06:07<br />
groovy, beanshell, js, python, ruby 不都是 LOP吗？<br />
 <br />
江南白衣 10:06:18<br />
不是吧 .... <br />
buaawhl 10:06:18<br />
LOP的一个例子 <br />
magicgod 10:06:20<br />
这又回到了五六十年代人工智能和专家系统的方向了 <br /><br /><br />
 <br />
buaawhl 10:06:43<br />
Lisp允许自定义 语法规则 <br />
magicgod 10:06:43<br />
lisp是恐怖的 <br />
buaawhl 10:06:56<br />
对。最终的出路就是 人工智能 <br />
magicgod 10:07:02<br />
学autocad的时候，真是要晕死了 <br />
magicgod 10:07:24<br />
不见得是自然的，应该有一种类自然语言先出现 <br />
buaawhl 10:07:28<br />
autocad用Lisp ? <br />
江南白衣 10:07:28<br />
Lisp按MF的分类,属于Internal DSL.用自己来表达DSL<br />
而其他的都属于External DSL,需要转译器 <br />
magicgod 10:07:40<br />
我看了ilog的语言，看上去不错 <br />
江南白衣 10:07:52<br />
MPS这种是用转译器的阿,不同LISP. <br />
江南白衣 10:08:50<br />
JetBrains的MPS,优点在帮你制造语言的同时,制作这种语言的IDE... <br />
magicgod 10:10:01<br />
应该是为了让这种语言给用户或低级实施人员用吧 <br />
江南白衣 10:11:18<br />
周末试用一下再说了,这年头,总是广告做得好,实际没什么用. <br />
buaawhl 10:11:43<br />
MPS is a Java Code generator ?<br />
 <br />
magicgod 10:12:16<br />
是不是这样的理想：创建一种语言适合客户直接使用 <br />
buaawhl 10:12:23<br />
http://www.jetbrains.com/mps/start_mps3.html  look its sample <br />
magicgod 10:12:29<br />
那么就相当于把域逻辑的功能放给用户来用 <br />
magicgod 10:12:49<br />
这个hello world是有点复杂的，我觉得他举的例子不对 <br />
buaawhl 10:12:52<br />
客户直接使用 自然语言。比如，汉语 <br />
magicgod 10:13:48<br />
而且更好规范，适合计算机来识别 <br />
江南白衣 10:14:25<br />
举个例子吧,SQL属于DSL....你如果不用SQL,也可以用一堆API来进行查询,像hibernate的critexx.....<br />
但SQL明显更易读.<br /><br />
so,把代码封装成语言,在某些情况下比封装成OO的lib更好. <br /><br />
 <br />
magicgod 10:15:13<br />
是的，那如果封装成OO的语言呢？ <br />
magicgod 10:15:56<br />
一个用户写好的DSL代码，继承给另一个用户去使用，岂不是很方便 <br />
buaawhl 10:16:57<br />
SQL能够做到的事情很少啊。where = if.  <br />
江南白衣 10:17:03<br />
可继承的语言?这不是我的知识范围内了... <br />
buaawhl 10:17:08<br />
if( a = 1) b = 3; <br />
buaawhl 10:17:25<br />
select * from A where b = 3 <br />
buaawhl 10:17:43<br />
难度差不多啊<br />
 <br />
江南白衣 10:17:57<br />
MF说,DSL就是不是不符合图灵XXX的语言,不自足的,只能成为程序的某一方面,而主体必须要General Language(like java)完成. <br />
magicgod 10:18:25<br />
是的，DSL就是要简单 <br />
江南白衣 10:18:40<br />
靠,打字太快,<br />
MF说,DSL就是不符合图灵XXX的语言<br />
 <br />
buaawhl 10:18:43<br />
问题是在于，General Language(like java) 表达 程序的某一方面（简单）的时候， 也相当简单。和DSL一样简单 <br />
magicgod 10:18:53<br />
目标不是程序员，而是行业用户 <br />
江南白衣 10:19:08<br />
而且,简单的时候你可以不封装阿. <br />
magicgod 10:19:09<br />
如果要到DSL的程度就可以视为DSL <br />
buaawhl 10:19:11<br />
那么，有必要用另一个简单，来定义 本来就简单的东西吗？ <br />
buaawhl 10:19:41<br />
行业用户？:-) for example? what they realy need? <br />
江南白衣 10:19:41<br />
不是这个意思啊. <br />
buaawhl 10:19:58<br />
前一段时间，看了一下 Rule Engine <br />
江南白衣 10:20:00<br />
ilog的规则语言就可以让电信的mm自定义收费规则 <br />
magicgod 10:20:26<br />
是的，就是要够简单，这只是一个模糊概念 <br /><br />
 <br />
buaawhl 10:21:10<br />
yes. i know iLog. 怎么说呢.那是商业的成功.另外也是业务模块的成功. <br />
magicgod 10:21:54<br />
而且实际上DSL应该是面向实际人群的，比如：电报码是一个非常复杂的编码，可是仍然有大批的业务人员直接操作 <br />
江南白衣 10:22:01<br />
其实也不一定直接面对行业用户<br />
只是把某些面向OO的lib ,转为面向语言的封装,产生更多的蓝领.<br />
但我觉得这个方向还有太多东西要研究,MPS只是一次探索 <br />
buaawhl 10:22:24<br />
谁能给出一个 具体的 ilog sample ?  MPS可以说是 MDA。<br />
 <br />
buaawhl 10:22:33<br />
Model Graph -&gt; Code <br />
buaawhl 10:23:16<br />
iLog和JRules是同一个产品吗？ <br />
 风之子 10:23:19<br />
Ilog是rule-&gt;Fuction <br />
magicgod 10:24:27<br />
If    the call destination number is the preferred
numberThen     apply the preferred number rate <br />
江南白衣 10:24:27<br />
MPS的内涵一定不只Model Graph -&gt; Code ,看他的那篇总领性的文章,不只如此的.<br />
不过可能第一版只做到这样. <br />
magicgod 10:24:41<br />
If    the call destination number is the preferred
numberThen     apply the preferred number rate <br />
magicgod 10:24:44<br />
If<br />
    the call destination number is the preferred number<br />
Then     <br />
    apply the preferred number rate <br />
magicgod 10:24:53<br />
ilog's bal <br />
庄表伟 10:25:02<br />
这是ilog的代码？ <br />
magicgod 10:25:02<br />
已经比较接近自然语言了 <br />
庄表伟 10:25:08<br />
让我想起了cobol <br />
buaawhl 10:25:10<br />
yes. i c. 江南白衣(228013) 10:20:00<br />
ilog的规则语言就可以让电信的mm自定义收费规则 。   <br />
电信的mm写这个？ <br />
magicgod 10:25:13<br />
google上抄来的 <br />
buaawhl 10:25:26<br />
是啊。Pascal， VB 也是这样 <br />
magicgod 10:25:26<br />
是的，有点象，所以cobol至今还有生命力 <br />
magicgod 10:25:43<br />
destination number <br /><br />
 <br />
magicgod 10:29:09<br />
这应该就是DSL的好处，用户很快搞懂了SQL的基本方法，以后做报表就简单了 <br />
buaawhl 10:29:15<br />
可以自定义语言规则。 <br />
buaawhl 10:29:27<br />
其实，就是关键字替换了。 <br />
江南白衣 10:29:40<br />
不会的,ilog的规则语言也是绑定IDE的,你打个节字,会出来一个下拉选择框,只能选节假日 <br />
phalanger 10:29:50<br />
自然语言太自然了不是什么好事，到最后还是要一个语言规则，发展到最后，其实还是要小mm掌握一门“电脑语言” <br />
magicgod 10:30:10<br />
http://blog.csdn.net/calvinxiu/archive/2005/05/27/382372.aspx <br />
magicgod 10:30:20<br />
做了一个比较 <br />
江南白衣 10:30:49<br />
就像我们用dtd,xsd限制 xml一样. <br />
magicgod 10:31:32<br />
既然用户需求这么多变，好！干脆开放给你们，自己写去吧！这总算好了吧 <br />
buaawhl 10:31:41<br />
对，XML表示逻辑，没有一点优势。iLog采用的是script方式。好多了。 <br />
buaawhl 10:32:18<br />
不过，难道iLog要为每一个国家行业定制一种 解释引擎/IDE？<br />
 <br />
庄表伟 10:33:03<br />
看了你的blog，和我的思路，有很多可以相互参照之处 <br />
buaawhl 10:33:13<br />
iLog能够流行起来，完全靠的是，行业经验。和 DSL的优势 没有关系 <br />
庄表伟 10:33:40<br />
我现在在写的对于OO的分析，就是认为它事实上无法准确的描述真实世界 <br />
庄表伟 10:33:51<br />
而要描述需求世界，OO又是不足的 <br />
buaawhl 10:33:54<br />
假设我也是iLog公司，我用支持 中文变量的 VB，一样可以做到这样的程度 <br />
江南白衣 10:34:14<br />
ilog但如果不靠DSL ,而是一堆 API，想必大打折扣。 <br />
buaawhl 10:34:22<br />
只要把业务模块做好了。 <br />
magicgod 10:34:48<br />
关键在于要让用户来写这个东西最好了 <br />
buaawhl 10:34:53<br />
是啊，VB 的 function 也可以不带 ( )<br /><br />
 <br />
庄表伟 10:35:05<br />
要更好的描述需求世界，应该要将真实经验转换为需求世界中的规范定义，然后需要另外的、特定的、描述需求的语言 <br />
magicgod 10:35:19<br />
动态语言更好，这其实就是向人工智能的发展 <br />
buaawhl 10:35:26<br />
用户用iLog从来就不会定义 function。从来只是调用 function. <br />
庄表伟 10:35:27<br />
这样的语言，究竟是不是要类似自然语言，我却有不同的看法 <br />
magicgod 10:35:49<br />
再下去用户就会提要求了，能不能搞懂自己的意思啊 <br />
庄表伟 10:35:52<br />
可能类似于model graph这样的图形表示会更加好 <br />
buaawhl 10:35:56<br />
那么，VB也是一样。我就给你一本关键字手册，而不是API手册。有什么区别？ <br />
magicgod 10:36:27<br />
正是如此，DSL就是领域内的一种语言啊 <br />
magicgod 10:36:51<br />
定好语法，函数，然后用户你去写吧，最多给你一个IDE可以调试一把 <br />
buaawhl 10:37:07<br />
不是一种。而是多种。:-) ilog 一种，jrules一种，drools一种， <br />
江南白衣 10:37:10<br />
我还是认为语言和API之间的差别是巨大的。<br />
而且APi还受很多继承阿，多重继承阿之类的编程语言本身的限制。<br /><br />
 <br />
庄表伟 10:37:19<br />
如果我的思路没错的话，那么我的那篇文章，最后会自然的接上DSL这样的语言 <br />
庄表伟 10:37:27<br />
  <br />
magicgod 10:37:33<br />
是的，听了阿飞介绍的GP确实感触比较大 <br />
magicgod 10:38:04<br />
就是又回到了原来的世界，语言要定义得简单，让客户能使用，不要设计包罗万象的东西 <br />
buaawhl 10:38:07<br />
江南白衣(228013) 10:37:10<br />
我还是认为语言和API之间的差别是巨大的。<br />
而且APi还受很多继承阿，多重继承阿之类的编程语言本身的限制。<br /><br />
应该说 是  关键字  和  API之间的差别吧 <br />
江南白衣 10:38:18<br />
MF说，LOP== GP，微软软件工厂，JetBrains MPS三线发展... <br />
magicgod 10:38:23<br />
甚至对于一个项目就设计一种语言 <br />
magicgod 10:38:41<br />
然后实际上的软件开发核心让用户来开发，哈哈，完美啊 <br />
庄表伟 10:39:20<br />
哪有这么简单，最为困难的部分，就是将真实世界，抽象、界定为含义清晰的需求世界的工作。 <br /><br />
 <br />
buaawhl 10:39:18<br />
magicgod(2240529) 10:38:23<br />
甚至对于一个项目就设计一种语言 <br />
magicgod(2240529) 10:38:41<br />
然后实际上的软件开发核心让用户来开发，哈哈，完美啊  <br /><br />
LOP文章就是这么鼓吹的。:-) <br />
magicgod 10:39:25<br />
把需求变更的事转嫁到用户上去，干脆我也不用了解业务了，你自己玩去吧， <br />
江南白衣 10:39:26<br />
to buaawhl:哈哈，得找些语言学家和你聊聊天了：）<br />
即使目前是关键字==API,也只是现状，明天会更好 <br />
magicgod 10:39:53<br />
在一个小范围的功能中让客户来方便定制，象家电一样 <br />
庄表伟 10:39:59<br />
这是需要长期的经验积累的 <br />
buaawhl 10:40:15<br />
:-) 明天，当然。我只是力图破除 商业概念的 迷信。 <br />
江南白衣 10:40:22<br />
微软那个work beach，又有人试了没有？ <br />
magicgod 10:40:39<br />
其实DSL也不是什么先进的概念，只是老调重弹而已 <br />
magicgod 10:41:02<br />
IT界需要这样的东西，快被用户逼疯了，项目已经成为人际关系的产物 <br />
buaawhl 10:41:02<br />
不要被误导了。这些厂家 的成功决不是因为什么DSL。完全是行业经验的积累。 DSL只是他们炮制出来的壁垒和规则。 <br />
buaawhl 10:41:34<br />
用户的培训也是一大笔费用呢 <br />
magicgod 10:41:57<br />
那是，DSL是帮助厂家来专注到业务上的 <br />
江南白衣 10:42:11<br />
Domain Specific Tools CTP Released for Visual Studio 2005 Beta 2<br />
http://www.theserverside.net/news/thread.tss?thread_id=34253 <br />
buaawhl 10:42:20<br />
就说那个电信的例子。不经过培训，MM怎么懂 DSL？ <br />
magicgod 10:42:28<br />
用不着再追新技术，到此为止了，框架也不需要了，干脆，咱们上DSL吧，哈哈 <br />
buaawhl 10:42:51<br />
而且，那些DSL的逻辑语法极其简单，其实是起着 数据的作用 <br />
magicgod 10:42:51<br />
只要培训成本与原来持平即可 <br />
江南白衣 10:43:13<br />
微软不是傻子，如果别人是学院派的乱试，微软的加入至少说明点问题。 <br />
buaawhl 10:43:41<br />
不可能啊。DSL只有 MS, iLog这样的大公司才搞得起。那属于规则制定啊<br />
 <br />
buaawhl 10:44:02<br />
小公司 不要想着 定义自己的 DSL <br />
 <br /><br />
 <br />
magicgod 10:44:03<br />
行不行的拉出来溜溜，目前成功的DSL已经有了，就看各软件公司如何制定DSL <br />
江南白衣 10:44:22<br />
MS提供的是工具噢..... <br />
magicgod 10:45:00<br />
术语，规则都可以直接制定，那么支持DSL开发的厂商显然是成本更低了 <br />
buaawhl 10:45:08<br />
白衣再把那个ms dsl发来，我仔细看看  <br />
magicgod 10:45:18<br />
各行业应该都会干这事的 <br />
buaawhl 10:45:40<br />
我先详细了解一下 MS DSL的用法   <br />
江南白衣 10:47:05<br />
那要先装vs2005b2,我机上只有vs2003,一直没试呢。 <br />
江南白衣 10:47:20<br />
http://www.theserverside.net/news/thread.tss?thread_id=34253 <br />
buaawhl 10:49:11<br />
这就是刚才那个连接，我还有。我是说，你前几天发来的新闻。   是啊，我也没有2005。没办法试验。也看不到 demo <br />
江南白衣 10:49:31<br />
what新闻？ <br />
江南白衣 10:49:47<br />
今天另一个比较好的发布信息是<br />
Backport175 1.0 released: Annotations for Java 1.3 &amp; 1.4 ，codehaus出的。 <br />
buaawhl 10:50:08<br />
MS DSL Tool 发布的新闻。好像有用户体验 <br />
庄表伟 10:50:10<br />
有没有Flash这样的动态演示呢？ <br />
江南白衣 10:51:01<br />
俺那个针对旧项目的ORM，可以用annotation了：）<br />
之前要包含一个meta class,像groovy那样。 <br />
buaawhl 10:50:59<br />
其实，从我内心的感觉，DSL Tool = Javacc<br />
 <br />
江南白衣 10:51:28<br />
是超级加强版的javacc <br />
buaawhl 10:51:32<br />
iLog 那套简单的 if ... then  ....   我用javacc也能做出来。 <br />
buaawhl 10:52:05<br />
当然有IDE支持 <br />
 风之子 10:52:10<br />
iLOG的关键是动作语义 <br />
 风之子 10:52:19<br />
不是if..then <br /><br />
 <br />
江南白衣 10:52:25<br />
看hibernate里用antlr翻译Hql,用EBNF语法慢慢表示，累死了，而且还有很多不如意的地方，他自己注释起来很多todo... <br />
 风之子 10:52:48<br />
Action Semantics <br />
buaawhl 10:53:03<br />
但你这里看到，DSL IDE里面，关键字都在下拉框里面。这里的关键字 就相当于 数据了。 <br />
buaawhl 10:53:09<br />
Action Semantics？ <br />
江南白衣 10:56:24<br />
Quality-focused Groovy 1.0 pre-release 2 is out<br />
http://www.theserverside.com/news/thread.tss?thread_id=34587<br />
这篇文章的讨论很搞笑...大部分人都在讲<br />
i use groovy for<br />
1. ...<br />
2. ...<br />
很像枪手们在旺场 <br />
buaawhl 10:56:42<br />
 风之子(17256936) 10:52:10<br />
iLOG的关键是动作语义 <br /><br />
啥叫动作语义？for example?   我将来的一个主要理想，就是肃清 buzz word的迷信。  <br />
江南白衣 10:56:54<br />
不过的确列举了动态语言一些可用的地方。 <br />
庄表伟 10:57:01<br />
是啊是啊，新词太多，晕 <br />
buaawhl 10:57:10<br />
http://www.brics.dk/Projects/AS/   Action Semantics<br />
Home Page  <br />
庄表伟 10:57:16<br />
  <br />
buaawhl 11:03:16<br />
3.2 ILog的BAL(Business Action Language)--最完美的王者？<br />
   没有实际用过，只能看文档过过瘾。从文档来看，配合Ilog的编辑器，的确就是最完美的规则语言了。<br /><br />
If    the call destination number is the preferred
numberThen     apply the preferred number rate<br />
 <br />
江南白衣 11:05:12<br />
to buaawhl：<br />
关键字==API,我觉得你抓得很对,很快抓住了Ilog的本质.<br />
但是,抓得太快会忽略了语言的中间过程. <br />
江南白衣 11:05:28<br />
请看下面这段:<br />
 <br />
江南白衣 11:06:00<br />
如果我们有一辆购物车 <br /><br />
并且购物车里面至少有两件物品 <br /><br />
并且购物车里面的物品不超过四件 <br /><br />
并且如果购物车里面的商品价值至少是100美元 <br /><br />
并且如果客户是黄金客户 <br /><br />
那么就为该客户打八五折 <br /><br />
并且显示信息“我们为您黄金客户打了八五折” <br />
 <br />
buaawhl 11:06:46<br />
这是一个  and  逻辑 <br />
buaawhl 11:07:02<br />
没有 or ,  很简单。 <br />
江南白衣 11:07:04<br />
这就是一段规则语言.<br />
如果我们先不抓ilog,而是自己也做一次语言分析的练习,那你分析出这门语言有什么要素呢? <br />
庄表伟 11:07:39<br />
这样的规则语言？ <br />
buaawhl 11:07:47<br />
要素？what do you mean ?    <br />
庄表伟 11:07:49<br />
我编一个，你看看算不算： <br /><br />
 <br />
庄表伟 11:07:57<br />
我们给他100块 <br />
庄表伟 11:08:10<br />
如果他觉得够了，我们就不再给了 <br />
庄表伟 11:08:21<br />
如果他觉得不够，我们就再给100 <br />
庄表伟 11:08:33<br />
如果他觉得够了，我们就不再给了 <br />
庄表伟 11:08:41<br />
如果他觉得不够，我们就再给100  <br />
femto 11:08:42<br />
。。。。 <br />
庄表伟 11:08:46<br />
如果他觉得够了，我们就不再给了<br />
 <br />
庄表伟 11:08:47<br />
如果他觉得不够，我们就再给100   <br />
femto 11:08:49<br />
他觉得够不够的标准是什么 <br />
femto 11:08:51<br />
。。。。 <br />
femto 11:08:59<br />
老庄绕口令阿。。 <br />
庄表伟 11:09:06<br />
够不够是一个用户输入呀 <br />
femto 11:09:10<br />
呵呵 <br />
buaawhl 11:09:19<br />
condtions to meet = { 我们有一辆购物车 <br /><br />
购物车里面至少有两件物品 <br /><br />
购物车里面的物品不超过四件 <br /><br />
如果购物车里面的商品价值至少是100美元 <br />
客户是黄金客户 <br />
   }<br /><br /><br />
就为该客户打八五折 <br />
显示信息“我们为您黄金客户打了八五折” <br />
 <br />
江南白衣 11:09:45<br />
我的分析上面那段规则语言的要素有<br />
if ,then, and ,or<br />
&gt; ,=,&gt;=,&lt;=, is ,数值,一些关键字,如黄金客户, 单位(美金),购物车，物品... <br />
buaawhl 11:09:58<br />
where is Or ? <br />
femto 11:10:03<br />
以规则语言为中心的应用应该是 <br />
femto 11:10:07<br />
一对逻辑 <br />
江南白衣 11:10:07<br />
好，这段没有. <br />
femto 11:10:14<br />
一堆逻辑 <br /><br />
 <br />
femto 11:10:16<br />
经常修改 <br />
femto 11:10:28<br />
这样使用才有必要 <br />
femto 11:10:39<br />
否则传统的编程足够解决了 <br />
庄表伟 11:10:42<br />
白衣，那我刚才的那段，算不算规则语言？ <br />
buaawhl 11:11:03<br />
算，简单的条件循环 <br />
phalanger 11:11:19<br />
可以用数理逻辑证明一组规则是否完备，问题是所谓的完备的逻辑系统，就是现在目前大多数语言所拥有的那样子了 <br />
江南白衣 11:11:47<br />
so,ilog的语言就是 这些if,then,and ,&gt;,&lt;,is加上一些关键字的支持，这就是ilog的DSL了。<br />
你可以说它简单，但他就需要这样。<br />
然后，我们还可以分析用这个思路，其他的领域的DSL<br />
 <br />
庄表伟 11:12:04<br />
还要正常的取款机逻辑中，还要包括（三次以内，金额足够，每次取款限制） <br />
庄表伟 11:12:41<br />
要表达这种“复杂逻辑”，while语句是很自然需要的 <br />
庄表伟 11:12:46<br />
ilog里有没有？ <br />
buaawhl 11:12:51<br />
是的。我同意,iLog的语法很清楚。:-) <br />
buaawhl 11:13:40<br />
我的意思是说，VB等，一样可以这么清楚 <br />
buaawhl 11:13:51<br />
或者，我用 Javacc也可以作出这么清楚地。 <br />
phalanger 11:14:09<br />
很多语言一开始的时候都是很清楚的，慢慢发展越来越不清楚而已 <br />
magicgod 11:14:30<br />
我怀疑DSL的走向会不会象普通语言一样 <br />
buaawhl 11:15:02<br />
我怀疑DSL有没有必要。简单的东西，用什么表达都是简单的。 <br />
江南白衣 11:15:14<br />
不要只抓着ilog不放嘛，从ilog看DSL的整个思路，从java,VB这些通用语言中分离出来，只有自己最关键的关键字，还有行业特有的关键字..... <br />
buaawhl 11:15:29<br />
行业特有的关键字<br />
 <br />
buaawhl 11:15:42<br />
对。这才是关键 <br />
庄表伟 11:15:45<br />
是不是还会有项目特有的关键字？ <br /><br />
 <br />
phalanger 11:15:53<br />
一开始大家都只会有条件，循环，布尔逻辑，基本四则运算几个简单东西。但慢慢什么函数，子过程什么乱七八糟的东西就会因需求而产生，慢慢就会变得庞大 <br />
buaawhl 11:16:15<br />
最重要的积累就在这里。一个行业的业务规则变化很小。 <br />
buaawhl 11:16:41<br />
iLog的成功，完全是 行业关键字（行业API）的积累。 <br />
magicgod 11:17:00<br />
DSL是要用客户熟悉的关键字而不是程序员 <br />
buaawhl 11:17:14<br />
和DSL关系不大。DSL是用来圈地的。但是，给人一种印象，DSL是成功的关键。 <br />
magicgod 11:17:28<br />
这就是区别吧，DSL要让业务专家来设计的，而不是程序员 <br />
magicgod 11:17:43<br />
实现估计还是用传统程序来实现 <br />
buaawhl 11:18:31<br />
magicgod(2240529) 11:17:28<br />
这就是区别吧，DSL要让业务专家来设计的，<br /><br />
你的意思是说，业务专家来定义 业务关键字？ <br />
buaawhl 11:18:52<br />
还是说，业务专家 用DSL 输入那些规则？ <br />
phalanger 11:19:10<br />
业务专家的思维方式也会慢慢遵循程序员的发展过程慢慢变化的。例如某天他们会发现某着业务逻辑几个地方都会用到，于是函数/子过程的需求就会应运而生 <br />
magicgod 11:19:16<br />
是业务专家来描述DSL <br />
magicgod 11:19:28<br />
所以业务专家必须保证纯正的业务专家 <br />
buaawhl 11:19:40<br />
你是说，业务专家来定义DSL？ <br />
magicgod 11:19:43<br />
业务专家要贴近的是最终用户而不是程序员 <br />
phalanger 11:19:55<br />
不能因为别人是业务专家就扼杀别人的逻辑能力的 <br />
magicgod 11:19:55<br />
是的，其实这就是一种定义业务标准的过程 <br />
一剑倾心 11:19:59<br />
庄表伟，关于OO的哲学<br />
http://canonical.blogdriver.com/canonical/761080.html<br />
庄表伟 11:20:05<br />
不懂编程的业务专家，也定义不好DSL的吧 <br />
magicgod 11:20:16<br />
不是的，业务专家不应该懂编程 <br />
magicgod 11:20:44<br />
编程是一种附加，业务专家就象定义需求一样，根本不考虑实现的问题 <br /><br />
 <br />
magicgod 11:21:03<br />
而只提出要什么，并且用什么来描述对行业内某部分客户是最适合的 <br />
buaawhl 11:21:10<br />
DSL Tool 就是给 业务专家用来定义DSL的？ <br />
phalanger 11:21:19<br />
例如没有函数，业务专家会发现有些东西改了，他就会很辛苦的逐个去该每一个逻辑。虽然他不一定会提出“函数”这么抽象的东西，但实际上它还是有这样的需求 <br />
magicgod 11:21:48<br />
估计还得找人翻译一把，dsl tool还没这么强 <br />
buaawhl 11:21:58<br />
yes. 如果逻辑复杂到一定程度,那么dsl就失去了用武之地。 <br />
phalanger 11:22:00<br />
慢慢得当函数不能满足需求的时候，业务专家同样会提出很多很多类似于程序员需要的东西，慢慢得OO也就会出来了 <br />
magicgod 11:22:08<br />
实际上业务内的逻辑并没有相象得这么复杂 <br />
庄表伟 11:22:09<br />
突然联想到Hibernate的数据库冬眠理想，事实上是，如果不能深刻理解数据库，根本用不好Hibernate <br />
江南白衣 11:22:12<br />
我已经决定try一把之前先不讨论了:) <br />
magicgod 11:22:25<br />
DSL的目的就是为了让逻辑简单下来 <br />
buaawhl 11:22:41<br />
而简单的情况，一般的脚本描述起来也很简单。  yes. support 白衣' try. thanks.<br />
 <br />
magicgod 11:22:44<br />
阿飞给我看一下某牛人分析的WEB，其实是一张大图，象非常简单 <br />
一剑倾心 11:22:53<br />
谁先举一个现实的例子出来，认为DSL好的人拿出一个实际的例子<br />
phalanger 11:23:05<br />
事务是会发展的，java出来的时候也没有想过后来会这么复杂 <br />
magicgod 11:23:17<br />
java出来的时候已经是一个复杂的类库了 <br />
magicgod 11:23:36<br />
因为计算机语言出来大多是解决所有问题的，而不是解决小范围问题 <br />
magicgod 11:23:50<br />
现在的DSL就是为了解决小范围问题，而省去OO，甚至省去函数 <br />
江南白衣 11:24:02<br />
DSL现在一直以SQL做例子.....这是对API论最好的打击  <br />
buaawhl 11:24:08<br />
to zhuang : O R 的目的，是为了把 relation db 作为OODB来用。 <br />
magicgod 11:24:23<br />
程序员以为自己的计算机语言可以解决所有的问题，但是实际上仅仅是理论上可以解决 <br /><br />
 <br />
buaawhl 11:24:33<br />
SQL里面还有函数呢？:-) <br />
magicgod 11:24:42<br />
实际上外部限制太多了，根本无法解决所有问题 <br />
江南白衣 11:24:53<br />
但它是基于sql语言框架下的函数 <br />
buaawhl 11:24:56<br />
decode(),  to_chart()    sql需要这些API做什么？ <br />
magicgod 11:24:57<br />
所以DSL提出就解决少数问题来创建一种语言 <br />
江南白衣 11:25:12<br />
但它是基于sql语言框架下的函数  <br />
magicgod 11:25:18<br />
实际上整个SQL定义是非常简单的，相比于JDK来说 <br />
buaawhl 11:25:20<br />
  java function 也是基于 java语言框架下的函数 <br />
buaawhl 11:25:39<br />
sql能表达的东西也很简单:-) <br />
magicgod 11:25:39<br />
我觉得应该把SQL与整个JDK相比吧 <br />
magicgod 11:25:51<br />
是的，就是用简单的东西来解决简单的事 <br />
buaawhl 11:26:05<br />
比较一下功能好了。SQL可以实现 刚才 白衣给出的 规则吗？<br />
 <br />
magicgod 11:26:08<br />
因为计算机语言面向所有问题，但是客户只面向子集 <br />
庄表伟 11:26:10<br />
乱了，乱了，我们在缕一缕  <br />
江南白衣 11:26:18<br />
但java语言本身没有办法很直观的表达 select xxx from的语言。问问你喜欢用hibernate的Critera APi还是用hql? <br />
magicgod 11:26:21<br />
我们需要非常方便的子集来面向客户的子集 <br />
庄表伟 11:26:24<br />
SQL与JDK是一回事 <br />
庄表伟 11:26:37<br />
数据库与领域又是另外一回事 <br />
庄表伟 11:26:52<br />
从概念来说，我支持magicgod的我们需要非常方便的子集来面向客户的子集 <br />
 <br />
magicgod 11:26:55<br />
DSL并不是什么创新， 其实很象HTML <br /><br />
 <br />
江南白衣 11:26:58<br />
数据库查询就是一个领域阿 <br />
buaawhl 11:27:03<br />
DSL如何表达  select ... where ? <br />
庄表伟 11:27:14<br />
但是从实际的语法来说，我认为ilog这样的语法，是cobol的复辟 <br />
magicgod 11:27:19<br />
有没有觉得？HTML是XML的一个子集，用来解决浏览的问题 <br />
江南白衣 11:27:36<br />
SQL语言啊， select where是SQL DSL的关键字和特定语法。 <br />
庄表伟 11:27:37<br />
吃饭去了 <br />
buaawhl 11:27:50<br />
filter( collection,  { a = 1;} ) <br />
buaawhl 11:28:18<br />
这个 STL-like 就是 select ... where <br />
magicgod 11:28:25<br />
所以HTML流行了 <br />
江南白衣 11:28:34<br />
对阿，但是怎么大部分程序员习惯 where a=1多于<br />
filter(collection,{a=1})呢 <br />
magicgod 11:28:40<br />
但后来人们要让HTML来解决所有问题，所以XML流行了 <br />
magicgod 11:29:15<br />
感觉还是要从客户和低水平人员的角度来考虑 <br />
magicgod 11:29:27<br />
idea会过期？ <br />
江南白衣 11:29:39<br />
是阿，html,sql, DSL其实早就无处不在了。<br />
只是现在明确提出了，制造 DSL的工具。 <br />
buaawhl 11:29:42<br />
I c your point. 你是说，某个特定领域，就是某种语言才适合 <br />
magicgod 11:30:02<br />
应该是这个意思 <br />
buaawhl 11:30:12<br />
问题是我说的，那些规则表达的领域，DSL并没有表现出SQL这样的优势 <br />
buaawhl 11:30:27<br />
并没有显示出来他们特有的 适合度 <br />
buaawhl 11:30:42<br />
因为这些DSL在表达 if , then, else. <br />
magicgod 11:30:42<br />
应该说DSL总是适合的 <br /><br />
 <br />
magicgod 11:31:13<br />
因为DSL非常狡猾，如果领域扩大了，那么DSL就可以扩大为某种计算机语言，比如JAVA <br />
buaawhl 11:31:12<br />
比如，VB, pascal 等，优势不是很明显。 <br />
magicgod 11:31:24<br />
这也是DSL，只不过用来解决的领域扩大了 <br />
buaawhl 11:31:34<br />
不觉得，DSL 有表达 if, else, then 的优势。 <br />
江南白衣 11:31:32<br />
有可能， ilog的关键字太少，语法太贴近通用语言，所以优势不明显:0 <br />
magicgod 11:31:50<br />
DSL就是贴近用户来描述啊，让用户的学习成本下降 <br />
buaawhl 11:32:00<br />
yes. :-) <br />
buaawhl 11:32:23<br />
业务用语  成为 DSL关键字。 <br />
magicgod 11:32:24<br />
毕竟出发点不同，所以在细节使用方面，DSL就显示出优势 <br />
magicgod 11:32:37<br />
更重要的是DSL是业务专家来设计的，而不是计算机专家 <br />
magicgod 11:32:43<br />
我希望的是这样... <br />
buaawhl 11:32:53<br />
业务用语  成为 DSL关键字。 这才是 真正的优势。<br />
 <br />
共筑佳话 11:33:04<br />
业务专家来设计DSL，估计也贼费尽 <br />
共筑佳话 11:33:09<br />
够呛 <br />
江南白衣 11:33:14<br />
但总有语法不贴近通用语言的领域的，SQL是其一，我们平时的领域就更加了。V <br />
magicgod 11:34:13<br />
只能由业务专家来设计，因为领域内的语言由业务专家最熟 <br />
magicgod 11:34:23<br />
就象SQL是数据库领域内一样 <br />
buaawhl 11:34:27<br />
yes. 有些理解了。  同样，这些领域的特点就是 逻辑足够简单。而业务用词足够特殊 <br />
magicgod 11:34:58<br />
是的，因为就是要解决特殊的问题，没必要用解决所有问题的语言啊 <br />
magicgod 11:35:13<br />
实际上根本不存在要解决所有问题的客户 <br /><br />
 <br />
magicgod 11:35:36<br />
其实客户是不需要JAVA和JDK,只需要DSL类似描述 <br />
buaawhl 11:36:22<br />
DSL Tool能够提供这样的定义能力？不同领域的用户，都可以用同一个DSL tool 创建自己的 DSL？ <br />
magicgod 11:36:32<br />
就是看清楚了这种事，才提交DSL，并且每一个项目来创建一种DSL <br />
buaawhl 11:36:38<br />
还是说，每个行业一套 DSL? <br />
magicgod 11:37:09<br />
都可以，看你实施了 <br />
江南白衣 11:37:09<br />
DSL Tool,就是GP,JetBrains, MS努力的梦想。 <br />
buaawhl 11:37:24<br />
每个项目？这太可怕了吧? 学习成本再低，也不能这么折腾啊 <br />
magicgod 11:37:28<br />
而DSL总是业务专家这个角色来设计了 <br />
magicgod 11:37:57<br />
其实也是这样，第一个项目设计一个DSL，第二个项目改一把就行了 <br />
buaawhl 11:38:19<br />
DSL Tool的关键还是要深入 各业务领域的通用方面。 <br />
江南白衣 11:38:43<br />
内里的实现还是java,c#的lib <br />
magicgod 11:38:56<br />
是的，现在就是将真正的业务应用上去的时候了 <br />
magicgod 11:39:10<br />
抛开乱七八糟的框架和平台，用户和专家不关心这些 <br />
magicgod 11:39:36<br />
谁能直接面向需求，谁就有主动权 <br />
buaawhl 11:39:38<br />
用户和专家本来就不关心这些 ，:-) <br />
magicgod 11:39:51<br />
IBM的随需而动是有点道理的 <br />
buaawhl 11:40:04<br />
不用DSL, 他们也从来不关心这些。:-) <br />
magicgod 11:40:06<br />
但是现在程序员限制了用户和专家，必须来考虑这些问题了 <br />
buaawhl 11:40:27<br />
用了DSL,他们反而要关心这些, <br />
buaawhl 11:40:45<br />
江南白衣(228013) 11:38:43<br />
内里的实现还是java,c#的lib <br /><br />
 <br />
magicgod 11:40:55<br />
不会吧，DSL本来是没有这些细节的 <br />
buaawhl 11:41:12<br />
如果以前要关心java, c#，那么现在不仅要关心java, c#,还要关心 DSL. <br />
buaawhl 11:41:41<br />
那你说，以前业务专家为什么要关系 java, c# ? <br />
buaawhl 11:42:01<br />
他们只是做业务分析。 <br />
magicgod 11:43:07<br />
因为程序员要关心 <br />
magicgod 11:43:31<br />
程序员反馈给业务专家说这个java不支持 <br />
magicgod 11:44:00<br />
而现在DSL希望能完全解决行业问题吧 <br />
buaawhl 11:44:40<br />
DSL下面的实现不还是java吗？程序员反馈给业务专家说这个java不支持 <br /><br />
 <br />
江南白衣 11:44:42<br />
DSL是需要转译成Java，C# lib的，天上暂时还没馅饼下来  <br />
magicgod 11:44:55<br />
本来也就是这样的 <br />
magicgod 11:45:17<br />
就算编译了，也是要转成硬件代码的嘛 <br />
buaawhl 11:45:26<br />
所以，专家定义DSL的同时，还要考虑java是否支持 <br />
江南白衣 11:46:20<br />
有直接翻译成机器码和翻译成java,c#的选择，<br />
显然直接翻译成机器码的难度大NN倍。 <br />
magicgod 11:46:36<br />
估计是假定java全支持了吧 <br />
magicgod 11:46:37<br />
因为毕竟DSL是子集 <br />
buaawhl 11:47:08<br />
yes. :-)  <br />
magicgod 11:47:09<br />
正在试用mps <br />
buaawhl 11:47:49<br />
如果DSL Tool考虑了Java支持。那么专家就不用考虑了。 <br />
magicgod 11:48:29<br />
是的，估计是这样想的 <br />
magicgod 11:48:53<br />
DSL是朴素的经验主义向理论发展的产物 <br /><br />
 <br />
magicgod 11:49:51<br />
定义一个DSL真是复杂啊，非得有人辅助不可啊 <br />
共筑佳话 11:50:12<br />
专家应该知道些什么呢，达到了什么层次的知识？ <br />
buaawhl 11:50:45<br />
DSL可以看作是一种数据格式，一种配置文件的格式定义。 <br />
magicgod 11:50:47<br />
这个概念定义跟类定义不是一样啊？ft <br />
magicgod 11:51:07<br />
专家角色应该只知道业务知识，其他不懂，假定，哈哈 <br />
buaawhl 11:51:35<br />
一开始，DSL还是摆脱不了 Programm Languange的框子，明天会更好!!!! <br />
共筑佳话 11:51:51<br />
什么层次的知识？是元层次？元元层次？ <br />
magicgod 11:52:29<br />
见鬼了，这东西一定是给程序员用的 <br />
magicgod 11:52:34<br />
干脆定义类算了 <br />
buaawhl 11:52:46<br />
一开始，DSL还是摆脱不了 Programm Languange的框子，明天会更好!!!!   <br />
江南白衣 11:54:27<br />
另外magic god可以留意一下MPS同时定制IDE方面的功能，这是以前yacc没有的 <br />
buaawhl 11:55:37<br />
我们还是要忙着写API, 到时候，用DSL包装成关键字 就行了 <br />
江南白衣 11:56:54<br />
magic god可以上班时间试mps,太爽了 <br />
江南白衣 11:57:02<br />
一定是PM以上级别:) <br />
江南白衣 11:57:59<br />
还有那些11点就喊着去吃饭的..... <br />
magicgod 12:03:58<br />
恐怖，这个操作太可怕了 <br />
magicgod 12:05:32<br />
rubyWeb? <br />
magicgod 12:08:41<br />
代码生成居然有错？！ <br />
江南白衣 12:15:47<br />
加油 <br /><br /><br /><br />
magicgod(2240529) 12:49:15<br />
 更象一个代码生成器 <br />
magicgod(2240529) 12:49:46<br />
还把我的ctrl+space给废了 <br />
magicgod(2240529) 12:50:19<br />
这个生成器好象有点太直接了一点 <br />
magicgod(2240529) 12:50:53<br />
举的例子实在不恰当啊，这回JETBRAINS有点乱了 <br />
magicgod(2240529) 12:51:49<br />
BUG也太多了一点，需要写一些行业例子，这样就有代表性了 <br /><br />
magicgod(2240529) 12:56:28<br />
至少比PETSTORE更高一级的案例，然后用这个案例来套各种方案和工具比较好一点 <br />
magicgod(2240529) 12:56:52<br />
这个HELLOWORLD 最后生成了JAVA代码，有点恐怖<br /><img src ="http://www.blogjava.net/wadise/aggbug/41987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2006-04-19 19:16 <a href="http://www.blogjava.net/wadise/archive/2006/04/19/41987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>贫血的领域模型</title><link>http://www.blogjava.net/wadise/archive/2005/12/16/24209.html</link><dc:creator>wadise</dc:creator><author>wadise</author><pubDate>Fri, 16 Dec 2005 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/wadise/archive/2005/12/16/24209.html</guid><wfw:comment>http://www.blogjava.net/wadise/comments/24209.html</wfw:comment><comments>http://www.blogjava.net/wadise/archive/2005/12/16/24209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wadise/comments/commentRss/24209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wadise/services/trackbacks/24209.html</trackback:ping><description><![CDATA[<FONT size=1>在Martin Fowler文章</FONT><A href="http://www.martinfowler.com/bliki/AnemicDomainModel.html"><FONT size=1>http://www.martinfowler.com/bliki/AnemicDomainModel.html</FONT></A><FONT size=1>中指出现在出现越来越多的贫血领域模型(anemia domain model)。那么贫血领域模型的概念是什么呢？老马指出：<BR><BR></FONT><FONT color=#000000><FONT size=1><FONT size=+0><EM><FONT size=1>There are objects, many named after the nouns in the domain space, and these objects are connected with the rich relationships and structure that true domain models have. The catch comes when you look at the behavior, and you realize that there is very little behavior on these objects. Indeed often these models come with design rules that say that you are not to put any domain logic in the the domain objects. Instead there are a set of service objects which capture all the domain logic. These services live on top of the domain model and use the domain model for data.</FONT><BR></EM></FONT><BR></FONT><FONT size=+0><FONT size=1>也就是说在领域模型中，本身只处理很少的行为逻辑，大多数都是处在模型上层的一系列的Service类来负责捕获处理这些领域逻辑行为。这违背了OO思想（OO认为应该把数据和行为合在一起）。<BR><BR>Eric Evans在他的Domain Driven Design中说过：<BR></FONT>
<BLOCKQUOTE><I><FONT size=1>Application Layer [his name for Service Layer]: Defines the jobs the software is supposed to do and directs the expressive domain objects to work out problems. The tasks this layer is responsible for are meaningful to the business or necessary for interaction with the application layers of other systems. This layer is kept thin. It does not contain business rules or knowledge, but only coordinates tasks and delegates work to collaborations of domain objects in the next layer down. It does not have state reflecting the business situation, but it can have state that reflects the progress of a task for the user or the program.</FONT></I></BLOCKQUOTE>
<BLOCKQUOTE><I><FONT size=1>Domain Layer (or Model Layer): Responsible for representing concepts of the business, information about the business situation, and business rules. State that reflects the business situation is controlled and used here, even though the technical details of storing it are delegated to the infrastructure. This layer is the heart of business software.<BR><BR><BR></FONT></I></BLOCKQUOTE>
<P><FONT size=1>据说在Thoughtwork公司里面采用的技术是Hibernate+Spring+webwork，关于anemia domain model有不少员工在公司内部邮件中发问老马应该什么正确使用。但是老马还没有给出确切答案，只放入TODOList去。<BR>我个人觉的Domail类中不应该含有过多的与之无关的行为，不但违反了单一职责的原则，还使得整个系统不够稳定。例如User中有Roles，那么addRole,removeRole自然应在Domain类User中写，至于removeUser,loadUser等应该封装成Dao去处理。<BR><BR>引用robbin在一次讨论中的回复：<BR><BR></FONT><FONT size=1><SPAN class=postbody><EM>我的理解是Martin大叔所谓的domain object是“<SPAN style="COLOR: red">领域模型</SPAN>”，它是一个针对业务逻辑抽象的模型，和软件编程根本毫无关系。即使你不开发这个软件，你仍然需要抽象你的业务逻辑得到你的领域模型。<SPAN style="COLOR: red">这个领域指的是你所从事的行业，而不是狭隘的持久化类</SPAN>。 <BR><BR>并且领域模型的建模也是在需求分析阶段，或者在需求分析阶段之前完成的事情。具体到编程的过程中，领域模型并非对应某一个Java类，如果一定要强行对应的话，（业务对象，Dao接口，Hibernate实体类）他们合起来统称领域模型在Java语言的实现。把 <SPAN style="COLOR: red">商业建模范畴的“领域模型”拿来当做Hibernate编程中的实体类，根本就是牛头不对马嘴</SPAN>!<BR></EM></SPAN><BR><EM>其实你的主张就是把持久化实体类的持久化操作附着到实体类上面去，而不是分开。举例来说，也就是说Account类的增删改查不应该单独分离到AccountDao接口去，而应该把增删改查操作放在Account类里面来完成，对不？ </EM></FONT></P>
<P><FONT size=1><EM>那么我在解释这个问题之前，必须澄清一点，就是这个问题的讨论，即持久化操作是否应该单独抽象一个DAO层的问题是和Martin Fowler提到了贫血的领域模型毫无关系的。实际上传统的Entity Bean就是这种把持久化操作附着到Entity Bean本身去的，但是Martin Fowler一样在说，这种Entity Bean就是贫血的。 </EM></FONT></P>
<P><FONT size=1><EM>好了，我们现在把其他无关因素排除了，focus到这个话题上，就是我们是否需要DAO接口的问题了。因为按照你的观点，如果把对象的增删改查都放在实体类上面，其实我们就不需要DAO接口层了，业务对象和Web Action都可以直接调用实体类本身来完成持久化操作了。 </EM></FONT></P>
<P><FONT size=1><EM>大概在2003年以前，我一直就是采用这种模型的，但是从2003年开始，我就改成了分离一个DAO层来专门处理持久化操作了。原因是多方面的，从技术角度来考量的话，分离就有很多好处，Rod Johnson在《without EJB》第10章持久化里面就详细阐述了需要DAO层的理由，我建议你看一下，这里不复述了。只谈一下除了Rod Johson提到理由之外的理由： </EM></FONT></P>
<P><FONT size=1><EM>作为保持状态的实体类，他的职责是保持状态，而不负责状态的持久化。如果把持久化操作也放在实体类中，一方面来说，把两种不同的职责放在一个类中，并不符合OCP的单一职责的原则，然而更重要的原因是会带来实体类的不稳定的问题。 </EM></FONT></P>
<P><FONT size=1><EM>在我的理念中，实体类以及实体类关联关系是一个软件系统中最稳定不变的部分，在整个软件系统中，各个层面都需要涉及到实体类的操作，如何划分实体类，以及确定实体类关联是最费考量的，确定了这一点，整个软件系统就底层依赖关系就被确定下来了（实体类的属性可以变化，由于软件系统对实体的操作都是以实体类为单位的，所以实体属性的变化不会造成系统不稳定），上面的DAO层，业务层，Web层都只对实体类产生单向依赖。 </EM></FONT></P>
<P><FONT size=1><EM>如果你把DAO层合并到实体类中，请注意本来Web层是不依赖于DAO层的，Web层只依赖实体类（因为它要展现实体类状态），但是由于你合并了，使得Web层也变得依赖那些DAO层的操作了。这样的结果就是让软件系统的耦合性提高，可伸缩性降低，可维护性降低。 </EM></FONT></P>
<P><FONT size=1><EM>DAO层的变动是大于实体类变动的，实体类基本上稳定不变，而软件系统的需求变更几乎一定会带来DAO层的变动，但是并不会带来实体类层的变动（会带来实体属性的变动，但是很少会影响到实体类本身）。所以DAO层的变动频率远远大于实体类。那么当你把DAO层操作合并到实体类以后，其结果就是让实体类的变动频率等于DAO层的变动频率。那么就会造成本来稳定的实体类层变得变得频率高了很多，而实体类的变动会波及到软件系统的每个层面，造成软件大面积的相关性和不稳定。 </EM></FONT></P>
<P><FONT size=1><EM>请记住很重要的一点：实体类是有状态的类，DAO类是无状态的类，在整个软件系统中，只有两种类有状态，一个是实体类，一个是HTTP Session。有状态的类会带来很高的代码相关性，应该尽量减少有状态类的影响范围，尽量减少有状态类的变动频率，应该尽量减少有状态类的职责。 </EM></FONT></P>
<P><FONT size=1><EM>而你把DAO操作合并到实体类以后，结果就是扩大了有状态类的代码相关性的范围和影响范围，扩大了有状态类的变动频率，最后就造成软件系统的稳定性下降。</EM></FONT></P></FONT></FONT><img src ="http://www.blogjava.net/wadise/aggbug/24209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wadise/" target="_blank">wadise</a> 2005-12-16 14:52 <a href="http://www.blogjava.net/wadise/archive/2005/12/16/24209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>