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 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 />

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

Saved successfully!

Ooh no, something went wrong!