---
title: "Extrair Classe"
type: "refactoring-technique"
slug: "extract-class"
url: "http://localhost:3000/pt-br/extract-class.md"
category: "Moving Features between Objects"
description: "Problema: Quando uma classe faz o trabalho de duas, surge um desconforto. Solução: Em vez disso, crie uma nova classe e coloque nela os campos e métodos responsáveis pela funcionalidade relevante."
---
# Extrair Classe

> Problema: Quando uma classe faz o trabalho de duas, surge um desconforto. Solução: Em vez disso, crie uma nova classe e coloque nela os campos e métodos responsáveis pela funcionalidade relevante.

## Problem

Quando uma classe faz o trabalho de duas, surge um desconforto.

## Solution

Em vez disso, crie uma nova classe e coloque nela os campos e métodos responsáveis pela funcionalidade relevante.

## Why Refactor

As classes sempre começam claras e fáceis de entender. Elas fazem o seu trabalho e cuidam da própria vida, por assim dizer, sem se intrometer no trabalho de outras classes. Mas, à medida que o programa cresce, um método é adicionado e depois um campo... e, no fim, algumas classes acabam desempenhando mais responsabilidades do que jamais se imaginou.

## Benefits

* Este método de refatoração ajudará a manter a aderência ao _Princípio da Responsabilidade Única_. O código das suas classes ficará mais óbvio e compreensível.
* Classes com responsabilidade única são mais confiáveis e tolerantes a mudanças. Por exemplo, digamos que você tenha uma classe responsável por dez coisas diferentes. Quando você altera essa classe para torná-la melhor em uma coisa, corre o risco de quebrá-la nas outras nove.

## How to Refactor

Antes de começar, decida exatamente como você quer dividir as responsabilidades da classe.

1. Crie uma nova classe para conter a funcionalidade relevante.
2. Crie uma relação entre a classe antiga e a nova. Idealmente, essa relação é unidirecional; isso permite reutilizar a segunda classe sem problemas. No entanto, se você achar que uma relação bidirecional é necessária, ela sempre pode ser estabelecida.
3. Use [Mover Campo](/pt-br/move-field) e [Mover Método](/pt-br/move-method) para cada campo e método que você decidiu mover para a nova classe. Para os métodos, comece pelos privados, a fim de reduzir o risco de cometer um grande número de erros. Tente realocar apenas um pouco de cada vez e teste os resultados após cada movimentação, para evitar um acúmulo de correções de erros bem no final.
Depois de terminar a movimentação, dê mais uma olhada nas classes resultantes. Uma classe antiga com responsabilidades alteradas pode ser renomeada para aumentar a clareza. Verifique novamente se você consegue se livrar de relações bidirecionais entre classes, caso alguma esteja presente.
4. Pense também na acessibilidade à nova classe a partir do exterior. Você pode ocultar a classe completamente do cliente, tornando-a privada e gerenciando-a por meio dos campos da classe antiga. Como alternativa, você pode torná-la pública, permitindo que o cliente altere os valores diretamente. Sua decisão aqui depende de quão seguro é para o comportamento da classe antiga quando mudanças diretas inesperadas são feitas nos valores da nova classe.
## Relations

**Similar techniques**

- [Extrair Subclasse](/pt-br/extract-subclass.md)
- [Substituir Valor de Dado por Objeto](/pt-br/replace-data-value-with-object.md)

**Opposite refactorings**

- [Classe Inline](/pt-br/inline-class.md)

**Eliminates smells**

- [Código Duplicado](/pt-br/smells/duplicate-code.md)
- [Classe Grande](/pt-br/smells/large-class.md)
- [Mudança Divergente](/pt-br/smells/divergent-change.md)
- [Aglomerados de Dados](/pt-br/smells/data-clumps.md)
- [Obsessão por Primitivos](/pt-br/smells/primitive-obsession.md)
- [Campo Temporário](/pt-br/smells/temporary-field.md)
- [Intimidade Inapropriada](/pt-br/smells/inappropriate-intimacy.md)

