Logotipo do ConstructiCat
CodeBust.
Explorar a seção ▾

Substituir Código de Tipo por Classe.

Problema

Uma classe tem um campo que contém um código de tipo. Os valores desse tipo não são usados em condições de operadores e não afetam o comportamento do programa.

Solução

Crie uma nova classe e use seus objetos no lugar dos valores do código de tipo.

##Exemplo

Antes
class Person {
  static final int O = 0;
  static final int A = 1;
  static final int B = 2;
  static final int AB = 3;
  private int bloodGroup;
}
Depois
class Person {
  private BloodGroup bloodGroup;
}
class BloodGroup {
  static final BloodGroup O = new BloodGroup(0);
  static final BloodGroup A = new BloodGroup(1);
  static final BloodGroup B = new BloodGroup(2);
  static final BloodGroup AB = new BloodGroup(3);
  private final int code;

  private BloodGroup(int code) { this.code = code; }
}

##Por que refatorar

Uma das razões mais comuns para o código de tipo é o trabalho com bancos de dados, quando um banco tem campos em que algum conceito complexo é codificado com um número ou uma string.

Por exemplo, você tem a classe User com o campo user_role, que contém informações sobre os privilégios de acesso de cada usuário, seja administrador, editor ou usuário comum. Então, nesse caso, essa informação é codificada no campo como A, E e U, respectivamente.

Quais são as deficiências dessa abordagem? Os setters do campo muitas vezes não verificam qual valor é enviado, o que pode causar grandes problemas quando alguém envia valores não intencionais ou errados para esses campos.

Além disso, a verificação de tipo é impossível para esses campos. É possível enviar qualquer número ou string para eles, que não terá o tipo verificado pela sua IDE e ainda permitirá que o programa rode (e quebre depois).

##Benefícios

  • Queremos transformar conjuntos de valores primitivos—que é o que os tipos codificados são—em classes completas, com todos os benefícios que a programação orientada a objetos tem a oferecer.

  • Ao substituir o código de tipo por classes, permitimos a verificação de tipos para os valores passados a métodos e campos no nível da linguagem de programação.

    Por exemplo, enquanto antes o compilador não enxergava diferença entre a sua constante numérica e algum número arbitrário quando um valor era passado a um método, agora, quando dados que não correspondem à classe de tipo indicada são passados, você é avisado do erro dentro da sua IDE.

  • Assim tornamos possível mover código para as classes do tipo. Se você precisava realizar manipulações complexas com os valores do tipo por todo o programa, agora esse código pode “viver” dentro de uma ou várias classes de tipo.

##Como refatorar

  1. Crie uma nova classe e dê a ela um novo nome que corresponda ao propósito do tipo codificado. Aqui vamos chamá-la de classe de tipo.

  2. Copie o campo que contém o código de tipo para a classe de tipo e torne-o privado. Em seguida, crie um getter para o campo. Um valor será atribuído a esse campo somente a partir do construtor.

  3. Para cada valor do tipo codificado, crie um método estático na classe de tipo. Ele criará um novo objeto da classe de tipo correspondente a esse valor do tipo codificado.

  4. Na classe original, substitua o tipo do campo codificado pela classe de tipo. Crie um novo objeto desse tipo no construtor, bem como no setter do campo. Altere o getter do campo para que ele chame o getter da classe de tipo.

  5. Substitua quaisquer menções a valores do tipo codificado por chamadas dos métodos estáticos relevantes da classe de tipo.

  6. Remova as constantes do tipo codificado da classe original.