C#动态表达式计算
C#动态表达式计算
应该有不少人开发过程中遇到过这样的需求,我们直接看图说话:

如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果;
用户通过可视化界面进行某些条件的配置以及某些算法的配置并自动生成表达式或者生成数学模型;
程序中需要通过生成的表达式以及动态从数据库中获取的数据进行算法映射以及自动计算出结果。
该需求这边可以举出几个应用场景:
1、报表设计器
我们可以通过报表设计器设计数据库的映射关系并配置数据之间的算法关系,然后动态生成报表;
2、某些采集工具
定向采集指定数据集合并根据某些动态配置的逻辑进行;
3、数据挖掘和分析
面对这样的需求我们如何实现?
我们需要开发表达式映射引擎和脚本执行引擎?
假如要实现,该如何设计该框架?下一章我将呈现我们的解决方案,这一章就先说这么多,大家也可以畅谈以下自己的想法,忙了。。。
代码的坏味道之三——译自《重构》
散弹式修改(Shotgun Surgery)
散弹式修改和发散式变化类似,但却相反。每当你做一种修改你却必须对很多不同的类做很多小的变化,你面临的就是散弹式修改。当变化到处都是时,有的变化就不好找到了,这样很容易漏掉重要的更改。
这种情况下你要使用移动方法(Move Method)和移动字段(Move Field)来把所有的变化放到一个类里。如果没有现成的类合适,就创建一个类。通常你会用到内联化类(Inline Class)把一系列行为放到一起。你会有一点发散式变化的问题,但你可以轻松处理它。
发散式变化是一个类经受多种种类的修改,散弹式修改是一处修改改变了很多类。两种情况你都希望重新组织,这样理想状态下一个普通变化和类有一对一的链接关系。
依恋情节(Feature Envy)
对象的意义就是他们在技术上是数据和处理数据的操作的打包。常见的问题是一个方法对其他类比对自己所在的类更有兴趣。最普遍的嫉妒的焦点就是数据。我们数不清多少次我们看到一个方法为了计算一个值调用了6,7个另一个对象的get方法。幸运的是解决之道是很显而易见的,这个方法显然应该归于别处,所以你用移动方法(Move Method)来达到目的。有时方法中只有一部分有依恋情节,这种情况下用提取方法处理有依恋的部分,用移动方法来给他一个理想的归宿。
当然不是所有的情况都可以一刀切。通常一个方法使用若干类的特性,那么我们应该把他归于哪一个类呢?我们用的启示是取决于哪一个类中有大多数的数据,那么就把方法放在数据一起。如果已经使用提取方法来把方法分解成若干分离的部分,这一步可以做的轻松一些。
当然有一些精妙的模式会打破这一规矩。来自“四人帮”(Gang of Four)策略和访问者马上就浮现在脑海。Kent Beck的自委托是另一个例子。你用这些模式模式来处理发散式修改。最基本的规则是把一起修改的东西放在一起。数据和引用数据的行为经常一起修改,但也有例外。当例外出现时,我们把行为移动使变化保持在一个地方。策略和访问者模式允许你更容易的改变行为,因为他们以进一步的重定向为代价,隔离了一小部分需要倍覆盖的行为。
数据泥团(Data Clumps)
数据对象像小孩一样,他们喜欢聚在一群到处游荡。你常常会看到同样的三,四个数据对象一起出现在很多地方:一些类中的字段,一些方法签名里的参数。一簇到处都是的数据真的需要被放在他们自己的对象里。第一步是寻找在哪这些数据表现为字段。对这些字段用提取类把一簇转变为一个对象。然后把你的注意力转移到方法的签名上,用引入参数对象后者保全整个对象来缩减他们。马上带来的好处是你缩减了很多参数列表简化了方法的调用。不用为数据团只用了新对象的部分字段担心。只要你用两个或更多的字段替换为新的对象,你会进步的。
一个好的测试是考虑删除一个数据的值:如果你这样做其它数据是否还有意义?如果没有,这就是一个明确的信号告诉你要新建一个对象了。
减小字段列表和参数列表很明显会移除一些坏味道,但一旦当你有了这些对象时,你就拥有制造好味道的机会了。现在你可以寻找依恋情节的例子,那意味着行为可以被加入你的新类里。不久这些类就会成为社群中的高效成员。
C#动态表达式计算的更多相关文章
- C#动态表达式计算(续2)
上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...
- 第6.4节 Python动态表达式计算:eval函数详述
在Python动态执行的函数中,eval是用于执行表达式计算的函数,这个函数用于执行字符串中包含的一个表达式或其编译后对应的代码,不能适用于执行Python语句和完整的代码. 一. 语法 1. ...
- C#动态表达式计算(续1)
距上一帖近五天时间,让大家久等了,没想到关注这个话题的也不少人,正如有同志所说的想解决该问题其实是有太多的解决方法,比如动态构造类编译.调用vbscript或者可以采用javascript解析引擎或者 ...
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...
- PHP 实现字符串表达式计算
什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执 ...
- .NET 表达式计算:Expression Evaluator
Expression Evaluator 是一个轻量级的可以在运行时解析C#表达式的开源免费组件.表达式求值应该在很多地方使用,例如一些工资或者成本核算系统,就需要在后台动态配置计算表达式,从而进行计 ...
- WPF实现强大的动态公式计算
数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题. 1.VS2012新建一个WPF应用程序WpfApp ...
- C# - 二叉树表达式计算
很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...
- 【Windows 10 应用开发】使用x:Bind标记动态获得计算结果
UWP 在传统(WPF)的Binding标记上引入了 Bind 标记,Bind 基于编译阶段生成,因而具有较高的性能.但是,你得注意,这个性能上的优化是免去了运行阶段动态绑定的开销,这是不包括数据源的 ...
随机推荐
- 3.Chrome数据同步服务分析--server一片
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlcjE2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- react.js 从零开始(七)React (虚拟)DOM
React 元素 React 中最主要的类型就是 ReactElement.它有四个属性:type,props,key 和ref.它没有方法,并且原型上什么都没有. 可以通过 React.create ...
- nyoj 517 最小公倍数 【java睑板】
我写了一个gcd TL该.然后调用math内gcd,AC该... 思维:它是采取n前面的最小公倍数和n求 1~n的最小公倍数 代码: import java.util.Scanner; import ...
- 架构设计之设计模式 (一) 适配器(Adapter)---提高复用性
简介 简介是为了描述一下该模式是干嘛用的,为了让不了解该模式的人看了之后也有一些新的认识. 本文章分为两部分,第一部分主要介绍适配器模式:第二部分介绍该模式与相近模式的异同. 下午一直在讨论设计模式, ...
- Android Intent机制与常见的用法
Activity Android于.Activity所有的程序都是必不可少,程都执行在Activity之中.Activity具有自己的生命周期(见http://www.cnblogs.com/feis ...
- iOS,Android,.NET通用AES加密算法
原文:iOS,Android,.NET通用AES加密算法 这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果 ...
- 迷宫的最短路径 (BFS)
N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. (可以构造成pair或者编码成int来表达状态) ...
- SQL 把表中字段存储的逗号隔开内容转换成列表形式
原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ...
- css优先级计算规则
原文:css优先级计算规则 最近面试了一些求职者,我问css优先级计算规则是怎样的?答曰ID优先级>class>元素选择器,外联样式优先级低于内联样式,内联样式优先级低于行间样式,然后就没 ...
- ExecutorService 建立一个多线程的线程池的步骤
ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...