`

项目所得:一个非典型性改动带来的思考(一) 之问题引入

阅读更多

引言: 这些天项目中做了一个改动, 为了后续行文方便,我们给这个改动起个绰号,称之为"非典型改动". 围绕这个改动,我想了很多, 几乎贯穿了整个项目所用的技术. 现在我想整理下来,作为以后的一个参考, (不敢写"若对别人有所帮助我也甚感欣慰"这样的话了, 因为这些天写博客写的有些伤心, :-) ).
----------------------------------------
这是一个真实的故事.

事情是这样的. 项目中的一个类,对这个类中一属性的判断规则是在代码里写死的. 由于现在的判断标准很简单,它们都是在代码中写死的. 现在要改, 把判断标准改放到数据库里, 而且判断标准要复杂了些.
为了更形象地描述这个问题, 也为了后续博客中写的方便, 在这篇博客里在下用一个简单的模型来描述下.

假设有一个类, Student, 它的属性如下.

class Student{
String id;
int age;
double score;
}

结合这个类把现在项目中的问题描述下. 我们知道,现在确定一个Student是否通过一个考试是看他的分数是否大于60, 现在判断标准改了, 它的规则如下:
如果 age > 20 && age < 21 && score > 65, --> "恭喜你, 过关了"
如果 age > 15 && age < 20 && score > 55, --> "恭喜你, 过关了"
............
也就是说判断的标准考虑到年龄因素了, 这样的组合有很多种, 于是判断组合是写在了数据库, 而且"老师"可以随时更改判断标准.

再回到项目中, 现在的问题是:
1, 项目中对一个Student是否通过考试的判断很多,也很散, 有在action中的, 也有在底层DAO实现的.
2, 项目中用的Hibernate怎么来描述判断标准.

这篇先到这里, 在下一篇中将写第一个问题引发的思考.

 

分享到:
评论
9 楼 kunee 2009-05-05  
funnywiser 写道
这个问题就是规则引擎的擅长解决的问题。
规则引擎就是把逻辑判断的各种处理和算法,不在程序中实现,而采用规则包的形式在外面配置,然后通过一个引擎来解析他。
目前开源的规则引擎有很多,最有名的就是JBoss的Drools,但是这类规则引擎都有一个缺点。就是其基于的算法都是基于推理类的算法,是采用匹配的方式来执行的。
如果你要实现上面的逻辑,那你必须将数据库中的数据,先逐条放到对象中,然后将对象传递给规则执行。最后,你在将处理完之后的对象,放回到数据库中。其逻辑执行的轨迹是在运行时决定的,主要是其算法有点智能型的,因此你需要动些脑筋,好好分析的数据结构模型以及算法的逻辑性,以保证其执行轨迹是按照你设想的方式运行。另外你还要深入理解一下rete算法。
商用的用Ilog的JRules,以及Blaze的产品。但这些产品都比较贵。
国内公司也有做的,比如flagleader的VisualRules,这个公司的产品不是基于rete算法的,比较适合这类逻辑的开发,也可以参考试用一下。
另外一种方式,就是自己做一个语法解析器,做一个动态语言的解析功能。以前也有做过的方式,是采用Excel来实现这些逻辑的设置,然后解析Excel来运行。这也是一种方式。


看来这位是过来人。

偶们系统经历了 Bean Shell -> SP -> Drools的过程,ILOG实在太贵了
8 楼 funnywiser 2009-05-04  
这个问题就是规则引擎的擅长解决的问题。
规则引擎就是把逻辑判断的各种处理和算法,不在程序中实现,而采用规则包的形式在外面配置,然后通过一个引擎来解析他。
目前开源的规则引擎有很多,最有名的就是JBoss的Drools,但是这类规则引擎都有一个缺点。就是其基于的算法都是基于推理类的算法,是采用匹配的方式来执行的。
如果你要实现上面的逻辑,那你必须将数据库中的数据,先逐条放到对象中,然后将对象传递给规则执行。最后,你在将处理完之后的对象,放回到数据库中。其逻辑执行的轨迹是在运行时决定的,主要是其算法有点智能型的,因此你需要动些脑筋,好好分析的数据结构模型以及算法的逻辑性,以保证其执行轨迹是按照你设想的方式运行。另外你还要深入理解一下rete算法。
商用的用Ilog的JRules,以及Blaze的产品。但这些产品都比较贵。
国内公司也有做的,比如flagleader的VisualRules,这个公司的产品不是基于rete算法的,比较适合这类逻辑的开发,也可以参考试用一下。
另外一种方式,就是自己做一个语法解析器,做一个动态语言的解析功能。以前也有做过的方式,是采用Excel来实现这些逻辑的设置,然后解析Excel来运行。这也是一种方式。
7 楼 kunee 2009-05-04  
看是不是生产型系统了,所以是不是生产型系统的意思是发布时间有规定,比如7*XX小时不允许动。

代码发布工作困难,常变动业务我们通常做成存储过程,当然你能做成配置的更好。


如果性能压力不大,BEAN SHELL会是一个很好的选择
6 楼 rmn190 2009-03-14  
mock1234 写道

rmn190 写道

结合这个类把现在项目中的问题描述下. 我们知道,现在确定一个Student是否通过一个考试是看他的分数是否大于60, 现在判断标准改了, 它的规则如下: 如果 age &gt; 20 &amp;&amp; age &lt; 21 &amp;&amp; score &gt; 65, --&gt; "恭喜你, 过关了"如果 age &gt; 15 &amp;&amp; age &lt; 20 &amp;&amp; score &gt; 55, --&gt; "恭喜你, 过关了"............也就是说判断的标准考虑到年龄因素了, 这样的组合有很多种, 于是判断组合是写在了数据库, 而且"老师"可以随时更改判断标准. 再回到项目中, 现在的问题是:1, 项目中对一个Student是否通过考试的判断很多,也很散, 有在action中的, 也有在底层DAO实现的. 2, 项目中用的Hibernate怎么来描述判断标准.
&nbsp;
&nbsp;
谁有这个职责?
&nbsp;
在你的设计中,随便!谁爱用score谁就判断。实际上你言不由衷。既然你的设计中负责“判断标准”职责的对象根本不存在,“现在判断标准改了”是什么意思?谁把标准改了?你自己根本说不清楚改这个标准又是谁干的!
&nbsp;
在你的设计思路中,纯粹是比较低级的数据库编程思路,还没有按照领域来建模,还没有体现职责归属于谁,连基本的类型设计都还没有掌握(更不要谈动态建模)。




谢谢mock1234的回答, 我这里稍微解释下, 这里的Student例子是用来说明项目中固有的一个问题.前段时间我的工作就是在业务逻辑变更后,在代码实现上做相应的修改.

很感谢mock1234所提到的设计上概念(尤其是"动态建模"这个概念),从这个问题中,我切身地体会到优良设计对一个项目成功或可扩展性方面所起的至关重要作用.


再次感谢!
5 楼 fox.tan 2009-03-14  
在Student类中加入一个pass标志,service层加载Student类时根据判断规则设置pass标志。判断规则可以在spring中设置。
4 楼 ji824 2009-02-26  
纯业务,放在action里啊
3 楼 抛出异常的爱 2009-02-26  
org.apache.common.collectons.
这个包下的.
它可以把 好多 if 放到一起....
还可以组合.
2 楼 rmn190 2009-02-25  
抛出异常的爱 写道
如果放在java中Predicate很好用....


能否说明下Predicate具体是指?

谢谢.
1 楼 抛出异常的爱 2009-02-25  
--决策...有时放到数据库中.
如果放在java中Predicate很好用....

相关推荐

Global site tag (gtag.js) - Google Analytics