---
title: "Substituir Algoritmo"
type: "refactoring-technique"
slug: "substitute-algorithm"
url: "http://localhost:3000/pt-br/substitute-algorithm.md"
category: "Composing Methods"
description: "Problema: Então você quer substituir um algoritmo existente por um novo? Solução: Substitua o corpo do método que implementa o algoritmo por um novo algoritmo."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Substituir Algoritmo

> Problema: Então você quer substituir um algoritmo existente por um novo? Solução: Substitua o corpo do método que implementa o algoritmo por um novo algoritmo.

## Problem

Então você quer substituir um algoritmo existente por um novo?

## Solution

Substitua o corpo do método que implementa o algoritmo por um novo algoritmo.

## Why Refactor

1. A refatoração gradual não é o único método para melhorar um programa. Às vezes um método está tão cheio de problemas que é mais fácil demoli-lo e começar do zero. E talvez você tenha encontrado um algoritmo que seja muito mais simples e eficiente. Se for esse o caso, basta substituir o algoritmo antigo pelo novo.
2. Com o passar do tempo, seu algoritmo pode ser incorporado a uma biblioteca ou framework bem conhecido e você quer se livrar da sua implementação independente, a fim de simplificar a manutenção.
3. Os requisitos do seu programa podem mudar de forma tão drástica que o seu algoritmo existente não pode ser aproveitado para a tarefa.

## How to Refactor

1. Certifique-se de ter simplificado o algoritmo existente o máximo possível. Mova o código não essencial para outros métodos usando [Extrair Método](/pt-br/extract-method). Quanto menos partes móveis houver no seu algoritmo, mais fácil será substituí-lo.
2. Crie seu novo algoritmo em um novo método. Substitua o algoritmo antigo pelo novo e comece a testar o programa.
3. Se os resultados não corresponderem, volte à implementação antiga e compare os resultados. Identifique as causas da discrepância. Embora a causa muitas vezes seja um erro no algoritmo antigo, é mais provável que se deva a algo que não está funcionando no novo.
4. Quando todos os testes forem concluídos com sucesso, exclua o algoritmo antigo de vez!
## Relations

**Eliminates smells**

- [Código Duplicado](/pt-br/smells/duplicate-code.md)
- [Método Longo](/pt-br/smells/long-method.md)

## Code Examples

### java

```java
// Before
String foundPerson(String[] people){
  for (int i = 0; i < people.length; i++) {
    if (people[i].equals("Don")){
      return "Don";
    }
    if (people[i].equals("John")){
      return "John";
    }
    if (people[i].equals("Kent")){
      return "Kent";
    }
  }
  return "";
}

// After
String foundPerson(String[] people){
  List candidates =
    Arrays.asList(new String[] {"Don", "John", "Kent"});
  for (int i=0; i < people.length; i++) {
    if (candidates.contains(people[i])) {
      return people[i];
    }
  }
  return "";
}
```

### csharp

```csharp
// Before
string FoundPerson(string[] people)
{
  for (int i = 0; i < people.Length; i++) 
  {
    if (people[i].Equals("Don"))
    {
      return "Don";
    }
    if (people[i].Equals("John"))
    {
      return "John";
    }
    if (people[i].Equals("Kent"))
    {
      return "Kent";
    }
  }
  return String.Empty;
}

// After
string FoundPerson(string[] people)
{
  List<string> candidates = new List<string>() {"Don", "John", "Kent"};
  
  for (int i = 0; i < people.Length; i++) 
  {
    if (candidates.Contains(people[i])) 
    {
      return people[i];
    }
  }
  
  return String.Empty;
}
```

### php

```php
// Before
function foundPerson(array $people){
  for ($i = 0; $i < count($people); $i++) {
    if ($people[$i] === "Don") {
      return "Don";
    }
    if ($people[$i] === "John") {
      return "John";
    }
    if ($people[$i] === "Kent") {
      return "Kent";
    }
  }
  return "";
}

// After
function foundPerson(array $people){
  foreach (["Don", "John", "Kent"] as $needle) {
    $id = array_search($needle, $people, true);
    if ($id !== false) {
      return $people[$id];
    }
  }
  return "";
}
```

### python

```python
// Before
def foundPerson(people):
    for i in range(len(people)):
        if people[i] == "Don":
            return "Don"
        if people[i] == "John":
            return "John"
        if people[i] == "Kent":
            return "Kent"
    return ""

// After
def foundPerson(people):
    candidates = ["Don", "John", "Kent"]
    return people if people in candidates else ""
```

### typescript

```typescript
// Before
foundPerson(people: string[]): string{
  for (let person of people) {
    if (person.equals("Don")){
      return "Don";
    }
    if (person.equals("John")){
      return "John";
    }
    if (person.equals("Kent")){
      return "Kent";
    }
  }
  return "";
}

// After
foundPerson(people: string[]): string{
  let candidates = ["Don", "John", "Kent"];
  for (let person of people) {
    if (candidates.includes(person)) {
      return person;
    }
  }
  return "";
}
```

