Code Smell #1 - Método Longo (Long Method)

Descrição

O Long Method se refere a um código que possui um método (ou função) muito longo, com muitas linhas de código. Esse é um problema comum em programação, pois métodos longos podem ser difíceis de ler, entender e manter.

Problema

Sinais de que um método pode estar sofrendo do code smell Long Method incluem:

  • O método tem muitas linhas de código, tornando difícil entender seu propósito.

  • O método realiza muitas tarefas diferentes, tornando difícil separar e compreender suas responsabilidades.

  • O método contém muitos loops, ifs e outras estruturas de controle, tornando difícil seguir seu fluxo.

  • O método é difícil de testar, pois abrange muitos cenários diferentes.

Solução

Os métodos longos podem ser um indicador de que o código está precisando ser refatorado para quebrar a funcionalidade em partes menores e mais gerenciáveis. Dividir o método em funções menores com nomes descritivos pode ajudar a tornar o código mais legível e fácil de manter.

  • Dividir os métodos para serem curtos e focados em uma única tarefa.

  • Reduzir o acoplamento excessivo entre os módulos ou classes.

Exemplo

Código com code smell Long Method

func calcularSalario(colaborador Colaborador) float64 {
  var salarioBase float64 = colaborador.SalarioBase
  var comissao float64 = colaborador.Comissao
  var horaExtra float64 = colaborador.HoraExtra

  // calcular o salário bruto
  var salarioBruto float64 = salarioBase + comissao 

  // calcular a hora extra (100 reais/hora)
  var salarioExtra = 0
  if horaExtra > 0 {
    salarioExtra = horaExtra  * 100
  }

  // calcular o salário total
  var salarioTotal float64 = salarioBruto + salarioExtra 

  // calcular impostos
  var imposto float64 = 0
  if salarioTotal > 5000 {
    imposto = salarioTotal * 0.2
  } else if salarioTotal > 3000 {
    imposto = salarioTotal * 0.1
  }

  // calcular salário líquido
  var salarioLiquido float64 = salarioTotal - imposto

  return salarioLiquido 
}

Código Refatorado

func calcularSalario(colaborador Colaborador) float64 {
  var salarioBase float64 = colaborador.SalarioBase
  var comissao float64 = colaborador.Comissao
  var horaExtra float64 = colaborador.HoraExtra

  var salarioBruto float64 = calcularSalarioBruto(salarioBase, comissao)
  var salarioExtra float64 = calcularHoraExtra(horaExtra)
  var salarioTotal float64 = calcularSalarioTotal(salarioBruto, salarioExtra )
  var impostosfloat64 = calcularImposto(salarioTotal)
  var salarioLiquido float64 = calcularSalarioLiquido(salarioTotal, impostos)

  return salarioLiquido 
}

func calcularSalarioBruto(salarioBase, comissao float64) float64 {
  return salarioBase + comissao 
}

func calcularHoraExtra(horaExtra float64) float64 {
  if horaExtra > 0 {
    salarioExtra = horaExtra  * 100
  }
  return 0
}

func calcularSalarioTotal(salarioBruto, salarioExtra float64) float64 {
  return salarioBruto + salarioExtra 
}

func calcularImposto(salarioTotal float64) float64 {
  if salarioTotal > 5000 {
    return salarioTotal * 0.2
  } else if salarioTotal > 3000 {
    return salarioTotal * 0.1
  }
  return 0
}

func calcularSalarioLiquido(salarioTotal, impostos float64) float64 {
  return salarioTotal - impostos 
}