一个运算表达式带来的教训

来源:互联网 发布:淘宝牛仔裤质量好的店 编辑:程序博客网 时间: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/

0 0
原创粉丝点击