精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-01-27
xml不适合做逻辑早就是老生常谈了。所以,如果只是用xml实现一些在java里面很容易搞定的if/else之流,确实是自己找罪受。
但是,事务都有两面,我们要用辩证唯物主义的观点来看待矛盾。 也不是说拿xml写逻辑就一无是处。对java所不擅长的那部分逻辑,用xml也是一法(当然,用脚本也是可行的) 那么,什么逻辑java这类传统的oo语言不擅长?就是所谓的“高阶逻辑”了。 比如rule engine,即使产品提供了api可以让你用java来操作规则,其语法也一定非常繁琐难看。 再比如ioc容器,好好的"new A(new B(),new C())",在pico那里变成: "new ConstructorComponentAdapter(A.class, new Parameter[]{new ComponentParameter(new ConstructorComponentAdapter(B.class)), new ComponentParameter(new ConstructorComponentAdapter(C.class))})" 烦的要死(我这个pico代码只是示意,不一定准确)。 要是再稍微加点逻辑进去,比如: B b = new B();; C c = b.getC();; new A(b, c, c.getName(););; 老大,用pico的手工配置方式在java里面写,等着发疯吧。 为什么不能在java里面直接new A(new B(), new C())呢?因为组件依赖注射是个高阶逻辑,这里面除了动态加载类之外,还有类似auto-wiring之类的服务被封装在高阶逻辑里面。 此时,直接拿java之类的传统oo语言就力不从心了。 可以有两个解决方案: 1。脚本。利用某些支持高阶逻辑的脚本,我们可以写出最简洁的代码: ctor {class="A", args=[ctor "B", ctor "C"]} 以及 do b <- ctor "B" c <- method b "getC" ctor {class="A" args=[b, c, method c "getName"]} 2。xml写逻辑,可能结果是这样: <ctor class="A"> <args> <ctor class="B"/> <ctor class="C"/> </args> </ctor> 以及 <sequence id="a"> <ctor var = "b" class="B"/> <method var="c" component="b" name="getC"/> <method var="name" component="c" name="getName"/> <ctor class="A" args="$b,$c,$name"/> </sequence> 无论如何,此时xml写逻辑比用java写要简洁清楚多了。 |
|
返回顶楼 | |
发表时间:2006-02-03
我觉得用xml来表达逻辑也没啥不好的, 关键是得有UI来配合,
象一些描述语言, 象RDL(Report Definition Language), DSL (Domain-Specific Language ), 都是基于xml的, 我想原因是因为xml容易parse, UI实现起来比较简单。 |
|
返回顶楼 | |
发表时间:2006-02-04
B b = new B();; C c = b.getC();; new A(b, c, c.getName(););; 是否考虑过,如果直接用教本表达? 而不是xml配置呢? <ctor class="A"> <args> <ctor class="B"/> <ctor class="C"/> </args> </ctor> 确实有其方便之处,问题是你必须为了解析这样的配置写一一对应的解析代码。扩展性会很差的。 |
|
返回顶楼 | |