🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #16285

[POLEMICA CON GOTO] (Era-->Re: Saltos en bash)

#16285
From: Ignacio Arenaza
Date: Tue, 02 May 2000 00:00
95 lines
3880 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "batsman" == batsman  <batsman@simpsons.for.ever> writes:

    batsman> La �nica vez que he visto un goto en un programa en C fue
    batsman> en el c�digo de megahal, un simulador de conversaci�n.

Ya te voy a decir donde puedes ver unos cuantos juntos ;-)

    batsman> Eso s�, s� que a veces es necesario por necesidades de
    batsman> velocidad, etc... pero s�lo se justifica si el programa
    batsman> es por ejemplo el n�cleo. Si no, no tiene excusa y merece
    batsman> la reprobaci�n �nanime.

Tan malo es usar el goto a diestro y siniestro como prohibirlo y
vilipendiarlo. Lo digo yo y gente tan seria y prestigiosa como
Kernigham y Rithchie (entre otros).

�Que es mas claro y facil de entender _y mantener_ de los dos ejemplos
siguientes? Supon que los pasos paso1, paso2, paso3, etc solo se
pueden ejecutar si el paso anterior se ha llevado a cabo de forma
correcta y podemos obtener los recursos necesarios para este paso. En
caso contrario hay que deshacer todo lo hecho y liberar los recursos,
vamos, una especie de sistema transaccional, o se hace todo, o no se
hace nada.

EJEMPLO_1: (la forma "oficial", si lo se, se puede resumir, pero la
            "legibilidad del codigo" pierde)

        if ( reservar_cosas_para_1() ) {
             hacer_cosas_de_1();
             if ( reservar_cosas_para_2() ) {
                  hacer_cosas_de_2();
                  if ( reservar_cosas_para_3() ) {
                       hacer_cosas_de_3();
                       if ( reservar_cosas_para_4() ) {
                            hacer_cosas_de_4();
                            liberar_cosas_de_4();
                       }
                       liberar_cosas_de_3();
                  }
                  liberar_cosas_de_2();
             }
             liberar_cosas_de_1();
        }

EJEMPLO_2: (la forma "pagana", pero mas "legible" y "mantenible" en mi
            opinion)

        if ( !reservar_cosas_para_1() ) goto liberar_1;
        hacer_cosas_de_1();

        if ( !reservar_cosas_para_2() ) goto liberar_2;
        hacer_cosas_de_2();

        if ( reservar_cosas_para_3() ) goto liberar_3;
        hacer_cosas_de_3();

        if ( reservar_cosas_para_4() ) goto libear_4;
        hacer_cosas_de_4();

liberar_4:
        liberar_cosas_de_4();

liberar_3:
        liberar_cosas_de_3();

liberar_2:
        liberar_cosas_de_2();

liberar_1:
        liberar_cosas_de_1();

Creo que la segunda solucion se ajusta mas a la forma de pensar
habitual a la hora de hacer las cosas: si tienes todo lo que te hace
falta hasta ahora, sigues. Sino, limpias todo lo que has usado de una
vez.

Saludos. I�aki.

- -- 
  Sabias que Benjamin Albi�ana tiene htdig en marcha y va de cine?

  Get PGP/GPG Keys at http://personales.jet.es/inaki.arenaza/pgpkey.html
  A proud member of GULA - http://gula.jet.es/

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.0 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.4 and Gnu Privacy Guard

iD8DBQE5Dzc5ZXLnGT1HLgcRAt6KAJ4hyhu8ZlIzleue1C2Wt9vLgeTbjwCfWwre
cA3g0lUoBggU4XSodkuibGM=
=xdF5
-----END PGP SIGNATURE-----
Technical Details
Message-ID: <871z3k4slh.fsf_-_@eb2ebu.ampr.org>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <slrn8gtnu0.pc.scandisk@localhost.localdomain> <aodne8.je1.ln@simpsons4ever>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,e073e16083571582
X-Google-Attributes: gidf86c8,public
From: Ignacio Arenaza <inaki.arenaza@jet.es>
Subject: [POLEMICA CON GOTO] (Era-->Re: Saltos en bash)
Date: 2000/05/02
Message-ID: <871z3k4slh.fsf_-_@eb2ebu.ampr.org>
X-Deja-AN: 618888382
Content-Transfer-Encoding: 8bit
References: <slrn8gtnu0.pc.scandisk@localhost.localdomain> <aodne8.je1.ln@simpsons4ever>
Organization: Servidor NNTP de eb2ebu.ampr.org
Content-Type: text/plain; charset=iso-8859-1
User-Agent: Gnus/5.0803 (Gnus v5.8.3) Emacs/20.3
Mime-Version: 1.0
Newsgroups: es.comp.os.linux.programacion