Рефакторинг ссылочной переменной в части кода в Eclipse

1

Как мне переименовать переменную только в часть кода?

Например:

System.out.println("Rectangle 1: " + "\n" + "Width: " + r1.width + "\n" + "Height: " +
        r1.height + "\n" + "Color: " + r1.color + "\n" + "Area and Perimeter: " + 
                r1.getArea(r1.width, r1.height) + ", " + r1.getPerimeter(r1.width, r1.height));

Поэтому, если я хочу напечатать то же самое для второго прямоугольника, используя r2 как refVar, есть ли способ, которым я могу быстро это сделать? Я попробовал копировать и вставлять, используя Alt + Shift + R, но в итоге он меняет все r1 refvars.

Теги:
rename
refactoring

2 ответа

-1
Лучший ответ

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

public static void printRectangleDetails(Rectangle r){

    System.out.println("Rectangle 1: " + "\n" + "Width: " + r.width + "\n" + "Height: " +
            r.height + "\n" + "Color: " + r.color + "\n" + "Area and Perimeter: " + 
                    r.getArea(r.width, r.height) + ", " + r.getPerimeter(r.width, r.height));
}

Теперь вы можете использовать его с вашими прямоугольниками r1 и r2 когда это необходимо

printRectangleDetails(r1);
...
printRectangleDetails(r2);

Если по какой-то причине вы не можете создать отдельный метод и использовать принцип DRY, вы можете сделать что-то вроде этого:

скажем, у нас есть

String foo = "foo";
System.out.println(foo+" hello wordls"+ foo);

String bar = "bar";
System.out.println(foo+" hello wordls"+ foo);

и вы хотите заменить foo на второй оператор печати на bar. Используя Alt + Shift + R (или из меню: RefactorRename..) во втором заявлении печати переименуйте все ссылки foo. Чтобы предотвратить его повторное использование вашей ссылки foo (компилятор даст вам ошибку, но не волнуйтесь, мы позже удалим ее, это полезно только при переименовании) непосредственно перед операциями, из которых вы хотите изменить foo на bar например

String foo = "foo";
System.out.println(foo+" hello wordls"+ foo);

String bar = "bar";
String foo = "whatever";
//     ^^^
System.out.println(foo+" hello wordls"+ foo);

Теперь используйте Alt + Shift + R на этом новом дублированном foo и eclipse будет искать foo из этой новой ссылки и игнорировать предыдущие foo, поэтому вы должны увидеть что-то вроде

Изображение 174551

(как вы видите, первые два foo не выбраны для переименования)
так что вы можете изменить его в bar, как

String foo = "foo";
System.out.println(foo+" hello wordls"+ foo);

String bar = "bar";
String bar = "whatever";
System.out.println(bar+" hello wordls"+ bar);

и после этого просто удалил этот дополнительный String bar = "whatever"; так как вам это больше не нужно.

НО БУДЬ ОСТОРОЖЕН. Таким образом вы переименуете все переменные foo после дублирования foo, а не только в System.out.println(foo+" hello wordls"+ foo); который вы хотели переименовать. Чтобы убедиться, что вы не изменяете ничего, чего не хотите, поместите код, который вы хотите изменить в конце вашего метода (где вы уверены, что нет foo который не следует изменять после него). После того, как вы закончите, переместите свой измененный код в нужное место.

  • 0
    Если вы чувствуете, метод Overiding toString будет лучшим вариантом, если он просто распечатывает результат.
  • 0
    @ user2900314 Ну, это зависит. В общем случае мы переопределяем toString, чтобы создать очень краткое описание объекта, которое можно использовать в журналах и сообщениях об ошибках, и создаем отдельные методы для генерации более описательного вывода / String. Но да, если OP может обновить класс Rectangle, то лучше добавить этот метод в него, чем создавать его в каком-то другом классе.
Показать ещё 7 комментариев
0

Я предлагаю вам использовать диалог Find/Replace для этой проблемы, который он подходит для ваших нужд. Выберите набор инструкций, затем нажмите Ctrl + F. Появится диалоговое окно "Найти/заменить", обратите внимание, что в группе " Область видимости " выбран вариант " Выбранные линии".

Вы можете использовать " Заменить все" или " Заменить/найти". Но будьте осторожны, что он также заменяет строку в комментариях, если она найдена.

См. Рисунок ниже.

Изображение 174551

  • 0
    Как вы упомянули, этот метод небезопасен, потому что могут быть ложноположительные результаты, и r1 можно изменить во многих нежелательных местах. В этом случае OP должен будет выполнить итерации вручную с помощью этого инструмента для всех результатов поиска и выбрать, следует ли изменить его или нет. Я полагаю, что OP пытается избежать этого и ищет способ / инструмент, чтобы сделать это автоматически, а не вручную.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню