jueves, 25 de octubre de 2012

Designated Initializers

"Inicializadores Designados" (espero que sea una traducción aceptable).
He buscado tanto acerca de este tema y son tan escasas las referencias que vale la pena publicar una.

En Ansi C tenía el siguiente problema:
Necesito una estructura (struct) con algunos de sus miembros constantes:

struct
{
    int valor;
    const int constante1;
    const int constante2;
} mi_estructura;


El estándar no permite la inicialización de los elementos de una estructura, osea, si quiero que mis constantes sean 4 y 6:

struct
{
    const int constante1 = 4;
    const int constante2 = 6;
    int valor;
} mi_estructura;

NO ESTA PERMITIDO


Buscando encontré la forma de inicializar los miembros de struct. Entonces para hacer lo anterior correctamente sería:

struct
{
    const int constante1;
    const int constante2;
    int valor;
} mi_estructura = { 4, 6 };

PERMITIDO


Listo, ya hay una forma de hacerlo. Pero, aun no me gusta. La lista depende del orden en que coloco las variables miembro de struct. ¿que tal si muevo "int valor" al principio de la lista? ¿o si agrego una nueva variable? ¿o quito alguna?. Cuando lo haga debo ser muy cuidadoso en rehacer la lista de inicialización para respetar el nuevo orden (cuando alguien mas le haga mantenimiento a tu código después de tiempo, es MUY deseable que esto quede claro).

La solución (que escasamente pude encontrar) los "inicializadores designados" ("designed initializers"). Había sido tan simple como etiquetar cada elemento de la lista de inicialización anterior (un estilo muy similar a "enum"):

struct
{
    const int constante1;
    const int constante2;
    int valor;
} mi_estructura = { .constante2 =6, .constante1=4 };

PERMITIDO


Ahora si está mucho mejor. Quien le de mantenimiento a mi código debe fijarse solo en que el elemento constante de la estructura tenga su inicializador en la lista. Ya no debe preocuparse del orden y ni de una posible asignación errónea de valores.
Aún me gustaría evitar la edición en dos lugares, pero parece que es lo mejor que el estándar del C puede dar.


No hay comentarios:

Publicar un comentario