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

Извлечение интерфейса.

Проблема

Несколько клиентов пользуются одной и той же частью интерфейса класса. Либо в двух классах часть интерфейса оказалась общей.

Решение

Выделите эту общую часть в свой собственный интерфейс.

##Пример

До
class Employee {
  double getRate() { return rate; }
  boolean hasSpecialSkill() { return special; }
}
class Timesheet {
  double charge(Employee emp, int days) {
    return emp.getRate() * days;
  }
}
После
interface Billable {
  double getRate();
}
class Employee implements Billable {
  public double getRate() { return rate; }
  boolean hasSpecialSkill() { return special; }
}
class Timesheet {
  double charge(Billable emp, int days) {
    return emp.getRate() * days;
  }
}

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

  1. Интерфейсы бывают кстати, когда один и тот же класс может отыгрывать различные роли в различных ситуациях. Используйте извлечение интерфейса, чтобы явно обозначить каждую из ролей.

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

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

  1. Создайте пустой интерфейс.

  2. Объявите общие операции в интерфейсе.

  3. Объявите нужные классы как реализующие этот интерфейс.

  4. Измените объявление типов в клиентском коде так, чтобы они использовали новый интерфейс.