Effective Java: C#, 2. Considera un “builder” cuando te enfrentes a muchos parámetros en el constructor

12mar10

(He mantenido el término inglés “builder” porque constructor, en español, ya se usa para traducir el término inglés “consructor”.)

Como apunta el libro de Bloch, los constructores con un elevado número de parámetros son problemáticos. Muchos de sus parámetros suelen tener valores por defecto. Cuando es el caso, resulta tedioso para el programador tener que suministrar explícitamente estos valores por defecto, así que el diseñador de la clase suele sobrecargar el constructor de la clase. Un ejemplo:

public class Clase
{
    public Clase(int par1, int par2)
    {
        ...
    }

    public Clase(int par1)
    {
        this(par1, 0);
    }
}

Todo un problema: el perfil de cada constructor debe ser diferente, y eso no siempre es posible. Pongamos por caso este constructor:

public class Clase
{
    public Clase(int par1, int par2, int par3)
    {
    }
}

Supongamos que par2 puede tomar 0 como valor por defecto y que par3 puede tomar 1 como valor defecto. Podemos definir estos constructores:

public class Clase
{
    public Clase(int par1, int par2, int par3)
    {
        ...
    }

    public Clase(int par1, int par2)
    {
        this(par1, par2, 1);
    }

    public Clase(int par1)
    {
        this(par1, 0);
    }
}

El usuario puede omitir el valor de par3 u omitir el valor de par2 y par3, pero no puede omitir sólo el valor de par2. Y hay una pega adicional: el valor por defecto se ha codificado en cuerpo del constructor, lo que dificulta la legibilidad.

C# 4.0 soluciona el problema con el uso de parámetros con valor por defecto y parámetros con nombre. En C# 4.0 codificaríamos un único constructor:

public class Clase
{
    public Clase(int par1, int par2=0, int par3=1)
    {
        ...
    }

Todas estas instanciaciones de objetos de la clase Clase son ahora legítimas:

var o1 = new Clase(1, 10, 20);
var o2 = new Clase(1, 10); //par 3 vale 1
var o3 = new Clase(1); // par2 vale 0 y par3 vale 1
var o4 = new Clase(1, par2: 2); // par2 vale 2 y par3 vale 1
var o5 = new Clase(1, par2: 2, par3: 4); // par2 vale 2 y par3 vale 4
var o6 = new Clase(1, par3: 4); // par2 vale 0 y par3 vale 4
var o7 = new Clase(1, par3: 4, par2: 10); // par2 vale 10 y par3 vale 4

Los parámetros con nombre no sólo son útiles para ahorrarnos sobrecargas de constructores. En cualquier método con más de, digamos, tres parámetros, poder dar nombre a los argumentos cuando se hace una invocación aumenta la legibilidad del código.

Los builder siguen resultando útiles en ciertos contextos, pero en muchos otros dejan de ser necesarios con esta característica de C# 4.0.

¡Ah! Una restricción: los valores por defecto deben ser evaluables en tiempo de compilación. Eso obliga a dar algún que otro rodeo cuando se quiere suministrar un valor por defecto calculado en tiempo de ejecución.



No Responses Yet to “Effective Java: C#, 2. Considera un “builder” cuando te enfrentes a muchos parámetros en el constructor”

  1. Dejar un comentario

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s


Seguir

Get every new post delivered to your Inbox.