Организация данных
Рефакторинги этой группы призваны облегчить работу с данными, заменив работу с примитивными типами богатыми функциональностью классами.
Кроме того, важным моментом является уменьшение связанности между классами, что улучшает переносимость классов и шансы их повторного использования.
Проблема: Вы используете прямой доступ к приватным полями внутри класса.
Решение: Создайте геттер и сеттер для поля, и пользуйтесь для доступа к полю только ими.
Проблема: В классе (или группе классов) есть поле простого типа. У этого поля есть своё поведение и связанные данные.
Решение: Создайте новый класс, поместите в него старое поле и его поведения, храните объект этого класса в исходном классе.
Проблема: Есть много одинаковых экземпляров одного класса, которые можно заменить одним объектом.
Решение: Превратите одинаковые объекты в один объект-ссылку.
Проблема: У вас есть объект-ссылка, который слишком маленький и неизменяемый, чтобы оправдать сложности по управлению его жизненным циклом.
Решение: Превратите его в объект-значение.
Проблема: У вас есть массив, в котором хранятся разнотипные данные.
Решение: Замените массив объектом, который будет иметь отдельные поля для каждого элемента.
Проблема: Данные предметной области программы хранятся в классах, отвечающих за пользовательский интерфейс (GUI).
Решение: Имеет смысл выделить данные предметной области в отдельные классы и, таким образом, обеспечить связь и синхронизацию между классом предметной области и GUI.
Проблема: У вас есть два класса, которым нужно использовать фичи друг друга, но между ними существует только односторонняя связь.
Решение: Добавьте недостающую связь в класс, в котором она отсутствует.
Проблема: У вас есть двухсторонняя связь между классами, но один из классов больше не использует фичи другого.
Решение: Уберите неиспользуемую связь.
Проблема: В коде используется число, которое несёт какой-то определённый смысл.
Решение: Замените это число константой с человеко-читаемым названием, объясняющим смысл этого числа.
Проблема: У вас есть публичное поле.
Решение: Сделайте поле приватным и создайте для него методы доступа.
Проблема: Класс содержит поле-коллекцию и простой геттер и сеттер для работы с этой коллекцией.
Решение: Сделайте возвращаемое геттером значение доступным только для чтения и создайте методы добавления/удаления элементов этой коллекции.
Проблема: В классе есть поле, содержащее кодирование типа. Значения этого типа не используются в условных операторах и не влияют на поведение программы.
Решение: Создайте новый класс и применяйте его объекты вместо значений закодированного типа.
Проблема: У вас есть закодированный тип, который непосредственно влияет на поведение программы (основываясь на значениях этого поля, в условных операторах выполняется различный код).
Решение: Для каждого значения закодированного типа, создайте подклассы. А затем, вынесите соответствующие поведения из исходного класса в эти подклассы. Управляющий код замените полиморфизмом.
Проблема: У вас есть закодированный тип, который влияет на поведение, но вы не можете использовать подклассы, чтобы избавиться от него.
Решение: Замените кодирование типа объектом-состоянием. При необходимости заменить значение поля с кодированием типа, в него подставляется другой объект-состояние.
Проблема: У вас есть подклассы, которые отличаются только методами, возвращающими данные-константы.
Решение: Замените методы полями в родительском классе и удалите подклассы.