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 482 — #520<br />
✐<br />
Capítulo 16. Introducción a las Plantillas<br />
tado aquí como contraste; la aproximación de Smalltalk, que afectó de forma significativa<br />
a <strong>C++</strong>, y la aproximación de <strong>C++</strong>: los templates.<br />
La solución de C. Por supuesto hay que escapar de la aproximación de C porque<br />
es desord<strong>en</strong>ada y provoca errores, al mismo tiempo que no es nada elegante. En esta<br />
aproximación, se copia el código de una Stack y se hac<strong>en</strong> modificaciones a mano,<br />
introduci<strong>en</strong>do nuevos errores <strong>en</strong> el proceso. Esta no es una técnica muy productiva.<br />
La solución de Smalltalk. Smalltalk (y Java sigui<strong>en</strong>do su ejemplo) optó por una<br />
solución simple y directa: Se quiere reutilizar código, pues utilicese la her<strong>en</strong>cia. Para<br />
implem<strong>en</strong>tarlo, cada clase cont<strong>en</strong>edora maneja elem<strong>en</strong>tos de una clase base g<strong>en</strong>érica<br />
llamada Object (similar al ejemplo del final del capítulo 15). Pero debido a que la<br />
librería de Smalltalk es fundam<strong>en</strong>tal, no se puede crear una clase desde la nada. En<br />
su lugar, siempre hay que heredar de una clase exist<strong>en</strong>te. Se <strong>en</strong>cu<strong>en</strong>tra una clase lo<br />
más cercana posible a lo que se desea, se hereda de ella, y se hac<strong>en</strong> un par de cambios.<br />
Obviam<strong>en</strong>te, esto es un b<strong>en</strong>eficio porque minimiza el trabajo (y explica porque se<br />
pierde un montón de tiempo apr<strong>en</strong>di<strong>en</strong>do la librería antes de ser un programador<br />
efectivo <strong>en</strong> Smalltalk).<br />
Pero también significa que todas las clases de Smalltalk acaban si<strong>en</strong>do parte de<br />
un único árbol de her<strong>en</strong>cia. Hay que heredar de una rama de este árbol cuando se<br />
está creando una nueva clase. La mayoría del árbol ya esta allí (es la librería de clases<br />
de Smalltalk), y la raiz del árbol es una clase llamada Object - la misma clase que<br />
los cont<strong>en</strong>edores de Smalltalk manejan.<br />
Es un truco ing<strong>en</strong>ioso porque significa que cada clase <strong>en</strong> la jerarquía de her<strong>en</strong>cia<br />
de Smalltalk (y Java 1 ) se deriva de Object, por lo que cualquier clase puede ser<br />
almac<strong>en</strong>ada <strong>en</strong> cualquier cont<strong>en</strong>edor (incluy<strong>en</strong>do a los propios cont<strong>en</strong>edores). Este<br />
tipo de jerarquía de árbol única basada <strong>en</strong> un tipo g<strong>en</strong>érico fundam<strong>en</strong>tal (a m<strong>en</strong>udo<br />
llamado Object, como también es el caso <strong>en</strong> Java) es conocido como "jerarquía<br />
basada <strong>en</strong> objectos". Se puede haber oido este témino y asumido que es un nuevo<br />
concepto fundam<strong>en</strong>tal de la POO, como el polimorfismo. Sin embargo, simplem<strong>en</strong>te<br />
se refiere a la raíz de la jerarquía como Object (o algún témino similar) y a cont<strong>en</strong>edores<br />
que almac<strong>en</strong>an Objects.<br />
Debido a que la librería de clases de Smalltalk t<strong>en</strong>ía mucha más experi<strong>en</strong>cia e<br />
historia detrás de la que t<strong>en</strong>ía <strong>C++</strong>, y porque los compiladores de <strong>C++</strong> originales<br />
no t<strong>en</strong>ían librerías de clases cont<strong>en</strong>edoras, parecía una bu<strong>en</strong>a idea duplicar la librería<br />
de Smalltalk <strong>en</strong> <strong>C++</strong>. Esto se hizo como experim<strong>en</strong>to con una de las primeras<br />
implem<strong>en</strong>taciónes de <strong>C++</strong> 2 , y como repres<strong>en</strong>taba un significativo ahorro de código<br />
mucha g<strong>en</strong>te empezo a usarlo. En el proceso de int<strong>en</strong>tar usar las clases cont<strong>en</strong>edoras,<br />
descubrieron un problema.<br />
El problema es que <strong>en</strong> Smalltalk (y <strong>en</strong> la mayoría de los l<strong>en</strong>guajes de POO que yo<br />
conozco), todas las clases derivan automáticam<strong>en</strong>te de la jerarquía única, pero esto<br />
no es cierto <strong>en</strong> <strong>C++</strong>. Se puede t<strong>en</strong>er una magnifica jerarquía basada <strong>en</strong> objetos con<br />
sus clases cont<strong>en</strong>edoras, pero <strong>en</strong>tonces se compra un conjunto de clases de figuras,<br />
o de aviones de otro v<strong>en</strong>dedor que no usa esa jerarquía. (Esto se debe a que usar<br />
una jerarquía supone sobrecarga, rechazada por los programadores de C). ¿Cómo<br />
se inserta un árbol de clases indep<strong>en</strong>di<strong>en</strong>tes <strong>en</strong> nuestra jerarquía El problema se<br />
parece a lo sigui<strong>en</strong>te:<br />
1 Con la excepción, <strong>en</strong> Java, de los tipos de datos primitivos, que se hicieron no Objects por efici<strong>en</strong>cia.<br />
2 La librería OOPS, por Keith Gorl<strong>en</strong>, mi<strong>en</strong>tras estaba <strong>en</strong> el NIH.<br />
482<br />
✐<br />
✐<br />
✐<br />
✐