Может ли затмение преобразовать / рефакторинг метода в класс? - PullRequest
11 голосов
/ 02 августа 2010

Кажется, это должно быть довольно просто, но я не вижу ничего очевидного. То, что я в основном хочу сделать это, чтобы указать на метод и класс refactor-> extract. Это привело бы рассматриваемый метод к новому классу с этим методом в качестве общедоступного API верхнего уровня. Рефакторинг также перетянет все необходимые методы и переменные вместе с ним в новый класс, удалив их из старого класса, если его не использует ничто другое в старом классе.

Это повторяющаяся задача, с которой я часто сталкиваюсь при рефакторинге устаревшего кода. Во всяком случае, в настоящее время я использую Eclipse 3.0.2, но все равно будет заинтересован в ответе, если он будет доступен в более поздней версии Eclipse. Спасибо!

Ответы [ 4 ]

10 голосов
/ 02 августа 2010

Я не думаю, что такого рода рефакторинг еще существует.

Ошибка 225716 регистрируется для этой функции (с начала 2008 года).
Ошибка 312347 также будет хорошей реализацией такого рефакторинга.

"Создайте новый класс и переместите соответствующие поля иметоды из старого класса в новый. "

Я упоминаю обходной путь в этом SO ответе .

7 голосов
/ 15 ноября 2011

В Eclipse 3.7.1 есть возможность перемещать методы и поля из класса.Для этого:

  1. Убедитесь, что целевой класс существует (пустой класс в порядке, если он существует в проекте).
  2. В исходном классе выберите методыкоторый вы хотите удалить (для этого отлично работает контурный режим), щелкните правой кнопкой мыши на выделении и выберите Move
  3. Выберите целевой класс в раскрывающемся менюучастники теперь извлечены.Исправьте все проблемы с видимостью (Source> Generate Getter and Setters очень полезны для этого), и все готово.
3 голосов
/ 03 августа 2010

Похоже, что это должно быть довольно просто ...

На самом деле, Extract Class является одним из наиболее сложных рефакторингов.Даже в вашем простом примере перемещения одного метода и его зависимостей возможны сложности:

  1. Если перемещенный метод может использоваться в коде, о котором вы не знаете, вам нужен прокси-серверметод в исходном классе, который будет делегировать (вызывать) перемещенный метод.(Если ваше приложение является автономным или если вы знаете всех клиентов перемещенного метода, то код рефакторинга может обновить вызывающий код.)
  2. Если перемещенный метод является частью интерфейса или перемещенный методметод наследуется, тогда вам также понадобится «прокси-метод».
  3. Ваш метод может вызывать закрытый метод / поле, которое вызывает другой метод.Вам нужно выбрать класс для вызываемого члена (возможно, в классе, который его использует больше всего).Вам нужно будет изменить доступ с «частного» на что-то более общее.
  4. В зависимости от того, сколько исходный класс и извлеченный класс должны знать друг о друге, одному или обоим может потребоваться, чтобы поля инициализировали эту точкук другому.
  5. И т. д.

Вот почему я призываю всех голосовать за ошибку 312347 , чтобы исправить.

1 голос
/ 02 августа 2010

Вы пробовали использовать функцию Move в группе Refactor?Вы можете создать класс helper и перемещать туда все, что захотите.

...