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 535 — #573<br />
✐<br />
29. Use atributos para variaciones <strong>en</strong> los valores y métodos virtuales para variaciones<br />
<strong>en</strong> el comportami<strong>en</strong>to. Es decir, si <strong>en</strong>cu<strong>en</strong>tra una clase que usa atributos<br />
estáticos con métodos que cambian de comportami<strong>en</strong>to basandose <strong>en</strong> esos<br />
atributos, probablem<strong>en</strong>te deberia rediseñarla para expresar las difer<strong>en</strong>cias de<br />
comportami<strong>en</strong>to con subclases y métodos virtuales anulados.<br />
30. If debe hacer algo no portable, cree una abstracción para el servicio y póngalo<br />
<strong>en</strong> una clase. Este nivel extra de indirección facilita la portabilidad mejor que<br />
si se distribuyera por todo el programa.<br />
31. Evite la her<strong>en</strong>cia múltiple. Estará a salvo de malas situaciones, especialm<strong>en</strong>te<br />
cuando repare las interfaces de clases que están fuera de su control (vea el Volum<strong>en</strong><br />
2). Debería ser un programador experim<strong>en</strong>tado antes de poder diseñar<br />
con her<strong>en</strong>cia múltiple.<br />
32. No use her<strong>en</strong>cia privada. Aunque, está <strong>en</strong> el l<strong>en</strong>guaje y parece que ti<strong>en</strong>e una<br />
funcionalidad ocasional, ello implica ambigüedades importantes cuando se<br />
combina con comprobación dinámica de tipo. Cree un objeto miembro privado<br />
<strong>en</strong> lugar de usar her<strong>en</strong>cia privada.<br />
33. Si dos clases están asociadas <strong>en</strong>tre si de algún modo (como los cont<strong>en</strong>edores<br />
y los iteradores). int<strong>en</strong>te hacer que una de ellas sea una clase amiga anidada<br />
de la otro, tal como la Librería Estándar <strong>C++</strong> hace con los interadores d<strong>en</strong>tro<br />
de los cont<strong>en</strong>edores (En la última parte del Capítulo 16 se muestran ejemplos<br />
de esto). No solo pone de manifiesto la asociación <strong>en</strong>tre las clases, también<br />
permite que el nombre de la clase se pueda reutilizar anidándola <strong>en</strong> otra clase.<br />
La Librería Estándar <strong>C++</strong> lo hace defini<strong>en</strong>do un clase iterador anidada d<strong>en</strong>tro<br />
de cada clase cont<strong>en</strong>edor, de ese modo los cont<strong>en</strong>edores ti<strong>en</strong><strong>en</strong> una interface<br />
común. La otra razón por la que querrá anidar una clase es como parte de<br />
la implem<strong>en</strong>tación privada. En ese caso, el anidami<strong>en</strong>to es b<strong>en</strong>eficioso para<br />
ocultar la implem<strong>en</strong>tación más por la asociación de clases y la prev<strong>en</strong>ción de<br />
la contaminación del espacio de nombres citada arriba.<br />
34. La sobrecarga de operadores <strong>en</strong> sólo «azucar sintáctico:» una manera difer<strong>en</strong>te<br />
de hacer una llamada a función. Is sobrecarga un operador no está haci<strong>en</strong>do<br />
que la interfaz de la clase sea más clara o fácil de usar, no lo haga. Cree sólo un<br />
operador de conversión automática de tipo. En g<strong>en</strong>eral, seguir las directrices y<br />
estilo indicados <strong>en</strong> el Capítulo 12 cuando sobrecargue operadores.<br />
35. No sea una víctima de la optimización prematura. Ese camino lleva a la locura.<br />
In particular, no se preocupe de escribir (o evitar) funciones inline, hacer algunas<br />
funciones no virtuales, afinar el código para hacerlo más efici<strong>en</strong>te cuando<br />
esté <strong>en</strong> las primer fase de contrucción del sistema. El objetivo principal debería<br />
ser probar el diseño, a m<strong>en</strong>os que el propio diseño requiera cierta efici<strong>en</strong>cia.<br />
36. Normalm<strong>en</strong>te, no deje que el compilador cree los constructores, destructores<br />
o el operator= por usted. Los diseñadores de clases siempre deberían decir<br />
qué debe hacer la clase exactam<strong>en</strong>te y mant<strong>en</strong>erla <strong>en</strong>teram<strong>en</strong>te bajo su control.<br />
Si no quiere costructor de copia u operator=, declarelos como privados.<br />
Recuerde que si crea algún constructor, el compilador un sintetizará un constructor<br />
por defecto.<br />
37. Si su clase conti<strong>en</strong>e punteros, debe crear el constructor de copia, el operator=<br />
y el destructor de la clase para que funcione adecuadam<strong>en</strong>te.<br />
38. Cuando escriba un constructor de copia para una clase derivada, recuerde llamar<br />
explícitam<strong>en</strong>te al constructor de copia de la clase base (también cuando se<br />
535<br />
✐<br />
✐<br />
✐<br />
✐