- 浏览: 927856 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (322)
- Hibernate研究&源码 (27)
- Server (10)
- Coder碎语 (64)
- EnglishMulling (11)
- About XML (1)
- persistence (12)
- Core Java & OO (23)
- Java EE (6)
- JavaScript/JSON/Ajax/ext... (22)
- 我的读书笔记 (16)
- Source Codes Study (29)
- workFlow/jBPM (22)
- OFBiz: Open For Business (1)
- 项目积累 (21)
- srcStudy_acegi (1)
- Cache/Ehcache... (9)
- Java Test/JUnit.. (7)
- maven/ant (2)
- 设计模式 (1)
- SOA/cxf/ws-security (2)
- Android (4)
- 云计算/Hadoop (2)
- 加密/签名 (1)
- 正则表达式 (1)
- htmlparser (1)
- 操作系统 (5)
- DB (1)
最新评论
-
天使建站:
这里这篇文章更详细 还有完整的实例演示:js跳出循环 ...
jQuery中each的break和continue -
heshifk:
刚刚我也遇到同样的问题,然后就在纠结为什么不能直接使用brea ...
jQuery中each的break和continue -
masuweng:
不错写的.
集万千宠爱于一身的SessionImpl:get研究(四): Hibernate源码研究碎得(8) -
muzi131313:
这个老是忘,做一下笔记还是挺好的
jQuery中each的break和continue -
lg068:
data = data.replace("\n&qu ...
项目小经验: eval与回车符
引言: 这些天项目中做了一个改动, 为了后续行文方便,我们给这个改动起个绰号,称之为"非典型改动". 围绕这个改动,我想了很多,
几乎贯穿了整个项目所用的技术. 现在我想整理下来,作为以后的一个参考, (不敢写"若对别人有所帮助我也甚感欣慰"这样的话了,
因为这些天写博客写的有些伤心, :-) ).
----------------------------------------
这是一个真实的故事.
事情是这样的. 项目中的一个类,对这个类中一属性的判断规则是在代码里写死的. 由于现在的判断标准很简单,它们都是在代码中写死的. 现在要改, 把判断标准改放到数据库里, 而且判断标准要复杂了些.
为了更形象地描述这个问题, 也为了后续博客中写的方便, 在这篇博客里在下用一个简单的模型来描述下.
假设有一个类, 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怎么来描述判断标准.
这篇先到这里, 在下一篇中将写第一个问题引发的思考.
评论
规则引擎就是把逻辑判断的各种处理和算法,不在程序中实现,而采用规则包的形式在外面配置,然后通过一个引擎来解析他。
目前开源的规则引擎有很多,最有名的就是JBoss的Drools,但是这类规则引擎都有一个缺点。就是其基于的算法都是基于推理类的算法,是采用匹配的方式来执行的。
如果你要实现上面的逻辑,那你必须将数据库中的数据,先逐条放到对象中,然后将对象传递给规则执行。最后,你在将处理完之后的对象,放回到数据库中。其逻辑执行的轨迹是在运行时决定的,主要是其算法有点智能型的,因此你需要动些脑筋,好好分析的数据结构模型以及算法的逻辑性,以保证其执行轨迹是按照你设想的方式运行。另外你还要深入理解一下rete算法。
商用的用Ilog的JRules,以及Blaze的产品。但这些产品都比较贵。
国内公司也有做的,比如flagleader的VisualRules,这个公司的产品不是基于rete算法的,比较适合这类逻辑的开发,也可以参考试用一下。
另外一种方式,就是自己做一个语法解析器,做一个动态语言的解析功能。以前也有做过的方式,是采用Excel来实现这些逻辑的设置,然后解析Excel来运行。这也是一种方式。
看来这位是过来人。
偶们系统经历了 Bean Shell -> SP -> Drools的过程,ILOG实在太贵了
规则引擎就是把逻辑判断的各种处理和算法,不在程序中实现,而采用规则包的形式在外面配置,然后通过一个引擎来解析他。
目前开源的规则引擎有很多,最有名的就是JBoss的Drools,但是这类规则引擎都有一个缺点。就是其基于的算法都是基于推理类的算法,是采用匹配的方式来执行的。
如果你要实现上面的逻辑,那你必须将数据库中的数据,先逐条放到对象中,然后将对象传递给规则执行。最后,你在将处理完之后的对象,放回到数据库中。其逻辑执行的轨迹是在运行时决定的,主要是其算法有点智能型的,因此你需要动些脑筋,好好分析的数据结构模型以及算法的逻辑性,以保证其执行轨迹是按照你设想的方式运行。另外你还要深入理解一下rete算法。
商用的用Ilog的JRules,以及Blaze的产品。但这些产品都比较贵。
国内公司也有做的,比如flagleader的VisualRules,这个公司的产品不是基于rete算法的,比较适合这类逻辑的开发,也可以参考试用一下。
另外一种方式,就是自己做一个语法解析器,做一个动态语言的解析功能。以前也有做过的方式,是采用Excel来实现这些逻辑的设置,然后解析Excel来运行。这也是一种方式。
代码发布工作困难,常变动业务我们通常做成存储过程,当然你能做成配置的更好。
如果性能压力不大,BEAN SHELL会是一个很好的选择
rmn190 写道
结合这个类把现在项目中的问题描述下. 我们知道,现在确定一个Student是否通过一个考试是看他的分数是否大于60, 现在判断标准改了, 它的规则如下: 如果 age > 20 && age < 21 && score > 65, --> "恭喜你, 过关了"如果 age > 15 && age < 20 && score > 55, --> "恭喜你, 过关了"............也就是说判断的标准考虑到年龄因素了, 这样的组合有很多种, 于是判断组合是写在了数据库, 而且"老师"可以随时更改判断标准. 再回到项目中, 现在的问题是:1, 项目中对一个Student是否通过考试的判断很多,也很散, 有在action中的, 也有在底层DAO实现的. 2, 项目中用的Hibernate怎么来描述判断标准.
谁有这个职责?
在你的设计中,随便!谁爱用score谁就判断。实际上你言不由衷。既然你的设计中负责“判断标准”职责的对象根本不存在,“现在判断标准改了”是什么意思?谁把标准改了?你自己根本说不清楚改这个标准又是谁干的!
在你的设计思路中,纯粹是比较低级的数据库编程思路,还没有按照领域来建模,还没有体现职责归属于谁,连基本的类型设计都还没有掌握(更不要谈动态建模)。
谢谢mock1234的回答, 我这里稍微解释下, 这里的Student例子是用来说明项目中固有的一个问题.前段时间我的工作就是在业务逻辑变更后,在代码实现上做相应的修改.
很感谢mock1234所提到的设计上概念(尤其是"动态建模"这个概念),从这个问题中,我切身地体会到优良设计对一个项目成功或可扩展性方面所起的至关重要作用.
再次感谢!
这个包下的.
它可以把 好多 if 放到一起....
还可以组合.
能否说明下Predicate具体是指?
谢谢.
如果放在java中Predicate很好用....
发表评论
-
ant打jar包时, 怎么把所依赖的jar包与从源码中编译过来class文件合并成最终的一个jar?
2011-08-03 09:53 8018实验用例子的总体结构是这样的: ... -
List内容生成Excel文件的一个工具
2010-10-27 15:38 1439什么也不用说,直接上传代码,里面有个测试类,一看便 ... -
JSP中分情况下地set一个var
2010-10-22 15:49 1185做项目时,有些匆忙,没来得急细想,现在有些闲了,静下心来 ... -
同一个表记录某列值拷到对应列中
2010-09-29 17:52 1228我想在mysql数据库同一表中,把一条记录的值赋给另 ... -
Google docs不能上的解决办法
2010-09-28 11:28 1587自己大概有N个G的东西在Google docs上, 这些天它经 ... -
Maven管理项目切换到Eclipse环境bat脚本
2010-09-28 09:14 3397手头一个Maven管理的项目,默认情况下是用Idea开发 ... -
用jQuery来查找Option的text
2010-06-24 17:41 5190问题起引:页面中显示Table,它里面显示的是各分公司的统计数 ... -
style="display:block;"在FireFox中跳格问题
2010-06-04 11:17 2499用block时,跳格如下所示: ... -
好久没写JSP的后果
2009-04-24 08:31 1486有些日子没写JSP了, 今天干一个活时用JSP竟然出了不少错误 ... -
Java反编译: 最终用了JD.
2009-04-18 09:58 1823前些天帮一个朋友反编译一class文件, 第一时 ... -
jFreeChart收藏,大家就不必看了
2009-04-06 17:21 1365几点说明: 1, 例子来源: http://www.ite ... -
乱码(六): Linux下文件(夹)名乱码的解决
2009-03-31 08:27 4804问题见乱码(五): Linux下如何把乱码的文 ... -
乱码(五): Linux下如何把乱码的文件名转为正常?
2009-03-30 08:47 2724前面文件上传时的乱码问题告一段落了, 不过一个 ... -
乱码(四): 撬动地球的支点
2009-03-29 07:59 928写下这个标题 ... -
乱码(三): 问题的出发点
2009-03-28 09:38 1361在乱码(一): 北京西直门迷路与乱码困惑 里, 笔 ... -
乱码(二): Linux下/etc/sysconfig/i18n究竟是干什么用的?
2009-03-27 06:37 4384这些天解决乱码问题过程中,跟Linux下/etc/sysc ... -
乱码(一): 北京西直门迷路与乱码困惑
2009-03-25 08:18 1388在北京,如 ... -
小配下分布式事务管理
2009-03-03 17:18 1276由于项目要求, 需要配置下分布式事务管理.问题是这 ... -
项目所得:一个非典型性改动带来的思考(三) 之项目设计
2009-02-27 11:06 1151------------------------------- ... -
项目所得:一个非典型性改动带来的思考(二) 之对第一个问题的思考
2009-02-26 14:16 1214上篇 里以一个简化的例子把问题描述了下, 这里将当时引发的思考 ...
相关推荐
在移动应用开发领域,uni-app是一个备受开发者欢迎的框架,它允许开发者使用一套代码库构建跨平台的应用程序,支持iOS、Android、微信小程序、支付宝小程序等多个平台。而UView UI则是一款专为uni-app设计的组件库,...
附表一“一个具体风险对项目主要目标的风险影响对照表”提供了一种量化评估风险影响的方法,通过顺序度量、线性度量和非线性度量三个维度,来衡量风险对成本、进度、范围和质量四个关键项目目标的影响。 1. **成本*...
本文档将详细讲解其中一个显著的改动:按下F3键自动触发DataGrid排序功能的改变,并提供应对策略。 **F3按键行为的改变** 在.NET Framework及之前的版本中,WPF的DataGrid控件并未对F3键有特定的行为定义。然而,...
然后创建一个切面类,并使用`@AspectJ`和`@DeclareParents`注解来实现引入: ```java @Aspect public class DebuggableAspect { @DeclareParents(value = "com.example.Calculator+", defaultImpl = ...
在ANSYS 14.5版本中,对单元模型进行了重大更新,这涉及到对旧有单元的支持取消以及引入了一系列新的单元。这些改动对于用户来说,意味着需要调整原有的模型构建策略,以便更好地利用新版本的功能。 首先,让我们...
在本案例中,公司需要使用一个第三方接口的加密jar包,该jar包内部依赖的高版本与现有项目框架中的低版本冲突。以下是如何实现Maven项目中多版本依赖兼容的解决方案: 1. **理解Maven依赖管理**: Maven依赖管理...
总结起来,`.NET 5`对WPF和WinForms的`OutputType`重定向至`WinExe`是一个重要的破坏性改动,旨在提供更好的兼容性和性能。开发者应当了解这一变化,并在升级到.NET 5时检查和更新项目配置,以避免潜在的不兼容性和...
假设我们需要编写一个程序,其中包含一个功能为隐藏光标的小函数。虽然这个函数的内部实现可能非常复杂,但对于使用它的程序员来说,只需要知道如何调用即可,无需了解其实现细节。这样的封装不仅提高了代码的复用率...
在这个“NET委托:一个C#睡前故事”中,通过类比的方式,讲述了委托如何帮助解决程序员在设计中的问题。 故事中的彼得代表了一个类,他的老板则代表了需要调用彼得方法的其他部分。老板希望随时得知彼得的工作进度...
工程项目管理的主要任务是寻找并确立项目目标,定义项目,并对项目进行详细的技术经济论证,使整个项目建立在可靠的、坚实的、优化的基础之上。 工程项目的前期策划阶段是指工程项目的构思到项目批准,正式立项为止...
在IT行业中,Web项目的开发和维护是一个复杂的过程,其中测试环节尤为重要。为了确保Web应用程序的稳定性和性能,开发者和测试人员通常会使用各种专门的测试工具。本文将深入探讨一个名为"web项目的一个测试工具"的...
毕业设计通常是一个综合性的项目,它要求学生运用所学的理论知识解决实际问题,而C#作为.NET框架下的主要开发语言,其强大的功能和灵活性使得它成为许多软件开发项目的首选。 在C#毕业设计中,子函数(也称为方法或...
在IT领域,软件维护是软件开发过程中的一个重要环节,尤其对于高级IT专业人士,如信息系统项目管理师来说,理解和掌握软件维护的基本概念至关重要。软件维护被认为是软件生命周期中最持久且成本最高的阶段,因此,...
4. 回归测试:在修改问题后,再次进行全面测试,确保改动未引入新的问题。 四、质量保证与测试 此阶段确保产品的质量与性能: 1. 测试计划:制定详细的测试策略,包括功能测试、性能测试、兼容性测试等。 2. 自动化...
这个程序适用于公司内部所有新物料的引入,包括从未使用过的物料、设计或规格改动后的物料、新供应商提供的物料以及原供应商新增的物料。 3. 定义: 新物料是指在生产过程中未曾使用或经过设计、规格、制程等变更的...
在Delphi编程环境中,开发一个能够监视文件夹变动的应用程序是一项常见的需求,特别是在实时数据同步、日志跟踪或文件系统监控等场景下。本项目名为"Delphi 监视文件夹改动",提供了完整的Delphi源码,允许开发者...
项目中只要改动了jsp,就需要重启tomcat。在我的项目遇到的问题是jstl.jar版本不对。改成jstl-1.2.jar即可。jsp页面替换成<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>或 ...
在“0218金融项目改动点整理.pptx”中,我们主要关注的是金融项目的赠品逻辑列表及其页面改造的改动点。这些改动对于优化用户体验、提高业务流程效率以及确保金融产品促销策略的有效实施至关重要。 首先,让我们...
"stable项目管理"通常指的是在IT领域中对一个软件或系统的持续维护和更新过程,确保其稳定性和可靠性。在这个过程中,主要目标是提供一个长期支持的版本,供用户安心使用,减少频繁的重大变更,保障业务的连续性。...
在软件开发领域,"软件项目开发信息"是一个关键的话题,它涵盖了从项目启动到交付的整个过程中的各个环节。国家标准在此方面设定了规范和指导原则,确保软件开发的高效、有序和质量可控。以下是对这一主题的详细阐述...