Может ли eclipse конвертировать/реорганизовать метод в класс?
Кажется, что это должно быть довольно прямолинейно, но я не вижу ничего очевидного. Что я в основном хочу сделать, чтобы указать на метод и метод refactor- > extract. Это применило бы этот метод к новому классу с помощью этого метода как API открытого уровня верхнего уровня. Рефакторинг также перетащил бы все необходимые методы и переменные вместе с ним в новый класс, удалив их из старого класса, если ничто в старом классе его не использует.
Это повторяющаяся задача, с которой я часто сталкиваюсь при реорганизации устаревшего кода. Во всяком случае, я в настоящее время использую Eclipse 3.0.2, но все равно будет интересоваться ответом, если он доступен в более новой версии eclipse. Спасибо!
Ответы
Ответ 1
Я не думаю, что такой рефакторинг существует.
Ошибка 225716 был зарегистрирован для этой функции (с начала 2008 года).
Ошибка 312347 также будет хорошей реализацией такого рефакторинга.
"Создайте новый класс и переместите соответствующие поля и методы из старого класса в новый класс".
Я упоминаю обходной путь в этом SO-ответе.
Ответ 2
В Eclipse 3.7.1 есть возможность переместить методы и поля из класса. Для этого:
- Убедитесь, что целевой класс существует (пустой класс в порядке, до тех пор, пока он существует в проекте).
- В исходном классе выберите методы, которые вы хотите удалить (представление схемы хорошо подходит для этого), щелкните правой кнопкой мыши по выделенной области и выберите "Переместить"
- Выберите класс назначения в раскрывающемся списке /Browse
Теперь ваши участники извлечены. Исправьте любые проблемы видимости (Source > Generate Getters и Setters очень полезны для этого), и все вы настроены.
Ответ 3
Кажется, что это должно быть справедливо прямолинейная...
Собственно, Extract Class является одним из наиболее сложных рефакторингов. Даже на вашем простом примере перемещения одного метода и его зависимостей возможны следующие осложнения:
- Если перемещенный метод может использоваться в коде, о котором вы не знаете, вам необходимо иметь прокси-метод в исходном классе, который будет делегировать (вызывать) перемещенный метод. (Если ваше приложение является самодостаточным или если вы знаете всех клиентов перемещенного метода, то код рефакторинга может обновлять вызывающий код.)
- Если перемещенный метод является частью интерфейса или если перенесенный метод наследуется, вам также понадобится "прокси-метод".
- Ваш метод может вызвать частный метод/поле, которое вызывает другие вызовы. Вам нужно выбрать класс для вызываемого члена (возможно, в классе, который использует его больше всего). Вам нужно будет изменить доступ с "private" к чему-то более общему.
- В зависимости от того, насколько первоначальный класс и извлеченный класс должны знать друг о друге, одному или обоим может потребоваться инициализация полей, которые указывают на другой.
- Etc.
Вот почему я призываю всех голосовать за ошибку 312347, чтобы исправиться.
Ответ 4
Вы пробовали функцию Move
группы Refactor
? Вы можете создать вспомогательный класс и переместить туда что угодно.