Cuando se va a empezar con el desarrollo de una aplicación, siempre se realizan distintas acciones como:
- Pruebas de concepto: Mirar ejemplos, documentación, restricciones, etc.. de las tecnologías que se van a utilizar.
- Toma de requisitos: Hablar con el cliente para ver a mas bajo nivel la información.
- Definir metodología de trabajo: Establecer que procedimientos se van a utilizar para asignar tareas, herramientas de integración continua, etc..
- Etc..
Pero hay tareas de la que todo el mundo habla y a las que no se quiere enfrentar nadie como:
- Definición de clases, ficheros con funciones, etc.. que se van a utilizar.
- Metodología de programación.
- Adecuación de la información a la forma de programar.
- Etc…
Es decir, la forma de programar es libre y que cada uno haga lo que quiera. Voy a ilustrar el “cuento” de la función mutante. Este cuento nos va a sonar a todos e ilustra perfectamente como una linda función se convierte en un monstruo.
Hace mucho tiempo en un país muy lejano, había un proyecto consistente en la gestión de “algo” una empresa “cualquiera”. Mientras se está desarrollado, de cualquier manera, el programador lee un requisito que le pide que cree una linda función “altaDeUsuario” donde llega un objeto (o estructura) y este se da de alta en base de datos.
El programador, tan contento y risueño ve que el requerimiento no dice nada más y que hay una función en el controlador de Base de Datos para darlo de alta. Se crea la siguiente función:
public int altaDeUsuario (Usuario usuario){
int respuesta;
int salida = controladorBaseDeDatos.altaUsuario(usuario);
switch (salida){
case controladorBaseDeDatos .OK: respuesta = OK; break;
default: respesta = ERRORBD; break;
}
return respuesta;
}
Y todos contentos. Qué función más bonita.
Tras X tiempo, el gran ogro jefe del bosque llama al pobre programador con el comentario “como es que no se valida que el usuario ya este dado de alta!!!”. El pobre programador pone un control en el primer sitio que pilla:
public int altaDeUsuario (Usuario usuario){
int respuesta;
Usuario usuarioBuscado = controladorBaseDeDatos.buscarUsuario(usuario);
If (usuarioBuscado ¡= null){
int salida = controladorBaseDeDatos.altaUsuario(usuario);
switch (salida){
case controladorBaseDeDatos .OK: respuesta = OK; break;
default: respesta = ERRORBD; break;
}
}else
respuesta = 3;
return respuesta;
}
El pobre programador tiene que poner porque la función que llama a la linda función altaDeUsuario entiende la respuesta 3 como que no el usuario ya existe pero no esta tipificado :(.
Un buen dia, aparece una función no tan bonita pero que necesita el ultimo usuario que se de dio de alta. La función altaDeUsuario no tiene culpa de eso pero otro pobrecito programador hace la solución mas fácil:
public int altaDeUsuario (Usuario usuario){
int respuesta;
Usuario usuarioBuscado = controladorBaseDeDatos.buscarUsuario(usuario);
If (usuarioBuscado ¡= null){
int salida = controladorBaseDeDatos.altaUsuario(usuario);
switch (salida){
case controladorBaseDeDatos .OK: respuesta = OK;
if (usuarioGlobal == null )
usuarioGlobal = usuario;
break;
default: respesta = ERRORBD; break;
}
}else
respuesta = 3;
return respuesta;
}
Los días terribles se suceden y aparece nuevos requerimientos que se suceden al grito del ogro jefe “esto ya que tenemos que sacar version” o la ya tristemente famosa “no me puedo creer que no lo hicierais así en su día. Si es de lógica”. Estos requerimientos son:
- Solo tener en cuenta los usuario con fecha superior al 01/01/2011
public int altaDeUsuario (Usuario usuario, Date fechaValidezUsuario){
int respuesta;
if (fechaValidezUsuario > 01/01/2011)
Usuario usuarioBuscado = controladorBaseDeDatos.buscarUsuario(usuario);
If (usuarioBuscado ¡= null){
int salida = controladorBaseDeDatos.altaUsuario(usuario);
switch (salida){
case controladorBaseDeDatos .OK: respuesta = OK;
if (usuarioGlobal == null )
usuarioGlobal = usuario;
break;
default: respesta = ERRORBD; break;
}
}else
respuesta = 3;
}else
respuesta = 4;
return respuesta;
}
- El nuevo campo de Usuario tipoDeUsuario hay que rellenarlo comparando el campo A en una lista.
public int altaDeUsuario (Usuario usuario, Date fechaValidezUsuario){
int respuesta;
if (fechaValidezUsuario > 01/01/2011)
Usuario usuarioBuscado = controladorBaseDeDatos.buscarUsuario(usuario);
If (usuarioBuscado ¡= null){
int salida = controladorBaseDeDatos.altaUsuario(usuario);
switch (salida){
case controladorBaseDeDatos .OK: respuesta = OK;
if (usuarioGlobal == null )
usuarioGlobal = usuario;
for (int i = 0, i < tipos.longitud; i++){
if (usuario.getA() == tipos[i].getA())
controladorBaseDeDatos.modificaTipoUsuario(usuario,tipos[i]);
}
break;
default: respesta = ERRORBD; break;
}
}else
respuesta = 3;
}else
respuesta = 4;
return respuesta;
}
…
Y asi siguió el cuento. Al final la función acabo con mas de 500 lienas de código y sin que nadie se atreva a tocarla por miedo de fastidiar algo que funciona.
Te suena ¿Verdad?
Creo que la conclusión es HAY GASTAR TIEMPO EN PENSAR LAS COSAS ANTES.