`

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

阅读更多

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

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

假设有一个类, 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很好用....

相关推荐

    通过Hbuilder X创建uni-app项目并引入UView

    在移动应用开发领域,uni-app是一个备受开发者欢迎的框架,它允许开发者使用一套代码库构建跨平台的应用程序,支持iOS、Android、微信小程序、支付宝小程序等多个平台。而UView UI则是一款专为uni-app设计的组件库,...

    2.36附表一:一个具体风险对项目主要目标的风险影响对照表.doc

    附表一“一个具体风险对项目主要目标的风险影响对照表”提供了一种量化评估风险影响的方法,通过顺序度量、线性度量和非线性度量三个维度,来衡量风险对成本、进度、范围和质量四个关键项目目标的影响。 1. **成本*...

    dotnet 7 WPF 破坏性改动 按下 F3 让 DataGrid 自动排序.rar

    本文档将详细讲解其中一个显著的改动:按下F3键自动触发DataGrid排序功能的改变,并提供应对策略。 **F3按键行为的改变** 在.NET Framework及之前的版本中,WPF的DataGrid控件并未对F3键有特定的行为定义。然而,...

    Spring之AOP注解之引入通知

    然后创建一个切面类,并使用`@AspectJ`和`@DeclareParents`注解来实现引入: ```java @Aspect public class DebuggableAspect { @DeclareParents(value = "com.example.Calculator+", defaultImpl = ...

    ansys 14.5 单元改动清单

    在ANSYS 14.5版本中,对单元模型进行了重大更新,这涉及到对旧有单元的支持取消以及引入了一系列新的单元。这些改动对于用户来说,意味着需要调整原有的模型构建策略,以便更好地利用新版本的功能。 首先,让我们...

    ​实现maven项目中多版本依赖兼容使用解决方案

    在本案例中,公司需要使用一个第三方接口的加密jar包,该jar包内部依赖的高版本与现有项目框架中的低版本冲突。以下是如何实现Maven项目中多版本依赖兼容的解决方案: 1. **理解Maven依赖管理**: Maven依赖管理...

    dotnet 5 破坏性改动 WPF 和 WinForms 的 OutputType 输出类型重定向为 WinExe 类型

    总结起来,`.NET 5`对WPF和WinForms的`OutputType`重定向至`WinExe`是一个重要的破坏性改动,旨在提供更好的兼容性和性能。开发者应当了解这一变化,并在升级到.NET 5时检查和更新项目配置,以避免潜在的不兼容性和...

    函数引入对程序设计影响

    假设我们需要编写一个程序,其中包含一个功能为隐藏光标的小函数。虽然这个函数的内部实现可能非常复杂,但对于使用它的程序员来说,只需要知道如何调用即可,无需了解其实现细节。这样的封装不仅提高了代码的复用率...

    NET委托:一个C#睡前故事

    在这个“NET委托:一个C#睡前故事”中,通过类比的方式,讲述了委托如何帮助解决程序员在设计中的问题。 故事中的彼得代表了一个类,他的老板则代表了需要调用彼得方法的其他部分。老板希望随时得知彼得的工作进度...

    43页项目管理精髓——工程项目可行性研究.ppt

    工程项目管理的主要任务是寻找并确立项目目标,定义项目,并对项目进行详细的技术经济论证,使整个项目建立在可靠的、坚实的、优化的基础之上。 工程项目的前期策划阶段是指工程项目的构思到项目批准,正式立项为止...

    web项目的一个测试工具

    在IT行业中,Web项目的开发和维护是一个复杂的过程,其中测试环节尤为重要。为了确保Web应用程序的稳定性和性能,开发者和测试人员通常会使用各种专门的测试工具。本文将深入探讨一个名为"web项目的一个测试工具"的...

    C#毕业设计子函数改动

    毕业设计通常是一个综合性的项目,它要求学生运用所学的理论知识解决实际问题,而C#作为.NET框架下的主要开发语言,其强大的功能和灵活性使得它成为许多软件开发项目的首选。 在C#毕业设计中,子函数(也称为方法或...

    信息系统项目管理师:软件工程篇(四).docx

    在IT领域,软件维护是软件开发过程中的一个重要环节,尤其对于高级IT专业人士,如信息系统项目管理师来说,理解和掌握软件维护的基本概念至关重要。软件维护被认为是软件生命周期中最持久且成本最高的阶段,因此,...

    互联网项目流程.pdf

    4. 回归测试:在修改问题后,再次进行全面测试,确保改动未引入新的问题。 四、质量保证与测试 此阶段确保产品的质量与性能: 1. 测试计划:制定详细的测试策略,包括功能测试、性能测试、兼容性测试等。 2. 自动化...

    新物料引入管理程序.pdf

    这个程序适用于公司内部所有新物料的引入,包括从未使用过的物料、设计或规格改动后的物料、新供应商提供的物料以及原供应商新增的物料。 3. 定义: 新物料是指在生产过程中未曾使用或经过设计、规格、制程等变更的...

    delphi 监视文件夹改动

    在Delphi编程环境中,开发一个能够监视文件夹变动的应用程序是一项常见的需求,特别是在实时数据同步、日志跟踪或文件系统监控等场景下。本项目名为"Delphi 监视文件夹改动",提供了完整的Delphi源码,允许开发者...

    jsp一改动,就需要重启的解决方案

    项目中只要改动了jsp,就需要重启tomcat。在我的项目遇到的问题是jstl.jar版本不对。改成jstl-1.2.jar即可。jsp页面替换成&lt;%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%&gt;或 ...

    0218金融项目改动点整理.pptx

    在“0218金融项目改动点整理.pptx”中,我们主要关注的是金融项目的赠品逻辑列表及其页面改造的改动点。这些改动对于优化用户体验、提高业务流程效率以及确保金融产品促销策略的有效实施至关重要。 首先,让我们...

    stable项目管理

    "stable项目管理"通常指的是在IT领域中对一个软件或系统的持续维护和更新过程,确保其稳定性和可靠性。在这个过程中,主要目标是提供一个长期支持的版本,供用户安心使用,减少频繁的重大变更,保障业务的连续性。...

    软件项目开发信息

    在软件开发领域,"软件项目开发信息"是一个关键的话题,它涵盖了从项目启动到交付的整个过程中的各个环节。国家标准在此方面设定了规范和指导原则,确保软件开发的高效、有序和质量可控。以下是对这一主题的详细阐述...

Global site tag (gtag.js) - Google Analytics