ConstructiCat Logo
CodeBust.
Browse section ▾

Remover Atribuições a Parâmetros.

Problem

Algum valor é atribuído a um parâmetro dentro do corpo do método.

Solution

Use uma variável local em vez de um parâmetro.

##Example

Before
int discount(int inputVal, int quantity) {
  if (quantity > 50) {
    inputVal -= 2;
  }
  // ...
}
After
int discount(int inputVal, int quantity) {
  int result = inputVal;
  if (quantity > 50) {
    result -= 2;
  }
  // ...
}

##Why Refactor

Os motivos para essa refatoração são os mesmos de Separar Variável Temporária, mas neste caso estamos lidando com um parâmetro, e não com uma variável local.

Primeiro, se um parâmetro é passado por referência, então, depois que o valor do parâmetro é alterado dentro do método, esse valor é repassado ao argumento que solicitou a chamada desse método. Muitas vezes isso acontece por acidente e leva a efeitos indesejados. Mesmo que, na sua linguagem de programação, os parâmetros normalmente sejam passados por valor (e não por referência), essa peculiaridade de codificação pode incomodar quem não está acostumado a ela.

Segundo, várias atribuições de valores diferentes a um único parâmetro dificultam saber quais dados o parâmetro deveria conter em determinado momento. O problema piora se o seu parâmetro e seu conteúdo estão documentados, mas o valor real pode diferir do que se espera dentro do método.

##Benefits

  • Cada elemento do programa deve ser responsável por apenas uma coisa. Isso facilita muito a manutenção do código daqui para frente, já que você pode substituir o código com segurança, sem efeitos colaterais.

  • Essa refatoração ajuda a extrair código repetitivo para métodos separados.

##How to Refactor

  1. Crie uma variável local e atribua a ela o valor inicial do seu parâmetro.

  2. Em todo o código do método que vem após essa linha, substitua o parâmetro pela sua nova variável local.