IntelliJ Refactor для использования LoD

Скажем, у меня есть класс 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 выглядит так:

class Bar {
    protected Foo foo;

    public Bar() {
        this.foo = new Foo()
    }

    public String getFooX {
        return foo.getX();
    }
}

public static void main(String [] args) {
    Bar bar = new Bar();
    String x = bar.getFooX();
}

IntelliJ-IDEA имеет множество методов рефакторинга (например, извлечение в метод, извлечение в переменную, встроенное).

Есть ли метод в IntelliJ-IDEA, который будет рефакторинг кода, как bar.getFoo().getX() выглядеть как bar.getFooX()?

1 ответ

Решение

Предполагая, что вашим примером является код Java, вы можете сделать следующее:

  1. Метод извлечения на bar.getFoo().getX() (создание getFooX())
  2. Переместить созданный метод getFooX() в Bar если необходимо
  3. Вызовите и замените дубликаты кода на getFooX()
  4. Вызвать метод преобразования в экземпляр на getFooX()
  5. Опционально структурная замена $a$.getFoo().getX() с $a$.getFooX() если вы забыли шаг 3;-)
  6. Включить все вызовы getFoo() (должно быть только в getFooX())
Другие вопросы по тегам