Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 183 — #221<br />
✐<br />
5.6. Manejo de clases<br />
5.6.2. Reducir la recompilación<br />
Su <strong>en</strong>torno de programación provocará una recompilación de un fichero si este<br />
se modifica, o si se modifica otro fichero del que dep<strong>en</strong>de, es decir, un archivo de<br />
cabecera que se haya incluido. Esto significa que cada vez que se haga un cambio <strong>en</strong><br />
una clase, ya sea a la interfaz pública o a las declaraciones de los miembros privados,<br />
se provocará una recompilación de todo lo que incluya ese archivo de cabecera. Este<br />
efecto se conoce usualm<strong>en</strong>te como el problema de la clase-base frágil. Para un proyecto<br />
grande <strong>en</strong> sus comi<strong>en</strong>zos esto puede ser un gran problema pues la implem<strong>en</strong>tación<br />
suele cambiar a m<strong>en</strong>udo; si el proyecto es muy grande, el tiempo de las compilaciones<br />
puede llegar a ser un gran problema.<br />
La técnica para resolver esto se llama a veces clases manejador o el «gato de Chesire»<br />
2 - toda la información sobre la implem<strong>en</strong>tación desaparece excepto por un<br />
puntero, la "sonrisa". El puntero apunta a una estructura cuya definición se <strong>en</strong>cu<strong>en</strong>tra<br />
<strong>en</strong> el fichero de implem<strong>en</strong>tación junto con todas las definiciones de las funciones<br />
miembro. Así, siempre que la interfaz no se cambie, el archivo de cabecera permanece<br />
inalterado. La implem<strong>en</strong>tación puede cambiar a su gusto, y sólo el fichero de<br />
implem<strong>en</strong>tación deberá ser recompilado y re<strong>en</strong>lazado con el proyecto.<br />
Aquí hay un ejemplo que demuestra como usar esta técnica. El archivo de cabecera<br />
conti<strong>en</strong>e solo la interfaz publica y un puntero de una clase especificada de forma<br />
incompleta:<br />
//: C05:Handle.h<br />
// Handle classes<br />
#ifndef HANDLE_H<br />
#define HANDLE_H<br />
class Handle {<br />
struct Cheshire; // Class declaration only<br />
Cheshire* smile;<br />
public:<br />
void initialize();<br />
void cleanup();<br />
int read();<br />
void change(int);<br />
};<br />
#<strong>en</strong>dif // HANDLE_H ///:~<br />
Esto es todo lo que el programador cli<strong>en</strong>te puede ver. La linea<br />
struct Cheshire;<br />
es una especificación de tipo incompleta o una declaración de clase (una definición de<br />
clase debe incluir el cuerpo de la clase). Le dice al compilador que Chesire es el nombre<br />
de una estructura, pero no detalles sobre ella. Esta es información sufici<strong>en</strong>te para<br />
crear un puntero a la estructura; no puede crear un objeto hasta que el cuerpo de la<br />
estructura quede definido. En esta técnica, el cuerpo de la estructura está escondido<br />
<strong>en</strong> el fichero de implem<strong>en</strong>tación:<br />
2 Este nombre se le atribuye a John Carolan, uno de los pioneros del <strong>C++</strong>, y por supuesto, Lewis<br />
Carroll. Esta técnica se puede ver también como una forma del tipo de diseño «pu<strong>en</strong>te», descrito <strong>en</strong> el<br />
segundo volum<strong>en</strong>.<br />
183<br />
✐<br />
✐<br />
✐<br />
✐