Рефакторинг инструмента в Eclipse - PullRequest
3 голосов
/ 05 апреля 2011

Моя потребность довольно проста: я хочу изменить вызов метода objClass1.method1() с помощью вызова objClass2.method2() во всем моем проекте Eclipse. К сожалению, я не могу найти плагин, способный сделать это. Вы можете помочь?

Редактировать:

Чтобы быть более точным, objClass1 является частью сторонней библиотеки, поэтому мне нужно изменить вызовы методов. Я не могу начать с определения метода. Когда я щелкаю правой кнопкой мыши на вызове method1, у меня нет опции «переименовать» в моем меню «Refactor».

Я не хочу менять или переименовывать свои методы. Я хочу обменять один вызов на другой во всем моем проекте.

Пример того, что нужно сделать:

До рефакторинга:

Injector injector=Guice.createInjector(new IContactModule());

После рефакторинга:

Injector injector=IContactInjectorSingleton.getInjector();

И это должно быть сделано несколькими пунктами в моем проекте.

Ответы [ 4 ]

6 голосов
/ 05 апреля 2011

То, что вы просите, не является рефакторингом. Рефакторинг определяется как «изменение, которое изменяет код, не изменяя поведения кода». В этом смысле переименование класса или переименование метода является рефакторингом (вы изменяете код, но программа делает то же, что и раньше). Но то, что вы предлагаете, НЕ сохраняет поведение кода, поэтому для этого никогда не будет «рефакторинга».

Конечно, можно написать плагин, который может выполнять необходимые изменения текста более или менее безопасным способом. Но это будет работать только в очень специфических обстоятельствах (что, если вашему новому методу нужен аргумент, который не нужен старому? Поэтому я не верю, что такой плагин существует, и нет смысла разрабатывать такой плагин.

2 голосов
/ 05 апреля 2011

Просто щелкните правой кнопкой мыши имя класса / метода и выберите Refactor> Rename.

EDIT:

Чтобы быть более точным, objClass1 является частью сторонней библиотеки, поэтому мне нужно изменить вызовы методов. Я не могу начать с определения метода. Когда я щелкаю правой кнопкой мыши на вызове method1, в моем меню «Refactor» нет опции «переименовывать».

Следовательно, я бы предложил вам просто сделать замену:

Меню поиска> Файл, введите старое имя, выберите контекст поиска («Включающий проект»), нажмите «Заменить» и введите новое имя.

EDIT2:

Из примера, который вы добавили к вопросу, я думаю, что замена вручную с использованием только что предложенного инструмента - это лучший способ. Как указал @Arne, это сложный вопрос, поэтому лучше сделать это контролируемым образом. Более того, я сомневаюсь, что это такая частая операция, требующая сборки плагина.

1 голос
/ 05 апреля 2011

Сначала переместите тело objClass1.method1() в objClass2.method2(), и method1 просто вызовите method2. Это может быть не так просто, как если бы, например, method1 использовал поля, например, Class1, и в этом случае вам, вероятно, следует включить this в качестве параметра для нового метода и, возможно, использовать геттеры для поля. Если вы можете сделать метод статичным перед этим, вам будет легче избежать подобных проблем. В любом случае, сделайте это преобразование, поэтому method1 просто вызывает method2. Теперь используйте рефакторинг Inline Method, чтобы заставить method1 уйти. Вы сделали.

1 голос
/ 05 апреля 2011

Вы можете использовать рефакторинг eclipse, выбрав имя метода. Щелкните правой кнопкой мыши контекстное меню или Alt-Shift-R, в Rename-Dialog появится диалоговое окно предварительного просмотра, в котором показаны все предлагаемые изменения в одном месте.

...