151 votos

¿Por qué es la STL de C++ es tan fuertemente basados en plantillas? (y no * interfaces *)

Quiero decir, aparte de su obligando a nombre de (la Biblioteca de plantillas Estándar)...

C++ inicialmente la intención de presentar la programación orientada a objetos conceptos en C. es: se podría decir que lo que una entidad específica que podía y no podía hacer (independientemente de cómo lo hace) basado en su clase y jerarquía de clases. Algunas composiciones de habilidades son más difíciles de describir de esta manera debido a la problemática de la herencia múltiple, y el hecho de que C++ es compatible con el concepto de interfaces de una forma un tanto torpe manera (en comparación con java, etc), pero que está ahí (y que podría ser mejorado).

Y, a continuación, plantillas, entró en juego, junto con la STL. La STL parecía llevar a los clásicos conceptos de la programación orientada a objetos y tirar por el desagüe, con el uso de plantillas en su lugar.

Debe haber una distinción entre los casos cuando las plantillas se utilizan para generalizar los tipos en los que los tipos themeselves son irrelevantes para el funcionamiento de la plantilla (contenedores, por ejemplo). Tener un vector que tiene perfecto sentido.

Sin embargo, en muchos otros casos (iteradores y algoritmos), la plantilla de los tipos que se supone seguir un "concepto" (Iterador de Entrada, Adelante Iterador, etc...) donde los detalles reales del concepto se define enteramente por la aplicación de la plantilla de función/clase, y no por la clase del tipo de las utilizadas con la plantilla, que es una especie de anti-y el uso de la programación orientada a objetos.

Por ejemplo, puede decirle a la función:

void MyFunc(ForwardIterator<...> *I);

Actualización: Como no estaba claro en la pregunta original, ForwardIterator está bien ser de plantilla en sí para permitir que cualquier ForwardIterator tipo. Lo contrario es tener ForwardIterator como un concepto.

espera un Avance del Iterador sólo por su definición, donde había necesidad, ya sea para buscar en la aplicación o en la documentación:

template <typename Type> void MyFunc(Type *I);

Dos reclamos que puedo hacer en favor de la utilización de plantillas: código compilado puede ser más eficiente, por adaptar la compilación de la plantilla para cada tipo de uso, en lugar de utilizar vtables. Y el hecho de que las plantillas pueden ser utilizados con tipos nativos.

Sin embargo, estoy en busca de una más profunda razón por la que el abandono de clásicos de la programación orientada a objetos en favor de plantillas para la STL? (Suponiendo que has leído hasta ahora :P)

492voto

jalf Puntos 142628

La respuesta corta es", debido a que C++ se ha movido". Sí, a finales de los años 70, Stroustrup la intención de crear un mejorado sistema de C con la programación orientada a objetos capacidades, pero que es de hace mucho tiempo. Por el tiempo en que el lenguaje se ha normalizado en 1998, dejó de ser un lenguaje POO. Fue un multi-paradigma de la lengua. Ciertamente había algo de soporte para la programación orientada a objetos, pero también tenía una turing-completo idioma de la plantilla superpuesta, que permite en tiempo de compilación metaprogramación, y la gente había descubierto la programación genérica. De repente, la programación orientada a objetos no parecía importante. No cuando podemos escribir la más simple, más concisa y más eficiente de código mediante el uso de técnicas disponibles a través de plantillas y la programación genérica.

La programación orientada a objetos no es el santo grial. Es una linda idea, y era una mejora sobre lenguajes de procedimiento en los años 70's cuando fue inventado. Pero sinceramente no todo está agrietado hasta ser. En muchos casos es torpe y detallado y que en realidad no promover código reutilizable o de la modularidad.

Es por eso que el C++ de la comunidad es hoy mucho más interesado en la programación genérica, y por qué todo el mundo está finalmente empezando a darse cuenta de que la programación funcional es muy inteligente, también. La programación orientada a objetos en sus propias simplemente no es un buen espectáculo.

Intenta dibujar un gráfico de dependencia de un hipotético "programación orientada a objetos-ified" STL. ¿Cuántas clases tendría que saber acerca de cada uno de los otros? Habría un montón de dependencias. Usted sería capaz de incluir sólo los vector de encabezado, sin llegar iterator o, incluso, iostream que sacó en? La STL hace esto fácil. Un vector sabe sobre el iterador tipo se define, y eso es todo. Los algoritmos de la STL saber nada. Ni siquiera es necesario incluir un iterador de cabecera, a pesar de que todos aceptan los iteradores como parámetros. Lo que es más modular, entonces?

La STL pueden no seguir las normas de la programación orientada a objetos como Java define, pero no alcanzar los objetivos de la programación orientada a objetos? No es lograr la reutilización, bajo acoplamiento, la modularidad y la encapsulación?

Y no se lograr estos objetivos mejor que un OOP-ified versión?

En cuanto a por qué la STL fue adoptada por el idioma, varias cosas sucedió que llevó a la STL.

En primer lugar, las plantillas se han añadido a C++. Se han agregado por la misma razón que los medicamentos genéricos se han añadido a .NET. Me pareció una buena idea para ser capaz de escribir cosas como "contenedores de un tipo T", sin tirar tipo de seguridad. Por supuesto, la aplicación se establecieron en la era bastante más complejo y poderoso.

Entonces, la gente descubrió que el mecanismo de plantilla que habían añadido era aún más poderoso de lo que esperaba. Y alguien comenzó a experimentar con el uso de plantillas para escribir un más genérico de la biblioteca. Uno inspirado en la programación funcional, y uno que usa todas las nuevas capacidades de C++.

Él presentó para el lenguaje C++ comité, que se tomó un tiempo para acostumbrarse a ella, porque parecía tan extraño y diferente, pero al final se dio cuenta de que funcionaba mejor de la tradicional programación orientada a objetos equivalentes que tendría que incluir lo contrario. Por lo que hizo un par de ajustes a la misma, y adoptado en la biblioteca estándar.

No era una opción ideológica, no fue una elección política de "qué queremos ser la programación orientada a objetos o no", pero de una manera muy pragmática. Se evaluó la biblioteca, y vio que funcionaba muy bien.

En cualquier caso, tanto de las razones por las que usted menciona para favorecer el STL son absolutamente esenciales.

El estándar de C++ de la biblioteca ha de ser eficiente. Si es menos eficiente que, por ejemplo, el equivalente enrollados a mano el código de C, entonces la gente no la usaría. Que la disminución de la productividad, aumentar la probabilidad de errores, y en general sólo ser una mala idea.

Y la STL tiene para trabajar con los tipos primitivos, debido a que los tipos primitivos son todo lo que tienes en C, y son una parte importante de los dos idiomas. Si la STL no trabajan con conjuntos nativos, sería inútil.

Su pregunta tiene una fuerte presunción de que la programación orientada a objetos es "mejor". Tengo la curiosidad de saber por qué. Usted se pregunta por qué "abandonado clásico de la programación orientada a objetos". Me pregunto por qué ellos deberían haber quedado con ella. Que ventajas tendría?

75voto

Tyler McHenry Puntos 35551

La mayoría respuesta directa a lo que creo que está pidiendo a/a quejarse de esto es: La suposición de que el C++ es un lenguaje de programación orientada a objetos es una suposición falsa.

C++ es un multi-paradigma de la lengua. Puede ser programado utilizando los principios de la programación orientada a objetos, que puede ser programado en el procedimiento, se puede programar de forma genérica (plantillas), y con C++11 (anteriormente conocido como C++0x) algunas cosas pueden incluso ser programado funcionalmente.

Los diseñadores de C++ de ver esto como una ventaja, así que diría que limitar a C++ como un acto puramente lenguaje OOP cuando programación genérica resuelve mejor el problema y, así, más genéricamente, sería un paso atrás.

57voto

Max Lybbert Puntos 11822

Mi entendimiento es que Stroustrup originalmente preferido una "programación orientada a objetos-denominado" diseño de contenedores, y de hecho no veo otra manera de hacerlo. Alex Stepanov es el responsable de la STL, y sus objetivos no incluyen "hacer que sea orientado a objetos":

Ese es el punto fundamental: los algoritmos definidos en estructuras algebraicas. Me tomó un par de años para darse cuenta de que tienen que ampliar la noción de estructura mediante la adición de los requisitos de complejidad para regular los axiomas. ... Creo que el iterador teorías son como central en el Equipo de la Ciencia como teorías de los anillos o de los espacios de Banach son fundamentales a las Matemáticas. Cada vez que miraba a un algoritmo que me gustaría tratar de encontrar una estructura en la que se define. Así que lo que yo quería hacer era describen los algoritmos de forma genérica. Eso es lo que me gusta hacer. Puedo pasar un mes de trabajo en un conocido algoritmo tratando de encontrar su representación genérica. ...

STL, al menos para mí, representa la única forma de programación es posible. Es, de hecho, muy diferente de la programación en C++ como la que se presentó y aún se presenta en la mayoría de los libros de texto. Pero, usted ve, yo no estaba tratando de programa en C++, yo estaba tratando de encontrar la forma correcta de tratar con el software. ...

Yo tenía muchas salidas en falso. Por ejemplo, yo pasé años tratando de encontrar algún uso de la herencia y virtuals, antes de comprender por qué ese mecanismo es fundamentalmente defectuoso y no debe ser utilizado. Estoy muy feliz de que nadie pudiera ver todos los pasos intermedios - la mayoría de ellos eran muy tontos.

(Él explica por qué la herencia y virtuals -- también conocido como. el diseño orientado a objetos "fue fundamentalmente defectuoso y no debe ser utilizado" en el resto de la entrevista).

Una vez Stepanov presentó su biblioteca a Stroustrup, Stroustrup, y otros se fueron a través de esfuerzos hercúleos para entrar en la ISO C++ estándar (el mismo de la entrevista):

El apoyo de Bjarne Stroustrup fue crucial. Bjarne realmente quería STL en la norma y si Bjarne quiere algo, lo consigue. ... Incluso me obligó a hacer cambios en la STL que yo nunca lo haría por nadie más ... él es el más sola persona de mente sé. Él consigue hacer las cosas. Le tomó un tiempo entender lo que STL era todo, pero cuando lo hizo, él estaba dispuesto a empujar a través. También contribuyó a STL por defender la opinión de que más de una forma de programación era válido contra un sin fin de flak y el bombo durante más de una década, y la búsqueda de una combinación de la flexibilidad, la eficiencia, la sobrecarga, y el tipo de seguridad en las plantillas que hizo STL posible. Me gustaría estado muy claramente que Bjarne es el principal diseñador del lenguaje de mi generación.

19voto

StackedCrooked Puntos 12247

La respuesta se encuentra en esta entrevista con Stepanov, autor de la STL:

Sí. STL no es orientado a objetos. Creo que la orientación del objeto es casi tanto de un engaño como Inteligencia Artificial. Todavía tengo que ver una interesante pieza de código que proviene de esta gente OO.

17voto

AraK Puntos 38702

¿Por qué un puro programación orientada a objetos de diseño para una Estructura de Datos Y Algoritmos de la Biblioteca sería mejor ?! La programación orientada a objetos no es la solución para cada cosa.

En mi humilde opinión, STL es la más elegante de la biblioteca que he visto nunca :)

por su pregunta

usted no necesita tiempo de ejecución de polimorfismo, es una ventaja para STL en realidad para implementar la Biblioteca con polimorfismo estático, que significa eficiencia. Intente escribir un genérico de la Especie o de la Distancia o de lo que nunca algoritmo que se aplica a TODOS los contenedores! su Ordenación en Java sería llamar a funciones que son dinámicos a través de n-niveles para ser ejecutado!

Usted necesita estúpido, como el Boxeo y el Unboxing para ocultar el desagradable supuestos de los llamados Puro lenguajes de programación orientada a objetos.

El único problema que yo veo con STL, plantillas y, en general, es la terrible mensajes de error. Que va a ser resuelto mediante los Conceptos de C++0X.

La comparación de STL a las Colecciones en Java es Como comparar el Taj Mahal a mi casa :)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X