---
title: "Substituir Código de Tipo por Classe"
type: "refactoring-technique"
slug: "replace-type-code-with-class"
url: "http://localhost:3000/pt-br/replace-type-code-with-class.md"
category: "Organizing Data"
description: "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."
---
# 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.

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

## 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.
## Relations

**Similar techniques**

- [Substituir Código de Tipo por Subclasses](/pt-br/replace-type-code-with-subclasses.md)
- [Substituir Código de Tipo por Estado/Estratégia](/pt-br/replace-type-code-with-state-strategy.md)

**Eliminates smells**

- [Obsessão por Primitivos](/pt-br/smells/primitive-obsession.md)

