---
title: "Передача всего объекта"
type: "refactoring-technique"
slug: "preserve-whole-object"
url: "http://localhost:3000/ru/preserve-whole-object.md"
category: "Упрощение вызовов методов"
description: "Проблема: Вы получаете несколько значений из объекта, а затем передаёте их в метод как параметры. Решение: Вместо этого передавайте весь объект."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Передача всего объекта

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

## Problem

Вы получаете несколько значений из объекта, а затем передаёте их в метод как параметры.

## Solution

Вместо этого передавайте весь объект.

## Why Refactor

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

Вместо этого код получения всех нужных данных может храниться одном месте — в самом методе.

## Benefits

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

## How to Refactor

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

**Similar techniques**

- [Замена параметров объектом](/ru/introduce-parameter-object.md)
- [Замена параметра вызовом метода](/ru/replace-parameter-with-method-call.md)

**Eliminates smells**

- [Одержимость элементарными типами](/ru/smells/primitive-obsession.md)
- [Длинный список параметров](/ru/smells/long-parameter-list.md)
- [Длинный метод](/ru/smells/long-method.md)
- [Группы данных](/ru/smells/data-clumps.md)

## Code Examples

### java

```java
// Before
int low = daysTempRange.getLow();
int high = daysTempRange.getHigh();
boolean withinPlan = plan.withinRange(low, high);

// After
boolean withinPlan = plan.withinRange(daysTempRange);
```

### csharp

```csharp
// Before
int low = daysTempRange.GetLow();
int high = daysTempRange.GetHigh();
bool withinPlan = plan.WithinRange(low, high);

// After
bool withinPlan = plan.WithinRange(daysTempRange);
```

### php

```php
// Before
$low = $daysTempRange->getLow();
$high = $daysTempRange->getHigh();
$withinPlan = $plan->withinRange($low, $high);

// After
$withinPlan = $plan->withinRange($daysTempRange);
```

### python

```python
// Before
low = daysTempRange.getLow()
high = daysTempRange.getHigh()
withinPlan = plan.withinRange(low, high)

// After
withinPlan = plan.withinRange(daysTempRange)
```

### typescript

```typescript
// Before
let low = daysTempRange.getLow();
let high = daysTempRange.getHigh();
let withinPlan = plan.withinRange(low, high);

// After
let withinPlan = plan.withinRange(daysTempRange);
```

