Buenas. Soy nuevo por estos foros. ¿Qué tal todo el mundo?
Pues yo quería dar mi opinión sobre C vs C++ y en concreto de la orientación a objetos en particular, que tanto defendéis algunos.
Si bien me parece que el estilo de C++ orientado a objetos es una mejora sobre la programación estructurada en C, la verdad es que la programación a objetos también tiene sus propios problemas.
Los principales objetivos de la programación orientada a objetos son:
1.- Ocultación de la información y acceso a través de interfaces.
2.- Reutilización de código.
A su vez ésto redunda en una mayor mantenibilidad del código, ya que si cambias la implementación, la interfaz se mantiene y no hay problemas, entre otras cosas, pero para no enrollarme,
Desde mi punto de vista, el punto 1 se cumple, pero el 2 es un auténtico fracaso.
Voy a describirlo con un breve ejemplo:
Yo tengo un toolkit en el que tengo una clas Monstruo. Mi monstruo puede atacar, puede reposar y puede chillar. A partir de ese monstruo, creo monstruo feo, monstruo muy malo y monstruo casi invencible, derivadas de monstruo.
Muy bien. Ahora, cuando quiera otro monstruo para mi toolkit de monstruos, puedo derivar de Monstruo y heredo código que puedo usar. Hasta ahí todo bien, más bonito que C.
Ahora, veo otro toolkit en otra página. Es un juego de rol online de fantasía, al que quien quiera puede hacer código para crear monstruos, personajes, o lo que sea. Mis Monstruos irían que ni pintado para el juego, pero resulta que MIS Monstruos derivan de MI clase Monstruo, y no de la clase monstruo del código del juego de rol. Por lo tanto, mis clases, como tal, ya no se pueden reutilizar, porque para ello deberían de heredar de JuegoRol::Monstruo. Fracaso de reutilización de código.
La programación orientada a objetos, mientras tienes sólo un framework, es muy bonita y cómoda, pero a la hora de empezar un nuevo proyecto, es realmente imposible coger clases viejas que tenías, y, sin tocarlas, poder reusarlas.
Pero, mira tú por dónde, existe algo mejor que la programación orientada a objetos, y que el próximo estándar de C++, C++0x, va a soportar directamente en el lenguaje. Se llaman conceptos.
Para empezar, los conceptos entran dentro del paradigma de la programación genérica, bastante más potente que la Orientada a Objetos en mi opinión. Olvidaros de tener que heredar de una u otra clase.
En un paradigma genérico, el Monstruo de vuestro toolkit tendrá una serie de requerimientos, y no tendrá que heredar de una clase en concreto. Por ejemplo, vuestro monstruo puede: atacar y dormir.
Ahora, el monstruo del Juego de Rol, suponiendo que ha sido modelado con programación genérica, puede reposar y pegar, que son cosas equivalentes a atacar y dormir en el toolkit que yo escribí. Pues bien, con programación genérica sólo tendrías que decirle al toolkit del juego de rol que tu función atacar es su función pegar y que tu función dormir es su función reposar. Se acabó. Todo ésto sin tocar una mísera línea de código de ninguno de los dos toolkits.
Obviamente ésto es un ejemplo chorra, pero para que os hagáis una idea, es lo que se hace en librerías genéricas como la STL y la BOOST hoy día, en la que si tus iteradores, o clases cumplen una serie de requisitos, puedes usar todos los algoritmos, por ejemplo. La única diferencia, es que C++0x lo soportará directamente con los conceptos.
Espero no haber aburrido mucho. Para quien quiera estar al día de lo que va a llevar el próximo estándar de C++. Llevará: conceptos, enumerados fuertemente tipados, soporte para hilos, static assert, inicialización de contenedores al estilo de los arrays de c, plantillas que varían en número de parámetros; deducción de tipos con la palabra auto, un nuevo loop for al estilo for_each de C#, aliases de plantilla, expresiones constantes generalizadas y "move semantics" con nuevas referencias a objetos temporales, entre otras cosas.
En la parte de la librería: tablas de hash (unordered_map), tuplas, números aleatorios, generalización de bind...
Para quien le interese:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2169.html
Y para quien quiera ir practicando con los nuevos conceptos del lenguaje C++ futuro, puede pasarse por aquí, ya que ya hay una implementación experimental:
http://www.generic-programming.org/software/ConceptGCC/