---
title: "Замена простого поля объектом"
type: "refactoring-technique"
slug: "replace-data-value-with-object"
url: "http://localhost:3000/ru/replace-data-value-with-object.md"
category: "Организация данных"
description: "Проблема: В классе (или группе классов) есть поле простого типа. У этого поля есть своё поведение и связанные данные. Решение: Создайте новый класс, поместите в него старое поле и его поведения, храните объект этого класса в исходном классе."
---
# Замена простого поля объектом

> Проблема: В классе (или группе классов) есть поле простого типа. У этого поля есть своё поведение и связанные данные. Решение: Создайте новый класс, поместите в него старое поле и его поведения, храните объект этого класса в исходном классе.

## Problem

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

## Solution

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

## Why Refactor

В целом этот рефакторинг является частным случаем [извлечения класса](/ru/extract-class). Отличия заключаются в причинах, повлёкших рефакторинг.

В [извлечении класса](/ru/extract-class) мы имеем один класс, который отвечает за разные вещи, и хотим разделить его ответственность.

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

Поэтому мы создаём для всего этого новый класс и перемещаем в него не только само поле, но и связанные с ним данные и поведения.

## Benefits

* Улучшает связность внутри классов. Данные и поведения этих данных находятся в одном классе.

## How to Refactor

Перед началом рефакторинга, посмотрите есть ли прямые обращения к полю внутри класса. Если да, примените [самоинкапсуляцию поля](/ru/self-encapsulate-field), чтобы скрыть его в исходном классе.

1. Создайте новый класс и скопируйте в него ваше поле и его геттер. Кроме того, создайте конструктор, принимающий простое значение этого поля. В этом классе не будет сеттера, так как каждое новое значение поля, подаваемое в оригинальный класс, будет создавать новый объект-значение.
2. В исходном классе поменяйте тип поля на новый класс.
3. В его геттере в исходном классе обращайтесь к геттеру связанного объекта.
4. В сеттере создайте новый объект-значение. Возможно, вам потребуется также создать новый объект в конструкторе, если ранее там задавались какие-то начальные значения для поля.
## Relations

**Similar techniques**

- [Извлечение класса](/ru/extract-class.md)
- [Замена параметров объектом](/ru/introduce-parameter-object.md)
- [Замена поля-массива объектом](/ru/replace-array-with-object.md)
- [Замена метода объектом методов](/ru/replace-method-with-method-object.md)

**Eliminates smells**

- [Дублирование кода](/ru/smells/duplicate-code.md)

