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

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

Saved successfully!

Ooh no, something went wrong!