Pregunta sobre estilo de programacion

Esto es correcto? me refiero a los returns... o mejor solo devolver uno al final? Y ya que estamos... alguna forma mas correcta de hacer esto?
int data_valida(int dia, int mes, int any){
if (dia<1 || dia>31|| mes<1 || mes>12|| any<1){
return 0;
}
else
{
switch(mes){
case 4:
case 6:
case 9:
case 11:
if (dia<=30){
return 1;
}
else{
return 0;
}
break;
case 2:
if (bisiesto(any)==1){
if (dia<=29){
return 1;
}
else{
return 0;
}
}
else{
if (dia<=28){
return 1;
}
else{
return 0;
}

}
break;
default:
return 1;
break;
}


}
}
Siempre puedes crear una variable a la que asignar el valor a devolver en cada caso y al final poner return variable;

Taiyou
Taiyou escribió:Siempre puedes crear una variable a la que asignar el valor a devolver en cada caso y al final poner return variable;

Taiyou

Si, eso ya lo se, lo que queria saber si esto es un poco chapuzas o es un buen estilo.... mas que nada para no crear malos habitos.
A mi, de momento, me parece mas eficiente y mas comprensible, pero entiendo que rompe la estructuracion del codigo.
A mi gusto, primero deberias indentar como dios manda.

Lo de los return ... cuando tengas cientos de lineas de codigo y returns por todas partes, podrias vovlerte loco para ver donde cojones se esta saliendo, por lo demas, es cuestion de gustos.
la identacion se ha ido al carajo al meterlo en la cita.

La duda que tengo es si existe algun tipo de norma no escrita o algo sobre este tema, o una recomendacion general o algo por el estilo.

En este ejemplo es un poco exagerado por la cantidad, pero, por ejemplo, en una que solo hubiesen dos, seria mala costumbre?
keo01 escribió:la identacion se ha ido al carajo al meterlo en la cita.


Para esas cosas utiliza code en vez de quote.

Por lo de los returns no opino, siempre meto tropecientosmil returns (la mayor parte de las veces por que no tengo mas remedio)

Salu2!
Como te han dicho, cuestión de gustos. Yo lo uso con cautela, algo así como los break. Úsalo si da mas limpieza a tu código. Por ejemplo yo suelo usarlo al principio de un método para comprobar una cierta condición y si se da salir. En caso contrario se ejecuta el método. Es el caso de tu primer if. Así evitas meter todo dentro de un else.

Ya sobre tu código en particular, puedes ahorrarte unos cuantos if's y else's devolviendo la condición, en plan:
case 2:
    return ( ( bisiesto(any) && dia<=29 ) || dia<=28 );
    break;

Aunque esto vaya también en función de gustos.
También puedes extraer las expresiones complejas a una función, como por ejemplo la anterior a dia_valido_de_febrero(dia) o la del primer if, como has hecho con el año bisiesto.

Un saludo.
Para que todo el mundo lo vea claro:

Esto sería tu función identada:

int data_valida(int dia, int mes, int any)
{
    if (dia < 1 || dia > 31 || mes < 1 || mes > 12 || any < 1) {
        return 0;
    } else {
        switch(mes) {
        case 4:
        case 6:
        case 9:
        case 11:
            if (dia <= 30) {
                return 1;
            } else {
                return 0;
            }
            break;
        case 2:
            if (bisiesto(any) == 1) {
                if (dia <= 29) {
                    return 1;
                } else {
                    return 0;
                }
            } else {
                if (dia <= 28) {
                    return 1;
                } else {
                    return 0;
                }
            }
            break;
        default:
            return 1;
            break;
        }
    }
}


Imagina qué ocurre con ese código si quitas el switch y no identas más de la cuenta:

int data_valida(int dia, int mes, int any)
{
    if (dia < 1 || dia > 31 || mes < 1 || mes > 12 || any < 1) {
        return 0;
    }

    if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
        return (dia <= 30);
    else if (mes == 2) {
        if (bisiesto(any) == 1) {
            return (dia <= 29);
        } else {
            return (dia <= 28);
        }
    }

    return 1;
}


Aún así puedes ir un poco más lejos:

int data_valida(int dia, int mes, int any)
{
    if (dia < 1 || dia > 31 || mes < 1 || mes > 12 || any < 1)
        return 0;

    if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
        return (dia <= 30);
    else if (mes == 2) {
        int dmax = bisiesto(any) ? 29 : 28;
        return (dia <= dmax);
    }

    return 1;
}


Sorprendentemente la nueva función es mucho más fácil de leer que la anterior :)

- ferdy
gracias ferdy... muy interesante, no concia lo de :

return (dia <= 30);

que supongo que devolvera 1 si se cumple y 0 si no. De todas formas no acabo de ver claro el mecanismo por lo que esto ocurre, asi que me lo apunto para buscarlo.

lo de :
int dmax = bisiesto(any) ? 29 : 28;

tengo un vago recuerdo de como funcionaba, pero creo que no lo voy a usar por que en clase todavia no lo han explicado y ya seria demasiada sobrada XD


De todas formas veo que queda mas elegante hacerlo con ifs que con el swich...


gracias a todos.
keo01 escribió: no concia lo de :

return (dia <= 30);

que supongo que devolvera 1 si se cumple y 0 si no. De todas formas no acabo de ver claro el mecanismo por lo que esto ocurre, asi que me lo apunto para buscarlo.

Devuelve el resultado de evaluar la expresión. En C, una expresión falsa da como resultado 0, y una verdadera da algo distinto de 0. (Por cierto, antes se me ha ido la olla con esto y las funciones :P)

lo de :
int dmax = bisiesto(any) ? 29 : 28;

tengo un vago recuerdo de como funcionaba, pero creo que no lo voy a usar por que en clase todavia no lo han explicado y ya seria demasiada sobrada XD

Es el equivalente a:
int dmax;
if (bisiesto(any)
    dmax = 29;
else
    dmax = 28;


De todas formas veo que queda mas elegante hacerlo con ifs que con el swich...

Yo personalmente, "nunca" uso switch's, no aportan nada sobre los if's, y están más limitados.

PD TALIBANERA (A Ferdy y a tí, que he visto que también lo has puesto antes): Aunque en castellano la palabra indentar no existe (el término correcto sería sangrado), la palabra en inglés es indent, así que el anglicismo también debería llevar n. Lo comento, no por tocar las pelotillas, sino porque lo de "identar" lo he veo usarse MUCHAS veces. ;)

Un saludo.
Pffff lo peor de todo es que tienes razón.

Sobre if vs. switch, hace tiempo enseñé que SI HAY DIFERENCIAS, y bastante interesantes a veces... en un mismo hilo de por aquí... alquien quería usar switch's con cadenas de caracteres... si lo encontrais, echadle un vistazo.

- ferdy
Ferdy escribió:Sobre if vs. switch, hace tiempo enseñé que SI HAY DIFERENCIAS, y bastante interesantes a veces... en un mismo hilo de por aquí... alquien quería usar switch's con cadenas de caracteres... si lo encontrais, echadle un vistazo.

No he dicho que no hubiese diferencias, sino que no aportaban nada y que estaban más limitados, precisamente a raiz de lo de las cadenas que comentabas en aquel hilo.

Un saludo.
11 respuestas