---
title: "Замена параметра набором специализированных методов"
type: "refactoring-technique"
slug: "replace-parameter-with-explicit-methods"
url: "http://localhost:3000/ru/replace-parameter-with-explicit-methods.md"
category: "Упрощение вызовов методов"
description: "Проблема: Метод разбит на части, каждая из которых выполняется в зависимости от значения какого-то параметра. Решение: Извлеките отдельные части метода в собственные методы и вызывайте их вместо оригинального метода."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Замена параметра набором специализированных методов

> Проблема: Метод разбит на части, каждая из которых выполняется в зависимости от значения какого-то параметра. Решение: Извлеките отдельные части метода в собственные методы и вызывайте их вместо оригинального метода.

## Problem

Метод разбит на части, каждая из которых выполняется в зависимости от значения какого-то параметра.

## Solution

Извлеките отдельные части метода в собственные методы и вызывайте их вместо оригинального метода.

## Why Refactor

Метод, содержащий варианты выполнения, разросся до грандиозных размеров. В каждой из таких цепочек выполняется нетривиальный код. При этом новые варианты добавляются очень редко.

## Benefits

* Улучшает читабельность кода. Куда очевидней, что делает метод `startEngine()` чем `setValue("engineEnabled", true)`.

## How to Refactor

1. Для каждого варианта исполнения метода создайте свой метод. Запускайте эти методы в зависимости от значения параметра в основном методе.
2. Найдите все места, где вызывается оригинальный метод. Подставьте туда вызов одного из новых методов в зависимости от передающегося параметра.
3. Когда не останется ни одного вызова оригинального метода, его можно будет удалить.
## Relations

**Similar techniques**

- [Замена условного оператора полиморфизмом](/ru/replace-conditional-with-polymorphism.md)

**Opposite refactorings**

- [Параметризация метода](/ru/parameterize-method.md)

**Eliminates smells**

- [Операторы switch](/ru/smells/switch-statements.md)
- [Длинный метод](/ru/smells/long-method.md)

## Code Examples

### java

```java
// Before
void setValue(String name, int value) {
  if (name.equals("height")) {
    height = value;
    return;
  }
  if (name.equals("width")) {
    width = value;
    return;
  }
  Assert.shouldNeverReachHere();
}

// After
void setHeight(int arg) {
  height = arg;
}
void setWidth(int arg) {
  width = arg;
}
```

### csharp

```csharp
// Before
void SetValue(string name, int value) 
{
  if (name.Equals("height")) 
  {
    height = value;
    return;
  }
  if (name.Equals("width")) 
  {
    width = value;
    return;
  }
  Assert.Fail();
}

// After
void SetHeight(int arg) 
{
  height = arg;
}
void SetWidth(int arg) 
{
  width = arg;
}
```

### php

```php
// Before
function setValue($name, $value) {
  if ($name === "height") {
    $this->height = $value;
    return;
  }
  if ($name === "width") {
    $this->width = $value;
    return;
  }
  assert("Should never reach here");
}

// After
function setHeight($arg) {
  $this->height = $arg;
}
function setWidth($arg) {
  $this->width = $arg;
}
```

### python

```python
// Before
def output(self, name):
    if name == "banner"
        # Print the banner.
        # ...
    if name == "info"
        # Print the info.
        # ...

// After
def outputBanner(self):
    # Print the banner.
    # ...

def outputInfo(self):
    # Print the info.
    # ...
```

### typescript

```typescript
// Before
setValue(name: string, value: number): void {
  if (name.equals("height")) {
    height = value;
    return;
  }
  if (name.equals("width")) {
    width = value;
    return;
  }
  
}

// After
setHeight(arg: number): void {
  height = arg;
}
setWidth(arg: number): number {
  width = arg;
}
```

