Книга: Экстремальное программирование. Разработка через тестирование
Перемещение метода (Move Method)
Перемещение метода (Move Method)
Как можно переместить метод в новое место, где он должен находиться? Добавьте его в класс, которому он должен принадлежать, затем обратитесь к нему.
Как
1. Скопируйте метод в буфер обмена.
2. Вставьте метод в целевой класс. Присвойте ему подобающее имя. Скомпилируйте его.
3. Если внутри метода происходит обращение к первоначальному объекту, добавьте параметр, при помощи которого методу будет передаваться этот объект. Если внутри метода происходит обращение к переменным-членам первоначального объекта, передавайте их в виде параметров. Если внутри метода переменным-членам первоначального объекта присваиваются значения, вы должны отказаться от идеи переноса метода в новый объект.
4. Замените тело первоначального метода обращением к новому методу.
Зачем
Это один из моих самых любимых шаблонов рефакторинга, выполняемых в процессе консультирования. Дело в том, что он наиболее эффективно демонстрирует неправильные предположения относительно дизайна кода. Вычисление площади – это обязанность объекта Shape (фигура):
Shape
…
int width = bounds.right() – bounds.left();
int height = bounds.bottom() – bounds.top();
int area = width * height;
…
Каждый раз, когда я вижу, что внутри метода, принадлежащего одному объекту, происходит обращение к нескольким методам другого объекта, я начинаю смотреть на код с подозрением. В данном случае я вижу, что в методе, принадлежащем объекту Shape, происходит обращение к четырем методам объекта bounds (класс Rectangle). Пришло время переместить эту часть метода в класс Rectangle:
Rectangle
public int area() {
int width = this.right() – this.left();
int height = this.bottom() – this.top();
return width * height;
}
Shape
…
int area = bounds.area();
…
Шаблон рефакторинга «Перемещение метода» (Move Method) обладает тремя важными преимуществами:
• Очень легко увидеть необходимость применения этого вида рефакторинга, при этом не требуется глубокое понимание смысла кода. Как только вы увидите два или больше сообщения, адресованные другому объекту, значит, можно смело приступать.
• Механика выполнения рефакторинга быстра и безопасна.
• Результаты зачастую приводят к просветлению. «Но класс Rectangle не выполняет никаких вычислений… О! Теперь я вижу. Так действительно лучше.»
Иногда возникает желание переместить только часть метода. Вы можете вначале выделить метод, переместить весь метод, а затем встроить метод в первоначальный класс. Или вы можете придумать способ сделать все это за один шаг.
- Согласование различий (Reconcile Differences)
- Изоляция изменений (Isolate Change)
- Миграция данных (Migrate Data)
- Выделение метода (Extract Method)
- Встраивание метода (Inline Method)
- Выделение интерфейса (Extract Interface)
- Перемещение метода (Move Method)
- Метод в объект (Method Object)
- Добавление параметра (Add Parameter)
- Параметр метода в параметр конструктора (Method Parameter to Constructor Parameter)
- Пример применения метода «пять почему»
- Перемещение по диалоговым окнам
- 15.4 Resource Synchronization Methods
- Копирование и перемещение фрагментов текста
- Перемещение и копирование файлов и папок
- Перемещение по листу
- Перемещение и копирование ячеек с помощью кнопки мыши
- Два метода рекламы. И жизни
- Using yum to Remove Packages
- 2.5.1. Основные положения метода структурного проектирования
- Using Fedora's kickstart Installation Method
- Remove a Group