Как обнаружить, если (правда) и другие проблемы рефакторинга?

StackOverflow https://stackoverflow.com//questions/23013306

  •  21-12-2019
  •  | 
  •  

Вопрос

Объединяется в Java, при использовании «современных» IDES, чтобы встроить значения переменных и выполнять тяжелые рефакторинг, которые могут в качестве примера преобразовать этот исходный код

boolean test = true;
//...
if(test) {
    //...
}
.

в этот код

if(true) {
    //...
}
.

Очевидно, этот код может быть упрощен, но Eclipse не будет выполнять это упрощение для меня.

Так, есть ли какие-то способы (используя Eclipse или - еще лучше - Maven), которые могут обнаружить и (возможно) упростить этот код?(Было бы, очевидно, лучше, если такой инструмент смог обнаружить другие неправильные конструкции, такие как пустые для петлей, ...)

Это было полезно?

Решение

Что вы хотите, это a a href="http://en.wikipedia.org/wiki/program_transformation" rel="nofollow"> Система преобразования программы (PTS).

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

Многие из баллов позволят вам выражать изменения в виде кода непосредственно в форме источника к источнику в качестве правил, выраженные в терминах языкового синтаксиса, метафарусов и т. Д. Точка такого правила, чтобы позволить вам экспресс-комплекс преобразование кода легче.

Наше программное обеспечение DMS Reenginering Toolkit является такими очками. Вы можете легко упростить код с логическими выражениями, содержащими логические константы со следующими простыми правилами:

default domain Java~v7;

simplify_not_true(): primary -> primary
     " ! true" -> "false";

simplify_not_false(): primary -> primary
     " ! false" -> "true";

simplify_not_not(x: primary): primary -> primary
     " ! ! \x " ->  "\x";

simplify_and_right_true(x: term): conjunction -> conjunction ;
   " \x && true " ->  "\x";

simplify_and_left_true(x: term): conjunction -> conjunction ;
   " true && \x " ->  "\x";

simplify_and_left_false(x: term): conjunction -> conjunction ;
   " false && \x " ->  "false";

simplify_and_right_false(x: term): conjunction -> conjunction ;
   " \x && false " ->  "false"
   if no_side_effects_or_exceptions(x);  -- note additional semantic check here

simplify_or_right_false(x: term): disjunction -> disjunction ;
   " \x || false " ->  "\x";

simplify_or_left_false(x: term): disjunction -> disjunction ;
   " false || \x " ->  "\x";

simplify_or_right_true(x: term): disjunction -> disjunction ;
   " \x || true " ->  "true"
   if no_side_effects_or_exceptions(x);

simplify_or_left_true(x: term): disjunction -> disjunction ;
   " true || \x " ->  "true";
.

(названия грамматики «термин», «первичный», «соединение», «диспонтсор» находятся непосредственно из BNF, используемого для привода анализа исходного кода Java.)

Эти правила вместе примут булевых выражений с участием известных логических констант, и упростить их иногда к просто «истинному» или «ложному».

Чтобы устранить, если условные условия, выражения которых являются логическими константами, которые можно написать:

 simplify_if_true(b: block): statement -> statement
    " if (true) \b" -> " \b ";

 simplify_if_false(b: block): statement -> statement
    " if (false) \b" -> ";"  -- null statement
.

вместе с булевой упрощением, эти два правила избавляются от условных условий для явно истинных или, очевидно, ложных условных условий.

Делать то, что вы хотите, это немного сложнее, потому что вы хотите распространять информацию из одного места в программе, в другое место, возможно, «далеко». Для этого вам нужно то, что количество анализа потока данных, показывая, где значения могут достичь из их заданий:

default domain Java~v7;

rule propagate_constant_variables(i:IDENTIFIER): term -> term
     " \i " -> construct_reaching_constant()
     if constant_reaches(i);
.

Это правило зависит от встроенного анализа, обеспечивающего факты потока данных и обычай Функция интерфейса «Constant_Reaches», которая проверяет эти данные. (DMS имеет это для C, C ++, Java и Cobol и поддержку для выполнения этого для других языков; для моих знаний, ни один из других ПТС, упомянутых в статье Википедии, не имеет этих фактов потока). Это также зависит от пользовательского построения «Cretuct_Reaching_Constant» для создания примитивного узла дерева, содержащего достижение. Они будут закодированы в основном метапрограмме DMS MetaProgramming и требуют нескольких десятков строк кода. Точно так же особое состояние обсуждалось ранее «NO_DE_EFFECTECT_OR_EXCECTIONS»; Это может быть намного более сложным, поскольку вопрос о побочных эффектах может потребовать анализа полной программы.

Есть такие инструменты, которые могут в некоторой степени инструменты, которые могут преобразовать код C ++ в некоторой степени, но Clang не имеет правила переписывания, так как PTS делают, это действительно компилятор с дополнительными крючками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top