ConstructiCat Logo
CodeBust.
Browse section ▾

Extraer subclase.

Problem

Una clase tiene características que solo se usan en determinados casos.

Solution

Crea una subclase y úsala en esos casos.

##Example

Antes
Job Item +getTotalPrice()+getUnitPrice()+getEmployee()
Después
Job Item +getTotalPrice()+getUnitPrice()+getEmployee() Labor Item +getUnitPrice()+getEmployee()

##Why Refactor

Tu clase principal tiene métodos y campos para implementar cierto caso de uso poco frecuente de la clase. Aunque el caso es poco frecuente, la clase es responsable de él y sería incorrecto trasladar todos los campos y métodos asociados a una clase totalmente independiente. Pero sí podrían trasladarse a una subclase, que es justo lo que haremos con ayuda de esta técnica de refactorización.

##Benefits

  • Crea una subclase de forma rápida y sencilla.

  • Puedes crear varias subclases independientes si tu clase principal está implementando actualmente más de uno de esos casos especiales.

##How to Refactor

  1. Crea una nueva subclase a partir de la clase de interés.

  2. Si necesitas datos adicionales para crear objetos de una subclase, crea un constructor y añádele los parámetros necesarios. No olvides llamar a la implementación del constructor de la clase padre.

  3. Encuentra todas las llamadas al constructor de la clase padre. Cuando se necesite la funcionalidad de una subclase, sustituye el constructor de la clase padre por el constructor de la subclase.

  4. Traslada los métodos y campos necesarios de la clase padre a la subclase. Hazlo mediante Descender método y Descender campo. Es más sencillo empezar trasladando primero los métodos. De este modo, los campos permanecen accesibles durante todo el proceso: desde la clase padre antes del traslado, y desde la propia subclase una vez completado el traslado.

  5. Una vez lista la subclase, encuentra todos los antiguos campos que controlaban la elección de funcionalidad. Elimina esos campos usando polimorfismo para sustituir todos los operadores en los que se habían utilizado los campos. Un ejemplo sencillo: en la clase Car tenías el campo isElectricCar y, en función de él, en el método refuel() el coche se llena de gasolina o se carga de electricidad. Tras la refactorización, el campo isElectricCar se elimina y las clases Car y ElectricCar tendrán sus propias implementaciones del método refuel().