---
title: "Substituir Parâmetro por Métodos Explícitos"
type: "refactoring-technique"
slug: "replace-parameter-with-explicit-methods"
url: "http://localhost:3000/pt-br/replace-parameter-with-explicit-methods.md"
category: "Simplifying Method Calls"
description: "Problema: Um método é dividido em partes, cada uma das quais é executada dependendo do valor de um parâmetro. Solução: Extraia as partes individuais do método para seus próprios métodos e chame-os em vez do método original."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Substituir Parâmetro por Métodos Explícitos

> Problema: Um método é dividido em partes, cada uma das quais é executada dependendo do valor de um parâmetro. Solução: Extraia as partes individuais do método para seus próprios métodos e chame-os em vez do método original.

## Problem

Um método é dividido em partes, cada uma das quais é executada dependendo do valor de um parâmetro.

## Solution

Extraia as partes individuais do método para seus próprios métodos e chame-os em vez do método original.

## Why Refactor

Um método contendo variantes dependentes de parâmetro tornou-se enorme. Código não trivial é executado em cada ramo e novas variantes são adicionadas muito raramente.

## Benefits

* Melhora a legibilidade do código. É muito mais fácil entender o propósito de `startEngine()` do que de `setValue("engineEnabled", true)`.

## How to Refactor

1. Para cada variante do método, crie um método separado. Execute esses métodos com base no valor de um parâmetro no método principal.
2. Encontre todos os lugares onde o método original é chamado. Nesses lugares, coloque uma chamada para uma das novas variantes dependentes de parâmetro.
3. Quando não restar nenhuma chamada para o método original, exclua-o.
## Relations

**Similar techniques**

- [Substituir Condicional por Polimorfismo](/pt-br/replace-conditional-with-polymorphism.md)

**Opposite refactorings**

- [Parametrizar Método](/pt-br/parameterize-method.md)

**Eliminates smells**

- [Comandos Switch](/pt-br/smells/switch-statements.md)
- [Método Longo](/pt-br/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"
        # Imprime o banner.
        # ...
    if name == "info"
        # Imprime as informações.
        # ...

// After
def outputBanner(self):
    # Imprime o banner.
    # ...

def outputInfo(self):
    # Imprime as informações.
    # ...
```

### 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;
}
```

