Организация данных

Рефакторинги этой группы призваны облегчить работу с данными, заменив работу с примитивными типами богатыми функциональностью классами.

Кроме того, важным моментом является уменьшение связанность между классами, что улучшает переносимость классов и шансы их повторного использования.

Самоинкапсуляция поля

Проблема: Вы используете прямой доступ к приватным полями внутри класса.

Решение: Создайте геттер и сеттер для поля, и пользуйтесь для доступа к полю только ими.

Замена простого поля объектом

Проблема: В классе (или группе классов) есть поле простого типа. У этого поля есть своё поведение и связанные данные.

Решение: Создайте новый класс, поместите в него старое поле и его поведения, храните объект этого класса в исходном классе.

Замена значения ссылкой

Проблема: Есть много одинаковых экземпляров одного класса, которые можно заменить одним объектом.

Решение: Превратите одинаковые объекты в один объект-ссылку.

Замена ссылки значением

Проблема: У вас есть объект-ссылка, который слишком маленький и неизменяемый, чтобы оправдать сложности по управлению его жизненным циклом.

Решение: Превратите его в объект-значение.

Замена поля-массива объектом

Проблема: У вас есть массив, в котором хранятся разнотипные данные.

Решение: Замените массив объектом, который будет иметь отдельные поля для каждого элемента.

Дублирование видимых данных

Проблема: Данные предметной области программы хранятся в классах, отвечающих за пользовательский интерфейс (GUI).

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

Замена однонаправленной связи двунаправленной

Проблема: У вас есть два класса, которым нужно использовать фичи друг друга, но между ними существует только односторонняя связь.

Решение: Добавьте недостающую связь в класс, в котором она отсутствует.

Замена двунаправленной связи однонаправленной

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

Решение: Уберите неиспользуемую связь.

Замена магического числа символьной константой

Проблема: В коде используется число, которое несёт какой-то определённый смысл.

Решение: Замените это число константой с человеко-читаемым названием, объясняющим смысл этого числа.

Инкапсуляция поля

Проблема: У вас есть публичное поле.

Решение: Сделайте поле приватным и создайте для него методы доступа.

Инкапсуляция коллекции

Проблема: Класс содержит поле-коллекцию и простой геттер и сеттер для работы с этой коллекцией.

Решение: Сделайте возвращаемое геттером значение доступным только для чтения и создайте методы добавления/удаления элементов этой коллекции.

Замена кодирования типа классом

Проблема: В классе есть поле, содержащее кодирование типа. Значения этого типа не используются в условных операторах и не влияют на поведение программы.

Решение: Создайте новый класс и применяйте его объекты вместо значений закодированного типа.

Замена кодирования типа подклассами

Проблема: У вас есть закодированный тип, который непосредственно влияет на поведение программы (основываясь на значениях этого поля, в условных операторах выполняется различный код).

Решение: Для каждого значения закодированного типа, создайте подклассы. А затем, вынесите соответствующие поведения из исходного класса в эти подклассы. Управляющий код замените полиморфизмом.

Замена кодирования типа состоянием/стратегией

Проблема: У вас есть закодированный тип, который влияет на поведение, но вы не можете использовать подклассы, чтобы избавиться от него.

Решение: Замените кодирование типа объектом-состоянием. При необходимости заменить значение поля с кодированием типа, в него подставляется другой объект-состояние.

Замена подкласса полями

Проблема: У вас есть подклассы, которые отличаются только методами, возвращающими данные-константы.

Решение: Замените методы полями в родительском классе и удалите подклассы.

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

Или попробуйте наш новый интерактивный курс по рефакторингу. Он более информативный и гораздо более интересный, чем банальный текст.

Узнать больше...