---
title: "Свёртывание иерархии"
type: "refactoring-technique"
slug: "collapse-hierarchy"
url: "http://localhost:3000/ru/collapse-hierarchy.md"
category: "Решение задач обобщения"
description: "Проблема: У вас есть некая иерархия классов, в которой подкласс мало чем отличается от суперкласса. Решение: Слейте подкласс и суперкласс воедино."
---
# Свёртывание иерархии

> Проблема: У вас есть некая иерархия классов, в которой подкласс мало чем отличается от суперкласса. Решение: Слейте подкласс и суперкласс воедино.

## Problem

У вас есть некая иерархия классов, в которой подкласс мало чем отличается от суперкласса.

## Solution

Слейте подкласс и суперкласс воедино.

## Why Refactor

Развитие программы привело к тому, что подкласс и суперкласс стали очень мало отличаться друг от друга. Какая-то фича была убрана из подкласса, какой-то метод «переехал» в суперкласс, и вот вы уже имеете два практически одинаковых класса.

## Benefits

* Уменьшается сложность программы. Меньше классов, меньше вещей, которые нужно держать в голове, меньше «движущихся частей», меньше вероятность сломать что-то при последующих изменениях в коде.
* Навигация по коду становится проще, когда методы определены только в одном классе. Нужный метод не приходится искать по всей иерархии.

## How to Refactor

1. Выберите, какой класс убрать удобнее: суперкласс или подкласс.
2. Используйте [подъём поля](/ru/pull-up-field) и [подъём метода](/ru/pull-up-method), если вы решили избавиться от подкласса. Используйте [спуск поля](/ru/push-down-field) и [спуск метода](/ru/push-down-method), если убран будет суперкласс.
3. Замените все использования класса, который будет удалён, классом, в который переезжают поля и методы. Зачастую это будет код создания классов, указания типов параметров и переменных, а также документации в комментариях.
4. Удалите пустой класс.
## Relations

**Similar techniques**

- [Встраивание класса](/ru/inline-class.md)

**Eliminates smells**

- [Ленивый класс](/ru/smells/lazy-class.md)
- [Теоретическая общность](/ru/smells/speculative-generality.md)

