Aún hoy, después de un tiempo considerable sin programar en C++, sigo teniendo pesadillas sobre el manejo de cadenas.
Seguro que si has programado en C++ sabrás de lo que hablo. Es HORRIBLE. Seguro que el que diseñó (o los que diseñaron) la clase standard de C++ para strings pensaron algo como:
“Dios!! Vamos a hacer una clase string que se van a cagar! Si si, se van a cagar! Vamos a hacer una clase base sobre la que puedan instanciar otras, y vamos a usar iteradores, y vamos a poner funciones de bajo nivel para que se pueda hacer de todo!”
Tipica paja mental. Es que claro, te pones a diseñar, te lias, te lias, y mira lo que se monta al final…
Por supuesto, esta es mi opinión. También estoy seguro de que a día de hoy, algunos de ellos se arrepentirán del diseño que hicieron.
Desde mi punto de vista, una clase string estándard, debería ser capaz de hacer un mínimo de operaciones. Por ejemplo, el método replace ahora mismo se le pasan dos iteradores (del texto a eliminar), y luego un string, u otros dos iteradores, que es el nuevo texto.
Vale, el replace puede ser eso, bien. Pero, ¿el uso más normal de esta función, no será un “search and replace”? No es más cómodo y legible que alguien haga str.replace (“casa”, “hogar”); en vez de inicializar dos iteradores, antes de poder llamar a str.replace (it_start, it_end, “hogar”);
Y éste es un ejemplo un tanto rebuscado. Pongamos un ejemplo más sencillo, en C++ ¿cómo transformas la cadena en mayúsculas?
for (size_t i = 0; i < str.length(); i++) { str[i] = toupper (str[i]); }
¡¡Venga hombre!! Eso lo podía hacer en C
Básicamente, y después de meditarlo unos minutos, la única utilidad de la clase string de C++ es que reserva y libera la memoria por nosotros (importante), permite concatenar strings al final (con el operador += o mediante append), y probablemente el método find también pueda ser de utilidad. Todo lo demás debería revisarse. De todos modos, una clase que haga eso se programa como muuucho, en 20 minutos.
Finalmente, de soporte para unicode es que ni hablamos. Lo cual me parece patético. Unicode debería ser el estándard en los compiladores de C/C++, y debería ser soportado por la clase string. Aunque bueno, esto ya es otra historia… y mejor dejamos la discusión para otro momento.
Por supuesto, desde este blog mando un cordial saludo a la gente que hizo posible la clase string… sin rencor lo digo :p
Para el que haya seguido leyendo hasta aquí, y quiera alguna alternativa a la clase string, con soporte de unicode y que sea fácilmente portable, puede echarle un vistazo a los siguientes enlaces:
- International Components for Unicode (ICU): ICU is a mature, widely used set of C/C++ and Java libraries providing Unicode and Globalization support for software applications
- UTF8-CPP: UTF-8 with C++ in a Portable Way
English
17/02/2010 at 12:31 am Permalink
No puedo estar más de acuerdo contigo. Vaya basura de tratamiento de cadenas. Uno que viene de la API de Java, de las StringUtils de apache y se encuentra con ese fantasma del pasado que es la STL de C++ y, particularmente, la patética clase string… vaya basura…
en fin…
Un saludo!