Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Перемещение поля.

Проблема

Поле используется в другом классе больше, чем в собственном.

Решение

Создайте поле в новом классе и перенаправьте к нему всех пользователей старого поля.

##Пример

До
class Account {
  private double interestRate;

  double interestForAmount(double amount) {
    return amount * interestRate;
  }
}
class AccountType {}
После
class Account {
  private AccountType type;

  double interestForAmount(double amount) {
    return amount * type.getInterestRate();
  }
}
class AccountType {
  private double interestRate;
  double getInterestRate() { return interestRate; }
}

##Зачем делать рефакторинг

Зачастую поля переносятся как часть извлечение одного класса из другого. Решить, в каком из классов должно остаться поле, бывает непросто. Тем не менее, у нас есть неплохой рецепт — поле должно быть там, где находятся методы, которые его используют (либо там, где этих методов больше).

Это правило поможет вам и в других случаях, когда поле попросту находится не там, где нужно.

##Как делать рефакторинг

  1. Если поле публичное, вам будет намного проще совершить рефакторинг, если вы сделаете его приватным и предоставите публичные методы доступа (для этого можно использовать рефакторинг инкапсуляция поля).

  2. Создайте такое же поле с методами доступа в классе-приёмнике.

  3. Определите, как вы будете обращаться к классу-получателю. Вполне возможно, у вас уже есть поле или метод, которые возвращают подходящий объект. Если нет — нужно будет написать новый метод или поле, в котором бы хранился объект класса-получателя.

  4. Замените все обращения к старому полю на соответствующие вызовы методов в классе-получателе. Если поле не приватное, проделайте это и в суперклассе, и в подклассах.

  5. Удалите поле в исходном классе.