---
title: "Инкапсуляция поля"
type: "refactoring-technique"
slug: "encapsulate-field"
url: "http://localhost:3000/ru/encapsulate-field.md"
category: "Организация данных"
description: "Проблема: У вас есть публичное поле. Решение: Сделайте поле приватным и создайте для него методы доступа."
languages: ["java", "csharp", "php", "typescript"]
---
# Инкапсуляция поля

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

## Problem

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

## Solution

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

## Why Refactor

Одним из столпов объектного программирования является _Инкапсуляция_ или возможность сокрытия данных объекта. Иначе все данные объектов были бы публичными, и другие объекты могли бы получать и модифицировать данные вашего объекта без его ведома. При этом отделяются данные от поведений, связанных с этими данными, ухудшается модульность частей программы и усложняется её поддержка.

## Benefits

* Если данные и поведения какого-то компонента тесно связанны между собой и находятся в одном месте в коде, вам гораздо проще поддерживать и развивать этот компонент.
* Кроме того, вы можете производить какие-то сложные операции, связанные с доступом к полям объекта.

## How to Refactor

1. Создайте геттер и сеттер для поля.
2. Найдите все обращения к полю. Замените получение значения из поля геттером, а установку новых значений в поле — сеттером.
3. После того как все обращения к полям заменены, сделайте поле приватным.

#### Последующие шаги

«Инкапсуляция поля» является всего лишь первым шагом к сближению данных и поведений над этими данными. После того как вы создали простые методы доступа к полям, стоит ещё раз проверить места, где эти методы вызываются. Вполне возможно, код из этих участков уместнее смотрелся бы в самих методах доступа.
## Relations

**Similar techniques**

- [Самоинкапсуляция поля](/ru/self-encapsulate-field.md)

**Eliminates smells**

- [Класс данных](/ru/smells/data-class.md)

## Code Examples

### java

```java
// Before
class Person {
  public String name;
}

// After
class Person {
  private String name;

  public String getName() {
    return name;
  }
  public void setName(String arg) {
    name = arg;
  }
}
```

### csharp

```csharp
// Before
class Person 
{
  public string name;
}

// After
class Person 
{
  private string name;

  public string Name
  {
    get { return name; }
    set { name = value; }
  }
}
```

### php

```php
// Before
public $name;

// After
private $name;

public getName() {
  return $this->name;
}

public setName($arg) {
  $this->name = $arg;
}
```

### typescript

```typescript
// Before
class Person {
  name: string;
}

// After
class Person {
  private _name: string;

  get name() {
    return this._name;
  }
  setName(arg: string): void {
    this._name = arg;
  }
}
```

