ConstructiCat Logo
CodeBust.
Browse section ▾

Substituir Código de Tipo por Classe.

Problem

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.

Solution

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

##Example

Antes
Person $ O : int$ A : int$ B : int$ AB : intbloodgroup : int
Depois
Person BloodGroup +O : BloodGroup$+A : BloodGroup$+B : BloodGroup$+AB : BloodGroup$ 1

##Why Refactor

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).

##Benefits

  • 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.

##How to Refactor

  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.