Me ha parecido un proyecto francamente curioso, habrá que ver que sale de ahí.
La misma entrada en BP
Actualización: Esto ha sido publicado en la portada de barrapunto, así que podéis ir alli si queréis más información y más ruido: Ruby en .NET
Como su propio nombre indica, aún otro weblog de programación más
Me ha parecido un proyecto francamente curioso, habrá que ver que sale de ahí.
La misma entrada en BP
Actualización: Esto ha sido publicado en la portada de barrapunto, así que podéis ir alli si queréis más información y más ruido: Ruby en .NET
Un framework es solo una aplicación con hooks; puedes diseñar un framework ad hoc empezando con una aplicación que hace una sola cosa e intentando generalizarla en varias direcciones. Puedes parar en cualquier momento y llamarlo "un framework". Pero una buena librería requiere mucho más. Necesitas empezar por los requerimientos, abstracciones y el intento hacer una API mínima que cumpla al máximo con los requerimientos. Los frameworks no tienen el requerimiento de ser mínimos en tamaño sino máximos en cuanto a características.
Acabo de leer una muy interesante entrada en el bliki de Martin Fowler (GetterEradicator) acerca de un tema muy controvertido: los accesores en programación orientada a objetos. La encapsulación, la ocultación de información, el diseño orientado al cambio, todo esto influye en la decisión de no usar get y set para todos los datos de una clase.
Tiene enlaces muy sabrosos a artículos que han ido hablando del tema, pero me gustaría destacar uno, Tell, Don't Ask en el que se habla de la "Ley de Deméter": Habla sólo con tus amigos inmediatos. Traduciendo el enunciado formal
Un método M de un objeto O solo debería invocar métodos:Así se consigue que la dependencia de la estructura entre las clases no vaya arrastrando más de un nivel. Eso si, provoca algún nivel de indirección más. Y como sabemos (Actualización:Ya decía yo que la cita la había leído hace poco... y era en Esos aparatos del demonio)
- suyos
- de sus parámetros
- objetos que cree o instancie
- objetos miembros de la clase (atributos)
No hay ningún problema de computación que no se pueda solucionar con un nivel más de indirección (salvo si el problema es que existen demasiados niveles de indirección...)
Y claro, siempre teniendo en cuenta que toda ley o directriz de diseño debería ser eso una directriz. Siempre hay excepciones a estas reglas. El arte es saber cuando saltárselas :)
A raíz de una noticia enviada a menéame, ACE contra JAVA y .NET, y que no ha pasado a portada me ha parecido necesario hacer apología de ACE. Se trata de un framework altamente portable y basado en patrones de diseño con el cual se pueden hacer aplicaciones con un uso muy facilitado de funcionalides del sistema, por ejemplo, sockets y threads, más compacto que las versiones nativas de C y por supuesto portable a un número realmente grande de plataformas.
Como todo lo bueno tiene desventajas, claro. La primera es que ocupa mucho como librería. La segunda es que no tiene GUI propio, aunque se puede usar wxWidgets, Qt, GTK+...
¿Por que no es tan conocido como otras soluciones? Mi explicación es sencilla :) No hay detrás una gran empresa con marketing, ni siquiera una fundación (creo) Su página web es fea y sin diseño y usan un lenguaje como C++ que no es lo que se lleva, aunque los apóstoles del lenguaje se empeñan, con algún éxito, de que se deje de ver a C++ como C con objetos para verlo como multiparadigma. Pero en mi opinión, y bueno, no solo en la mía, ACE da una flexibilidad y portabilidad difícilmente conseguible con otros lenguajes, frameworks o librerías
Por último nombrar alternativas en plain old C, que no he usado pero que por venir de donde vienen no deben estar mal. Serían Apache Portable Runtime y Netscape Portable Runtime usado y mantenido por Mozilla.
Este tema da para mucho (seguro que para muchos libros y/o ríos de bytes) pero bueno, trataré de ser breve. Me he encontrado una noticia en The Server Side sobre Amber, un mapeador de objetos en bases de datos relacionales que, al contrario de el resto de estos sistemas, se centra más en las características de la base de datos, con lo que permite olvidarse de las configuraciones en XML y además dejar del lado de la base de datos, mediante procedimientos almacenados, la configuración de dicho mapeo. (Más información en Lightweight R/O Mapping y Java and the Empowered Database)
Como el tema me parece muy relevante (¿quién no programa hoy en día en un lenguaje que no soporte OO? ¿quién no usa bases de datos relacionales?) y sin embargo creo el tema no es un tema demasiado "popular" voy a tratar aportar lo que tengo a mano para aumentar la popularidad y con suerte algún lector será capaz de aportar algo más.
En la wikipedia hay una entrada acerca del mapeo O/R, que apunta a lo que me parecen dos artículos extensos y muy muy jugosos: Mapping Objects to Relational Databases: O/R Mapping In Detail y uno un poco más breve: The Object-Relational Impedance Mismatch, ambos de Scott W. Ambler. En este último se pone de relevancia algo que sospecha todo aquel que piensa detenidamente en ambos paradigmas, OO y relacional, y es que no son directamente "enchufables" y por ello se genera lo que llama impedance mismatch ("desajuste de impedancia", al parecer una analogía con la electrónica) De este desajuste se deduce que tenemos que pensar detenidamente en los mecanismos y herramientas de mapeo, no vaya a ser que nos encontremos con sutilezas desagradables en un punto más avanzado del desarrollo...
"La evidencia indica que los principales pasos evolutivos, una vez dados, nunca se desandan"Como casi todas las leyes de la evolución tiene excepciones que pueden ser las que confirman la regla. Además en el propio ensayo se hace una mención a su validez en evolución de sistemas informáticos:
"La longitud de los programas(*) y sus peculiaridades crean estructuras que no pueden revertirse sin que el programa(*) quede destruido y haya que empezar de cero"Y claro, leyéndolo se me hay ocurrido ejemplos de su aplicación en la tecnología. El triunfo de sistemas edificados sobre el triunfo de otros sistemas: C++ encima de C, servicios web y AJAX sobre HTTP...(*)Creo que decir "programas y sistemas" en lugar de "programas" da una mejor visión de como funcionan estos mecanismos en la realidad...
Es curioso como esto tembién se puede extrapolar (con menor potencia) a sistemas más pequeños, a los sistemas que vamos contruyendo cada día. En general unos se edifican sobre los anteriores, los nuevos sobre los que se usan. Yo lo resumiría en una frase: "serás esclavo de tus éxitos" (y tendrás que mantenerlos) :)
La misma entrada en BP
Se le va a echar de menos :(
template<class T> using Vec = vector<T,My_alloc<T>>;
Vec<double> v = { 2.3, 1.2, 6.7, 4.5 };
sort(v);
for(auto p = v.begin(); p!=v.end(); ++p)
cout << *p << endl;
Actualización: Más información: en la portada de BP Un vistazo a C++0x, por Bjarne Stroustrup, Slashdot y OSNews
La misma entrada en BP