---
title: "Introducir extensión local"
type: "refactoring-technique"
slug: "introduce-local-extension"
url: "http://localhost:3000/es/introduce-local-extension.md"
category: "Moving Features between Objects"
description: "Problema: una clase de utilidad no contiene algunos métodos que necesitas, pero no puedes añadir esos métodos a la clase. Solución: crea una clase nueva que contenga los métodos y conviértela en hija o en envoltorio (wrapper) de la clase de utilidad."
---
# Introducir extensión local

> Problema: una clase de utilidad no contiene algunos métodos que necesitas, pero no puedes añadir esos métodos a la clase. Solución: crea una clase nueva que contenga los métodos y conviértela en hija o en envoltorio (wrapper) de la clase de utilidad.

## Problem

Una clase de utilidad no contiene algunos métodos que necesitas, pero no puedes añadir esos métodos a la clase.

## Solution

Crea una clase nueva que contenga los métodos y conviértela en hija o en envoltorio (wrapper) de la clase de utilidad.

## Why Refactor

La clase que estás usando no tiene los métodos que necesitas. Lo que es peor, no puedes añadir esos métodos (porque las clases están en una biblioteca de terceros, por ejemplo). Hay dos salidas:

* Crear una **subclase** a partir de la clase relevante, que contenga los métodos y herede todo lo demás de la clase padre. Esta vía es más fácil, pero a veces la bloquea la propia clase de utilidad (a causa de `final`).
* Crear una clase **envoltorio** (wrapper) que contenga todos los métodos nuevos y que, por lo demás, delegue en el objeto relacionado de la clase de utilidad. Este método da más trabajo, ya que no solo necesitas código para mantener la relación entre el envoltorio y el objeto de utilidad, sino también una gran cantidad de métodos de delegación simple para emular la interfaz pública de la clase de utilidad.

## Benefits

* Al trasladar los métodos adicionales a una clase de extensión aparte (envoltorio o subclase), evitas atascar las clases cliente con código que no encaja. Los componentes del programa son más coherentes y más reutilizables.

## How to Refactor

1. Crea una clase de extensión nueva:

  * Opción A: conviértela en hija de la clase de utilidad.
  * Opción B: si has decidido crear un envoltorio, añade en él un campo para almacenar el objeto de la clase de utilidad al que se delegará. Si usas esta opción, también tendrás que crear métodos que repliquen los métodos públicos de la clase de utilidad y que contengan una simple delegación a los métodos del objeto de utilidad.
2. Crea un constructor que use los parámetros del constructor de la clase de utilidad.
3. Crea también un constructor «de conversión» alternativo que tome en sus parámetros únicamente el objeto de la clase original. Esto ayudará a sustituir los objetos de la clase original por la extensión.
4. Crea los nuevos métodos extendidos en la clase. Traslada a esta clase los métodos ajenos de otras clases o bien elimina esos métodos ajenos si su funcionalidad ya está presente en la extensión.
5. Sustituye el uso de la clase de utilidad por la nueva clase de extensión en los lugares donde se necesite su funcionalidad.
## Relations

**Similar techniques**

- [Introducir un método externo](/es/introduce-foreign-method.md)

**Eliminates smells**

- [Clase de biblioteca incompleta](/es/smells/incomplete-library-class.md)

