{"id":842,"date":"2008-05-19T00:36:00","date_gmt":"2008-05-19T00:36:00","guid":{"rendered":"http:\/\/karstieltopia.com\/2008\/05\/19\/la-palabra-maldita\/"},"modified":"2008-05-19T00:36:00","modified_gmt":"2008-05-19T00:36:00","slug":"la-palabra-maldita","status":"publish","type":"post","link":"http:\/\/karstieltopia.com\/programacion\/la-palabra-maldita\/","title":{"rendered":"La palabra maldita…"},"content":{"rendered":"
Y es que hay que decir que en el mundo de la programaci\u00f3n, hay una palabra maldita que se desancoseja usar pase lo que pase; sab\u00e9is cu\u00e1l es, \u00bfverdad? S\u00ed… el tan temible y odiado GOTO<\/p>\n
Ciertamente lo de poder saltar a cualquier parte del c\u00f3digo de una manera directa es una cosa la mar de peliaguado, pero voy a tener que decir que \u00faltimamente le he visto su utilidad… sobre todo si os toca picar en C y no ten\u00e9is excepciones ni nada parecido.<\/p>\n
Imaginar un mundo sin excepciones y en el cu\u00e1l ten\u00e9is funciones la mar de majas que tienen muchos if’s internos porque est\u00e1n comprobando un mont\u00f3n de posibilidades que pueden fallar y, por cada uno de estos fallos, no se puede continuar con el flujo de la funci\u00f3n y hay que poner un mensaje de error y salir.<\/p>\n
Si no fuera mucho, pues s\u00ed, se pueden anidar los if’s y ser feliz… Pero si hablamos de 20, por ejemplo, nos quedamos tabulando como posesos todo el d\u00eda… As\u00ed que ah\u00ed tenemos un problema porque si hacemos \u00e9sto, tendremos un c\u00f3digo ilegible y totalmente dependiente de la barra de scroll.<\/p>\n
Me podr\u00edais decir que una buena opci\u00f3n ser\u00eda la de ir poniendo return en cada if inv\u00e1lido y as\u00ed romper el flujo de la funci\u00f3n y volver a la funci\u00f3n llamante. Pues s\u00ed, se puede hacer, pero por un lado tenemos que poner m\u00faltiples puntos de salida de una funci\u00f3n no es nada recomendable (y menos si es una funci\u00f3n grande en tama\u00f1o) y por otra parte imaginaos que tengamos que liberar memoria o alg\u00fan \u00faltimo tipo de operaci\u00f3n (vamos, lo que ir\u00eda en un catch de toda la vida).<\/p>\n
Pues en este punto, la mejor opci\u00f3n es tirar de goto… y tener algo como \u00e9sto:<\/p>\n
<br>void<br>GotoRevenge (void)<br>{<br> if (!cond1l) {<br> nRet = -1;<br> goto exit;<br> }<br> xxxxxxxxxxxxxxxxxxxxxx<br><br> if (!cond2) {<br> nRet = -2;<br> goto exit;<br> }<br> xxxxxxxxxxxxxxxxxxxxxx<br><br> if (!cond3) {<br> nRet = -3;<br> goto exit;<br> }<br> xxxxxxxxxxxxxxxxxxxxxx<br><br> if (!cond4) {<br> nRet = -4;<br> goto exit;<br> }<br> xxxxxxxxxxxxxxxxxxxxxx<br><br> exit:<br> LiberarMemoria();<br> \/* Y todo tipo de operaciones de salida *\/<br> return nRet;<br>}<br><\/pre>\nSi hubiera ido poniendo en cada else la liberaci\u00f3n de memoria (por ejemplo), hubi\u00e9ramos tenido una funci\u00f3n totalmente horrible, tanto en tama\u00f1o (repitiendo c\u00f3digo sin parar) y tabulado al m\u00e1ximo.<\/p>\n
\u00a1No marginemos al goto! :P<\/p>\n","protected":false},"excerpt":{"rendered":"
Y es que hay que decir que en el mundo de la programaci\u00f3n, hay una palabra maldita que se desancoseja usar pase lo que pase; sab\u00e9is cu\u00e1l es, \u00bfverdad? S\u00ed… el tan temible y odiado GOTO Ciertamente lo de poder saltar a cualquier parte del c\u00f3digo de una manera directa es una cosa la mar […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[21],"tags":[603],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"yoast_head":"\n
La palabra maldita... - Karstieltopia<\/title>\n\n\n\n\n\n\n\n\n\n\n\n\n