---
title: "Разделение запроса и модификатора"
type: "refactoring-technique"
slug: "separate-query-from-modifier"
url: "http://localhost:3000/ru/separate-query-from-modifier.md"
category: "Упрощение вызовов методов"
description: "Проблема: У вас есть метод, который возвращает какое-то значение, но при этом в процессе работы он изменяет что-то внутри объекта. Решение: Разделите метод на два разных метода. Один из них пускай возвращает значение, а второй модифицирует объект."
---
# Разделение запроса и модификатора

> Проблема: У вас есть метод, который возвращает какое-то значение, но при этом в процессе работы он изменяет что-то внутри объекта. Решение: Разделите метод на два разных метода. Один из них пускай возвращает значение, а второй модифицирует объект.

## Problem

У вас есть метод, который возвращает какое-то значение, но при этом в процессе работы он изменяет что-то внутри объекта.

## Solution

Разделите метод на два разных метода. Один из них пускай возвращает значение, а второй модифицирует объект.

## Why Refactor

Этот рефакторинг является реализацией _принципа разделения команд от запросов данных_. Суть принципа сводится к тому, чтобы отделять код получения каких-то данных от кода, который изменяет что-то внутри объекта.

Код получения данных называют **запросами**, а код изменения _видимого состояния_ объекта — **модификаторами**. Когда _запрос_ и _модификатор_ совмещены, у вас нет способа получить данные из объекта без того, чтобы не внести изменения в его состояние. Другими словами, вы задаёте вопрос и можете изменить ответ прямо в процессе его получения. Усугубляется эта проблема тем, что человек, вызывающий запрос, может не знать о «побочных действиях» такого метода, что нередко приводит к ошибкам выполнения программы.

Однако стоит подчеркнуть, что «побочными действиями» опасны только те _модификаторы_, которые меняют **видимое** состояние объекта. Это, например, поля, которые доступны из публичного интерфейса объекта, записи в базе данных, в файлах и т. д. Если какой-то _модификатор_ всего лишь кеширует какую-то сложную операцию и сохраняет её внутри приватного поля класса, он вряд ли приведёт к «побочным действиям».

## Benefits

* Если у вас есть _запрос_, который не меняет состояние программы, вы можете вызывать его сколько угодно раз, не опасаясь того, что результат изменится от самого факта вызова метода.

## How to Refactor

1. Создайте новый _метод-запрос_, который бы возвращал то, что возвращал оригинальный метод.
2. Сделайте так, чтобы оригинальный метод возвращал только результат вызова нового _метода-запроса_.
3. Замените все обращения к оригинальному методу вызовом _метода-запроса_. Непосредственно перед этой строкой нужно вставить вызов _метода-модификатора_. Это убережёт вас от побочных действий в случае, если оригинальный метод использовался в описании условных операторов и циклов.
4. Избавьтесь от кода возврата значения в оригинальном методе. После этого он станет правильным _методом-модификатором_.
## Relations

**Helps you do**

- [Замена переменной вызовом метода](/ru/replace-temp-with-query.md)

