On Mon, 2007-05-07 at 17:35 -0400, Claudio Saavedra wrote:
> On Fri, 2007-05-04 at 10:28 -0400, Alejandro Valdes Jimenez wrote:
> > Adjunto un ejemplo que hice de gobject para que alguien si tiene un
> > tiempecito le de una miradita... quiero saber si está bien
> > implementado
> > y si es un buen ejemplo.
> 
> Le eché una mirada rápida, no soy experto en GObject, pero tengo algunos
> comentarios, ojalá te sean útiles:
> [lista de comentarios útiles]

Yo agregaría lo siguiente:

- Aprender y acostumbrarse a usar g_assert, g_return_if_fail y afines.

Si PersonaMainApp será parte de una biblioteca independiente, que puede
ser utilizada por otras aplicaciones, entonces usar g_return_if_fail o
g_return_val_if_fail.

Si es parte de la misma aplicación, entonces usar g_assert.

La idea es verificar los parámetros punteros que recibe cada
función/método; antes de realizar cualquier operación.  Esto es
para atrapar los errores tan pronto como sucedan.

Así, por ejemplo, está definida:

void
persona_main_app_agregar_persona (PersonaMainApp *obj, gchar *nombre,
gint edad)
{
        obj->nombre = g_string_new (nombre);
        obj->edad = edad;
}

¿Qué sucede si obj es nulo? ¿O no corresponde al tipo? Lo mismo
con nombre.

Lo correcto sería:

void
persona_main_app_agregar_persona (PersonaMainApp *obj, gchar *nombre,
gint edad)
{
        g_assert (PERSONA_IS_MAIN_APP (obj));
        g_assert (nombre != NULL);

        obj->nombre = g_string_new (nombre);
        obj->edad = edad;
}

Algo similar ocurre en otras funciones.

-- 
Germán Poó Caamaño
Concepción - Chile

Responder a