Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 534 — #572<br />
✐<br />
Apéndice B. Directrices de Programación<br />
21. T<strong>en</strong>ga cuidado con la FIXME: limitación de la her<strong>en</strong>cia. Los diseños más límpios<br />
añad<strong>en</strong> nuevas capacidades a las heredadas. Un diseño sospechoso elimina<br />
capacidades durante la her<strong>en</strong>cia sin añadir otras nuevas. Pero las reglas están<br />
hechas para romperse, y si está trabajando con una librería antigua, puede ser<br />
más efici<strong>en</strong>te restringir una clase exist<strong>en</strong>te <strong>en</strong> sus subclases que restructurar<br />
la jerarquía de modo que la nueva clase <strong>en</strong>caje donde debería, sobre la clase<br />
antigua.<br />
22. No exti<strong>en</strong>da funcionalidad fundam<strong>en</strong>tal por medio de subclases. Si un elem<strong>en</strong>to<br />
de la interfaz es esecial para una clase debería estár <strong>en</strong> la clase base, no<br />
añadido <strong>en</strong> una clase derivada. Si está añadi<strong>en</strong>do métodos por her<strong>en</strong>cia, quizá<br />
debería rep<strong>en</strong>sar el diseño.<br />
23. M<strong>en</strong>os es más. Empiece con una interfaz mínima a una clase, tan pequeña y<br />
simple como necesite para resolver el problema que está tratando, pero no int<strong>en</strong>te<br />
anticipar todas las formas <strong>en</strong> las que se podría usar la clase. Cuando use<br />
la clase, descubrirá formas de usarla y deberá expandir la interface. Sin embargo,<br />
una vez que que la clase esté si<strong>en</strong>do usada, no podrá reducir la interfaz sin<br />
causar problemas al código cli<strong>en</strong>te. Si necesita añadir más funciones, está bi<strong>en</strong>;<br />
eso no molesta, únicam<strong>en</strong>te obliga a recompilar. Pero incluso si los nuevos métodos<br />
reemplazan las funcionalidad de los antiguos, deje tranquila la interfaz<br />
exist<strong>en</strong>te (puede combinar la funcionalidad de la implem<strong>en</strong>tación subyac<strong>en</strong>te<br />
si lo desea. Si necesita expandir la interfaz de un método exist<strong>en</strong>te añadi<strong>en</strong>do<br />
más argum<strong>en</strong>tos, deje los argum<strong>en</strong>tos exist<strong>en</strong>tes <strong>en</strong> el ord<strong>en</strong> actual, y ponga valores<br />
por defecto a todos los argum<strong>en</strong>tos nuevos; de este modo no perturbará<br />
ninguna de las llamadas antiguas a esa función.<br />
24. Lea sus clases <strong>en</strong> voz alta para estar seguro que que su<strong>en</strong>an lógicas, refiri<strong>en</strong>dose<br />
a las relación <strong>en</strong>tre una clase base y una clase derivada com «es-un» y a los<br />
objetos miembro como «ti<strong>en</strong>e-un».<br />
25. Cuando t<strong>en</strong>ga que decidir <strong>en</strong>tre her<strong>en</strong>cia y composición, pregunte si necesita<br />
hacer upcast al tipo base. Si la respuesta es no, elija composición (objetos<br />
miembro) <strong>en</strong> lugar de her<strong>en</strong>cia. Esto puede eliminar la necesidad de her<strong>en</strong>cia<br />
múltiple. Si hereda, los usuarios p<strong>en</strong>sarán FIXME:they are supposed to upcast.<br />
26. A veces, se necesita heredar para acceder a miembros protegidos de una clase<br />
base. Esto puede conducir a una necesidad de her<strong>en</strong>cia múltiple. Si no necesita<br />
hacer upcast, primero derive una nueva clase para efectuar el acceso protegido.<br />
Entonces haga que la nueva clase sea un objeto miembro d<strong>en</strong>tro de cualquier<br />
clase que necesite usarla, el lugar de heredar.<br />
27. Típicam<strong>en</strong>te, una clase base se usará principalm<strong>en</strong>te para crear una interface<br />
a las clases que hered<strong>en</strong> de ella. De ese modo, cuando cree una clase base,<br />
haga que por defecto los métodos sean virtuales puros. El destructor puede<br />
ser también virtual puro (para forzar que los derivadas t<strong>en</strong>gan que anularlo<br />
explicitam<strong>en</strong>te), pero recuerde poner al destructor un cuerpo, porque todos<br />
destructores de la jerarquía se ejecutan siempre.<br />
28. Cuando pone un método virtual puro <strong>en</strong> una clase, haga que todos los métodos<br />
de la clase sean también viruales, y ponga un constructor virtual. Esta<br />
propuesta evita sorpresas <strong>en</strong> el comportami<strong>en</strong>to de la interfaz. Empiece a quitar<br />
la palabra virtual sólo cuando esté int<strong>en</strong>tando optimizar y su perfilador<br />
haya apuntado <strong>en</strong> esta dirección.<br />
534<br />
✐<br />
✐<br />
✐<br />
✐