Простой пользовательский рефакторинг в IntelliJ
Этот вопрос является продолжением для этого.
Скажем, у меня есть класс Foo.
class Foo {
protected String x = "x";
public String getX() {
return x;
}
}
У меня есть программа, которая использует Foo и нарушает LoD (Закон Деметры).
class Bar {
protected Foo foo;
public Bar() {
this.foo = new Foo();
}
public Foo getFoo() {
return foo;
}
}
public static void main(String [] args) {
Bar bar = new Bar();
String x = bar.getFoo().getX();
}
Я могу реорганизовать этот код для использования LoD в два этапа.
- ⌥ ⌘ m
bar.getFoo().getX()
→ getFooX(bar)
(извлечь в метод, также найти и заменить вхождения)
- F6
getFooX(bar)
→ bar.getFooX()
(перейти к методу экземпляра, также найти и заменить вхождения)
Программа, которая использует Bar
, больше не нарушает LoD.
class Bar {
protected Foo foo;
public Bar() {
this.foo = new Foo();
}
public Foo getFoo() {
return foo;
}
public String getFooX() {
return foo.getX();
}
}
public static void main(String [] args) {
Bar bar = new Bar();
String x = bar.getFooX();
}
Мне интересно, есть ли способ сделать собственный метод рефакторинга в IntelliJ, который бы объединял эти два шага в один.
EDIT
Я получил ответ от JetBrains со ссылкой на уже существующий запрос функции. Пожалуйста, проголосуйте, если вы найдете это полезным!
Hello Michael,
Похоже, у нас похожий запрос в YouTrack: https://youtrack.jetbrains.com/issue/IDEA-122400. Не стесняйтесь голосовать За это и оставляйте комментарии.
С наилучшими пожеланиями, Ярослав Бедров JetBrains
EDIT
Существует, по крайней мере, способ проверки на наличие проблем закона Деметры.
Вот суть, которая содержит профиль проверки, который будет просто искать нарушения LoD. Вы можете импортировать его в IntelliJ.
Ответы
Ответ 1
После добавления метода getFooX()
к Bar
я использовал бы Изменить > Найти > Заменить структурно следующими выражениями:
Шаблон поиска:
$instance$.getFoo().getX()
Запасной шаблон:
$instance$.getFooX()
Это прекрасно работает. Возможно, вы можете добавить некоторые ограничения для переменной $instance$
, чтобы сузить поиск, но это было бы полезно, если бы у вас было несколько классов с этим именем метода.