Oracle: ejemplos poco ejemplares

En esta página (http://docs.oracle.com/javadb/10.6.1.0/adminguide/tadminconfigverifyingstartup.html) Oracle muestra cómo saber si un servidor Derby, una pura copia de la base de datos de Apache a la que únicamente le han cambiado el nombre. Pero veamos qué ejemplo utilizan.

Es este:


private static boolean isServerStarted(NetworkServerControl server, int ntries) {

    for (int i = 1; i <= ntries; i ++) {

        try {
            Thread.sleep(500);
            server.ping();
            return true;
        } catch (Exception e) {
            if (i == ntries) {
                return false;
            }
        }
    }
    return false;
}
El ejemplo quizás explique perfectamente el asunto de Derby, pero es muy poco ejemplar en dos puntos:
1.- A la función se entra por un sitio y sale por dos. 
Las funciones tipo Hidra de Lerna son una fuente de problemas cuando hay que modificarlas. Con frecuencia se opta por esa solución por ser la más rápida, pero a la vez es la que menos asegura que todo sigue funcionando.
Es fácil poner un return en cualquier parte en función de ciertas condiciones, pero el problema aparece si alguien programó algo más después del recien insertado return.
2.- Bucles mal compuestos.
La función tarda un mínimo de 500 milisegundos (medio segundo), cuando debería y puede tardar lo mínimo que tarde la ejecución del ping al servidor Derby.

Arreglando estos dos problemas nos quedaría algo así, por ejemplo:
private static boolean isServerStarted(NetworkServerControl server, int ntries) {
    boolean isStarted = false;
    for (int i = 1; i <= ntries && !isStarted; i ++) {
        try {
              server.ping();
              isStarted = true;
        } catch (Exception e) {
              Thread.sleep(500);
        }
    }
    return isStarted;
}
 Mal ejemplo el que da Oracle.

No hay comentarios :

Publicar un comentario