13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 539 — #577<br />

✐<br />

62. Use las constantes con corrección. Esto permite que el compilador advierta de<br />

errores que de otro modo serían sutiles y difíciles de <strong>en</strong>contrar. Esta práctica<br />

requiere de cierta disciplina y se debe usar de modo consist<strong>en</strong>te <strong>en</strong> todas sus<br />

clases, pero merece la p<strong>en</strong>a.<br />

63. Use la comprobación de tipos del compilador <strong>en</strong> su b<strong>en</strong>eficio. Haga todas las<br />

compilaciones con todos los avisos habilitados y arregle el código para eliminar<br />

todas las advert<strong>en</strong>cias. Escriba código que utilice los errores y advert<strong>en</strong>cias de<br />

compilación (por ejemplo, no use listas de argum<strong>en</strong>tos variables, que eliminar<br />

todas los comprobaciones de tipos). Use assert() para depurar, pero use<br />

excepciones para los errores de ejecución.<br />

64. Son preferibles los errores de compilación que los de ejecución. Int<strong>en</strong>te manejar<br />

un error tan cerca del punto donde ocurre como sea posible. Es mejor tratar el<br />

error <strong>en</strong> ese punto que elevar una excepción. Capture cualqueir excepción <strong>en</strong> el<br />

manejador más cercano que t<strong>en</strong>ga sufici<strong>en</strong>te información para tratarla. Haga lo<br />

que pueda con la excepción <strong>en</strong> el nivel actual; si no puede resolver el problema,<br />

relance la excepción. (Vea el Volum<strong>en</strong> 2 si necesita más detalles.)<br />

65. Si está usando las especificaciones de excepción (vea el Volum<strong>en</strong> 2 de este libro,<br />

disponible <strong>en</strong> www.BruceEckel.com, para apr<strong>en</strong>der sobre manejo de excepciones),<br />

instale su propia función unexpected() usando set_unexpected().<br />

Su unexpected() debería registrar el error y relanzar la excepción actual. De<br />

ese modo, si una función exist<strong>en</strong>te es reemplazada y eleva excepciones, dispondrá<br />

de un registro de FIXME:culprint y podrá modificar el código que la<br />

invoca para manejar la excepción.<br />

66. Cree un terminate() definida por el usuario (indicando un error del programador)<br />

para registrar el error que causó la excepción, después libere los<br />

recursos del sistema, y termine el programa.<br />

67. Si un destructor llama a cualquier función, esas funciones podrían elevar excepciones.<br />

Un destructor no puede elevar una excepción (eso podría ocasionar<br />

una llamada a terminate(), lo que indica un error de programación), así<br />

que cualquier destructor que llame a otras funciones debe capturar y tratar sus<br />

propias excepciones.<br />

68. No «decore» los nombres de sus atributos privados (poni<strong>en</strong>do guiones bajos,<br />

notación húngara, etc.), a m<strong>en</strong>os que t<strong>en</strong>ga un montón de valores globales ya<br />

exist<strong>en</strong>tes; <strong>en</strong> cualquier otro caso, deje que las clases y los espacios de nombres<br />

definan el ámbito de los nombres por usted.<br />

69. Ponga at<strong>en</strong>ción a la sobrecarga. Una función no debería ejecutar código condicionalm<strong>en</strong>te<br />

basandose <strong>en</strong> el valor de un argum<strong>en</strong>to, sea por defecto o no. En<br />

su lugar, debería crear dos o más métodos sobrecargados.<br />

70. Oculte sus punteros d<strong>en</strong>tro de clases cont<strong>en</strong>edor. Dejelos fuera sólo cuando<br />

vaya a realizar operaciones con ellos. Los punteros ha sido siempre la mayor<br />

fu<strong>en</strong>te de errores. Cuando use new, int<strong>en</strong>te colocar el puntero resultante <strong>en</strong> un<br />

cont<strong>en</strong>edor. Es preferible que un cont<strong>en</strong>edor «posea» sus punteros y sea responsable<br />

de la limpieza. Incluso mejor, <strong>en</strong>vuelva un puntero d<strong>en</strong>tro de una<br />

clase; si aún así quiere que parezca un puntero, sobrecargue operator-> y<br />

operator*. Si necesita t<strong>en</strong>er un puntero normal, inicialicelo siempre, preferiblem<strong>en</strong>te<br />

con la dirección de un objeto, o cero si es necesario. Asignele un cero<br />

cuando le libere para evitar liberaciones múltiples.<br />

539<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!