【问题标题】:BigDecimal notation eclipse plugin or nice external toolBigDecimal notation eclipse 插件或不错的外部工具
【发布时间】:2012-01-28 00:06:11
【问题描述】:

我需要用BigDecimal做很多运算,我发现不得不表达

Double a = b - c * d; //natural way

作为

BigDecimal a = b.subtract(c.multiply(d))//BigDecimal way

不仅丑陋,而且是我和业务分析师之间错误和沟通问题的根源。他们完全能够使用 Doubles 读取代码,但现在却不能。

当然,一个完美的解决方案是 java 对运算符重载的支持,但由于这不会发生,我正在寻找一个 eclipse 插件,甚至是一个外部工具,可以自动从“自然方式”转换为“bigdecimal”方式”。

不是试图预处理源代码或动态翻译或任何复杂的东西,我只是想要一些我可以输入文本和获取文本的东西,并保持“自然方式”作为评论源代码。

P.S.:我找到了this incredible smart hack,但我不想开始进行字节码操作。也许我可以用它来创建一个 Natural2BigDecimal 翻译器,但如果有人已经做过这样的工具,我不想重新发明轮子。

我不想切换到 Scala/Groovy/JavaScript,我也不能,公司规则禁止在服务器端代码中使用除 java 之外的任何东西。

【问题讨论】:

  • 我猜这是“如果你想把事情做好,就自己做(Zorg,第五元素)”的问题之一。
  • 这仅适用于你真的擅长某事。就我而言,当我想把事情做好时,我会寻找一个成熟的开源项目。
  • 我认为他正在寻找一种工具,您可以在其中放入算术表达式,然后将 BigDecimal 语法粘贴回源代码,这应该可以保证它没有错误。
  • 我不同意。我没有更快地输入 BigDecimal 表示法,这是我的错,但我认为在自然表示法中并且我在转换为 BigDecimal 时会出错,即使我是一个完美的翻译,我仍然需要用 BigDecimal 表示法编写更多的字符。此外,我可以要求业务分析师学习,但在这种情况下,我预计他们会犯更多错误,因为他们正在学习新东西。我认为“我的兴趣”是提高我正在构建的最终产品的质量,甚至为我的开发过程增加一些复杂性。

标签: java eclipse plugins bigdecimal


【解决方案1】:

“我不想预处理源代码......我只是想要一些我可以输入 [bigDecimal 算术表达式] 文本的东西”。

解决问题的一半是认清问题的本质。您完全想要一些东西来预处理您的 BigDecimal 表达式以生成合法的 Java。

你只有两个基本的选择:

  • 一个独立的“领域特定语言”和 DSL 编译器,它接受“标准”表达式并将它们直接转换为 Java 代码。 (这是一种预处理器)。这给您留下了保留所有表达式片段的问题,并以某种方式知道将它们放在 Java 代码中的什么位置。

  • 一种读取 Java 源文本、查找此类表达式并将其转换为文本中的 BigDecimal 的工具。我建议您在实际代码之外编写表达式并插入翻译。

也许(从另一个答案偷来的):

 // BigDecimal a = b - c * d;
 BigDecimal a = b.subtract( c.multiply( d ) );

意思是“将注释中的大十进制表达式编译成它的java等价物,并用该翻译替换以下语句。

要实现第二个想法,您需要一个program transformation system,它可以将源到源重写规则应用于转换(作为转换的特殊情况生成)代码。这只是一个预处理器,可以根据您的需要进行定制。

我们的DMS Software Reengineering Toolkit 及其Java Front End 可以做到这一点。您需要一个完整的 Java 解析器来完成转换部分;您需要名称和类型解析,以便您可以解析/检查建议的表达式是否合理。

虽然我同意按原样 Java 表示法很丑陋,而您的建议会使它更漂亮,但我个人认为这不值得付出努力。您最终会依赖一个复杂的工具(是的,DMS 很复杂:操作代码并不容易)以获得相当小的收益。

如果您和您的团队编写了数千个这样的公式,或者这些公式的编写者对 Java 很幼稚,那么这可能是有意义的。在这种情况下, 我会更进一步,只是坚持你在需要的地方编写 standard 表达式格式。您可以自定义 Java 前端以检测操作数类型何时为十进制类型,并为您进行重写。然后,您只需在每个 Java 编译步骤之前运行这个预处理器。

【讨论】:

  • 我正在写评论批评你的答案,然后我意识到我不喜欢这个答案因为它是正确的。所以我会接受。我仍然认为我不需要完整的 java 解析器,但是可以解析 Java 的合理子集,但这只是我的情况,通用工具将需要完整的 java 解析器......我认为我们需要习惯 BigDecimal 表示法,或者说服经理允许我们在这种特定情况下使用 Scala。或者Xtext 是答案,如果我们愿意投入一些时间的话。谢谢你的建议!
  • 有时候真相有点难以接受,我同意。我怀疑您可以轻松避免使用完整的解析器;最终,您必须通过它们的 type 识别大十进制操作数,因此您需要捕获标识符的所有声明和表达式的详细信息。您也许可以避免使用完整的解析器,但确保您不需要某个部分可能与构建它一样困难。无论如何,对于 Java 世界来说,这些都“很容易”获得。
【解决方案2】:

我同意,这很麻烦!我使用适当的文档(每个方程之前的 cmets)作为最好的“解决方案”。

// a = b - c * d;
BigDecimal a = b.subtract( c.multiply( d ) )

【讨论】:

  • 似乎只有你和我不喜欢 BigDecimal 表示法...快速建议,这不是我问题的答案,只是评论,所以将其发布为评论,有人可能(并且可能会)对您投反对票
【解决方案3】:

您可能会走表达式评估器的路线。 http://www.singularsys.com/jep 有一个不错的(尽管是付费的)。 Antlr 在http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator 有一个基本的语法,它也可以进行表达式评估(虽然我不确定它会如何执行)。

两者都不会为您提供真正的运算符所拥有的编译时安全性。您还可以使用 Scala 之类的东西编写各种基于算法的类,它确实支持开箱即用的运算符重载,并且可以与您的其他 Java 类无缝互操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2012-01-13
    • 1970-01-01
    • 2010-11-04
    • 2013-05-24
    相关资源
    最近更新 更多