Grow by addition

«Code should grow by addition rather than mutation.»

Measuring the closure of code, Michael Feathers

Este heurístico se refiere a la manera en cómo introducir una nueva funcionalidad en el código: modificando elementos existentes o creando nuevos elementos (objetos, archivos, etc). Es, también, una manera de pensar en el diseño del código orientado a que pueda crecer y ser modificado de una manera más sencilla.

Especialización y delegación (herencia y composición)

En un ejemplo como el siguiente, de un editor gráfico, la lógica de mostrar en pantalla un elemento está centralizada en el método display(). Para añadir un elemento nuevo, es necesario modificar este método para incluirlo.

public void display() {
    switch (getType()) {
        case RECTANGLE :
            //...
            break;
        case OVAL :
            //...
            break;
        case TEXT :
            //...
            break;
        default :
            break;
        }
}

Usando la especialización (herencia) y la delegación, podemos convertir este método condicional en un sistema de mensajes.

public void display() {
    getType().display();
}

Otros enlaces de interés

  • En la siguiente charla, Santi Metz habla de herencia, composición y condicionales. La idea fuerza es la misma: saber cuándo usar herencia y cuándo composición. Metz se declara  infectada por la manera de pensar del SmallTalk de Alan Kay:

  • Un patrón muy común en este contexto es el NullObjectPattern. Ver también SpecialCase de Martin Fowler. La idea es convertir el caso nulo en un objeto del dominio eliminando así los condicionales que chequean si un objeto es nulo, pivotando el código sobre la idea de composición.

 

Terminología relacionada