Рефакторинг повторяющегося кода в публичных методах класса

Вынесите общую последовательность в приватный метод с Runnable, а различающиеся действия передавайте ссылками на методы. В исходнике также есть несовпадение имени второго utility-метода.

Короткий ответ

Что ответить на собеседовании

Вынесите общую последовательность в приватный метод с Runnable, а различающиеся действия передавайте ссылками на методы. В исходнике также есть несовпадение имени второго utility-метода.

Подробный разбор

Ответ с пояснениями

Условие

В классе SomeClass есть два открытых метода (someMethod и someAnotherMethod), которые практически полностью совпадают. Единственное различие — вызов разных вспомогательных функций (doSomething и doAnotherSomethingElse). Необходимо:

  • вынести общую часть в отдельный приватный метод;
  • заменить дублирующий код вызовами нового метода;
  • сохранить исходную функциональность.
public class SomeClass {

    public void someMethod() {
        System.out.println("do something 1");
        System.out.println("do something 2");
        SomeUtilityClass.doSomething();
        System.out.println("do something 3");
        System.out.println("do something 4");
    }

    public void someAnotherMethod() {
        System.out.println("do something 1");
        System.out.println("do something 2");
        SomeUtilityClass.doAnotherSomethingElse();
        System.out.println("do something 3");
        System.out.println("do something 4");
    }

    static class SomeUtilityClass {

        static void doSomething() {
            System.out.println("do something");
        }

        static void doAnythingElse() {
            System.out.println("do anything else");
        }

    }
}

Ответ

Вынесите общую последовательность в приватный метод с Runnable, а различающиеся действия передавайте ссылками на методы. В исходнике также есть несовпадение имени второго utility-метода.

public void someMethod() {
    execute(SomeUtilityClass::doSomething);
}
public void someAnotherMethod() {
    execute(SomeUtilityClass::doAnythingElse);
}
private void execute(Runnable action) {
    System.out.println("do something 1");
    System.out.println("do something 2");
    action.run();
    System.out.println("do something 3");
    System.out.println("do something 4");
}

Использовано существующее имя doAnythingElse вместо отсутствующего doAnotherSomethingElse. Если действие бросит исключение, последние две строки не выполнятся — как в исходном коде; перенос их в finally изменил бы поведение.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее