一个运算表达式带来的教训
来源:互联网 发布:淘宝牛仔裤质量好的店 编辑:程序博客网 时间:2024/05/16 06:53
国庆假期结束后,我花了两天时间做了一件事情:写一个计算器,输入一个数学运算表达式,然后运算出正确结果。比如输入[(-1)+2]*4+(12/2)-(1-3)
,输出结果12
。至昨天下午,它已经可以计算中括号、小括号、加减乘除的任意组合了。嗯,它已经通过了二十多种表达式的测试,支持负数运算,一切看起来已经顺利多了,不是吗?可是,今天早晨,意外的事情的发生了…
刚到办公室坐下,前部门的兄弟(我的良师益友)问我关于《为什么面向对象思想在项目组执行是困难的》写了没有,随后我告诉他,这两天正在处理公式解析,并给了他一个表达式。不一会儿,他给我发了下面的这张图片:
无需多言,这张图片已经足以让我瞬间凝噎……熟悉JavaScript的朋友一看就认识eval函数。是的,你没看错,它执行了表达式运算。
老实说,我从大学到现在都一直利用eval将字符串转换为JSON,我身旁一位资深的兄弟也没注意过。直到今天,我们才发现它另一个强大而实用的功能。而且,它还可以在Java中执行。
之前我的心情是这样的:当初找了一些资料,了解了一些开源的设计,对其中的原理有了些兴趣。于是,从第一行测试代码开始,我先后为这个计算器设计了解析单元和运算单元。对内部各种递归处理也有很深的感触,正准备后期整理一份文档,解释如何设计数据结构、一步步剖析表达式,提取子运算式。
下班前,我尝试在Java中使用javascript。从写测试到一个简单的实现,只用了三分钟,核心代码只有下面的三行,0.387s完成了运算。效率是低了些(我写的那个执行二十四个表达式运算需要0.1s),但与我花费的时间相比,其中昂贵的代价无异于满满的一耳光,草率者无知,无知者无畏。个中滋味,独自品尝。
ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); engine.eval("eval('" + express + "')");
我的博客原文:http://www.xubitao.cn/blog/2014/10/11/a-tough-lesson-to-learn/
- 一个运算表达式带来的教训
- 正则表达式的一个教训
- WebSphere 5.0 中编码问题带来的一个教训
- Google Wave失败带来的教训
- 豌豆荚的一个“教训”
- 一个ResultSet的 Bug教训
- 一个需求镀金的教训
- 从weblogic的一个教训
- SCRUM实践的一个教训
- 一个教训
- 一个教训
- 一个教训
- 一个要记住一辈子的教训!!!!!!
- 一个程序员的创业失败教训
- 一个值得记住的教训啊
- 一个LIMS项目的经验和教训
- 一个程序员的创业失败教训
- 一个程序员的创业失败教训
- Effective C++ 读书笔记 条款36:绝不重新定义继承而来的 non-virtual 函数
- HDU 5062 Beautiful Palindrome Number(暴力)
- C++ STL 源码学习(之deque篇)
- 银行客户分类
- android绘制图表(二)
- 一个运算表达式带来的教训
- Ubuntu输入密码登陆后又跳回到登录界面
- JavaBean的内省操作
- 项目一
- HDU 5063 Operation the Sequence(暴力)
- VS2013编译64位OpenSSL
- 【iOS开发-39】为什么按钮点击时背景图片颜色灰蒙蒙的?与按钮的Type属性有关
- 事务相关知识点
- 【Unity3D】主角平缓旋转