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

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

Saved successfully!

Ooh no, something went wrong!