Autumn SALE

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

Также известен как: Extract Interface

Проблема

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

Решение

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

До
Extract Interface - Before
После
Extract Interface - After

Причины рефакторинга

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

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

Полезные факты

Есть некоторое сходство между извлечением суперкласса и извлечением интерфейса.

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

Тем не менее, эту проблему можно уменьшить, применив извлечение класса для помещения поведения, содержащего дублирование в отдельный компонент и делегирования ему всей работы. В случае если объем общего поведения окажется довольно большим, всегда можно применить извлечение суперкласса. Конечно, это даже проще, но помните, что при этом вы получаете только один родительский класс.

Порядок рефакторинга

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

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

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

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