BigDecimal примечание плагин затмения или хороший внешний инструмент - PullRequest
10 голосов
/ 26 декабря 2011

Мне нужно выполнить много операций с использованием BigDecimal, и я обнаружил необходимость выразить

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

в

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

является не только уродливым, но и источником ошибок и проблем со связью между мной и бизнес-аналитиками. Они отлично умели читать код с помощью Doubles, но теперь не могут.

Конечно, идеальным решением будет поддержка Java для перегрузки операторов, но так как этого не произойдет, я ищу плагин eclipse или даже внешний инструмент, который автоматически преобразует «естественный путь» в «bigdecimal» путь».

Я не пытаюсь предварительно обработать исходный код или динамический перевод или любую сложную вещь, я просто хочу что-то, что я могу ввести текст и получить текст, и сохранить «естественный путь» в качестве комментария в источнике код.

P.S .: Я нашел этот невероятный умный взлом , но я не хочу начинать манипулировать байт-кодом. Может быть, я могу использовать это для создания переводчика Natural2BigDecimal, но я не хочу изобретать велосипед, если кто-то уже сделал такой инструмент.

Я не хочу переходить на Scala / Groovy / JavaScript и также не могу, правила компании запрещают что-либо, кроме java, в коде на стороне сервера.

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

"Я не пытаюсь предварительно обработать исходный код ... Я просто хочу что-то, что я могу ввести [bigDecimal arithmetic expression] text".

Половина решения проблемы - это признание проблемы в том, что она есть,Вы точно хотите, чтобы что-то предварительно обработало ваши выражения BigDecimal для создания легальной Java.

У вас есть только два основных варианта:

  • Автономный "предметно-ориентированный язык "и компилятор DSL, который принимает" стандартные "выражения и преобразует их непосредственно в код Java.(Это один из видов препроцессора).Это оставляет вам проблему с сохранением всех фрагментов выражения и каким-то образом зная, куда поместить их в код Java.

  • Инструмент, который читает исходный текст Java, находит такие выражения и преобразует их в BigDecimal в тексте.Я бы предложил что-то, что позволило бы вам кодировать выражения вне реального кода и вставлять перевод.

Возможно (украдено из другого ответа):

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

со значением «скомпилировать большое десятичное выражение в комментарии в его Java-эквивалент и заменить следующееоператор с этим переводом.

Чтобы реализовать вторую идею, вам нужна система программных преобразований , которая может применять правила перезаписи от источника к источнику для преобразования (генерировать как особый случай преобразования) код. Это просто препроцессор, который может быть настроен в соответствии с вашими потребностями.

Наш инструментарий реинжиниринга программного обеспечения DMS с интерфейсом Java может это сделатьДля выполнения этой части преобразования вам необходим полный анализатор Java; вам потребуется разрешение имен и типов, чтобы можно было проанализировать / проверить предложенное выражение на предмет корректности.

Хотя я согласен с тем, что нотация Java как естьуродливо, и ваше предложение сделает его красивее, мое личное мнение таково, что это не стоит усилий. В итоге вы зависите от компаИнструмент lex (да, DMS сложен: манипулировать кодом нелегко) за довольно незначительный выигрыш.

Если вы и ваша команда написали тысячи этих формул, или авторы таких формул были наивными на Java, это могло бы иметь смысл.В этом случае я бы пошел дальше и просто настаивал на том, чтобы вы писали стандартный формат выражений там, где вам это нужно.Вы можете настроить интерфейс Java, чтобы определять, когда типы операндов имеют десятичный тип, и выполнять перезапись для вас.Затем вы просто запускаете этот препроцессор перед каждым шагом компиляции Java.

0 голосов
/ 29 декабря 2011

Вы можете пойти по пути оценщика выражений.Приличный (хотя и платный) один на http://www.singularsys.com/jep. У Antlr есть элементарная грамматика, которая также выполняет оценку выражения (хотя я не уверен, как она будет работать) на http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator.

Ни один из них не обеспечил бы вам безопасность во время компиляции, которую вы имели бы с настоящими операторами.Вы также можете написать различные основанные на алгоритмах классы в чем-то вроде Scala, который поддерживает перегрузку операторов из коробки и без проблем взаимодействует с другими вашими классами Java.

0 голосов
/ 27 декабря 2011

Согласен, это очень громоздко!Я использую надлежащую документацию (комментарии перед каждым уравнением) как лучшее «решение» для этого.

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