lunes, 10 de diciembre de 2012

Patrón de software - Visitor


Patrón de software - Visitor


Muchas veces, cuando queremos mostrar un ejemplo de programación orientada a objetos, se sale con el ejemplo de dibujar en pantalla diferentes figuras, como triangulos, cuadros y circulos. Que si estamos programando en C# pasaremos un objeto Graphics para su dibujado y ya está, ya que cada objeto tendrá su posición. Y de esta forma, usaríamos el poliformismo.

En este ejemplo, tendremos, como todos sabemos, una clase abstracta Figura y las clases hijas, Triangle, Square y Circle.

Pero, ¿qué pasa cuando el rectangulo representa una zona de una ciudad, es decir, sus medidas están en metros?. Ya no se podrá dibujar un rectangulo de 100x100 metros, habrá que escalar las medidas a pixeles.
¿pero donde se hace esa transformación? ¿en las clases hijas?¿la del padre?

Creo que una forma sería tener una clase, en este caso, FigureView, donde tendría la responsabilidad de dibujar y de guardar todas las figuras. Y el metodo dibujar sería


void Draw(Graphcis g)
{
foreach(Figure figure in _figures)
{
       f.Draw(g,this);
}
}

aquí le pasamos el this, el objeto a un objeto FigureView que será el Visitor del patrón de diseño.

ya que luego el metodo Draw de Triangle será:

void Draw(Graphics g,FigureView view)
{
     view.Draw(g,this);
}

Y aquí, viene la importante, las clases hijas llamaran a los siguientes métodos sobrecargados de FigureView:

void Draw(Grapchis, Triangle t);
void Draw(Grapchis, Circle c);
void Draw(Grapchis, Square s);

así, se deja en FigureView la responsabilidad de dibujar, y hacer los cálculos en la escala que precise.

y también importante, en un solo bucle, podemos dibujar las distintas figuras que conforman la vista.

saludos y happy coding!


miércoles, 28 de noviembre de 2012

Arquitectura - removiendo las bases

Arquitectura - removiendo las bases

En muchas ocasiones, he visto o he estado en aplicaciones donde una modificación de los requisitos, te puede trastocar o simplemente no poder implementarse con la arquitectura con la que ha sido construida la aplicación.

Siempre que ha querido hacer una analogía entre la construcción de un edificio con la construcción software. Vamos a intentar hacer lo mismo para el caso de "remover la arquitectura por los requisitos de usuario".

Imaginemos que estamos desarrollando una aplicación 3d, donde el terreno 3d, se forma através de un fichero .jpg o .bmp donde el código de color es una altura. La arquitectura tiene encuenta este hecho y se construye la malla de del terreno, conforme al grid del .jpg. Es decir, internamente se trabajo con coordenadas del tipo grid [i][j]  para acceder a la altura. Y todo funciona a la perfección!!!

Hasta que el cliente llega y dice..."Vamos a trabajar con una empresa donde tiene archivos con curvas de nivel en vez de con .jpg. Entonces, la aplicación nos gustaría que importase y trabajase con archivos de curva de nivel".

Y va el ing. sw, o el desarrollador y se queda a cuadros. Y se queda por que sabe que tendrá que modificar toda la arquitectura de la aplicación, pero ¿cómo explicarlo?

Imaginemos que estamos construyendo un bloque (esto le paso a un arquitecto que realizo un diseño para un cliente. Eran un bloque de pisos en una pequeña ladera).

El arquitecto empezo por diseñar los pilares, los cuales sustentaran todo el peso y de hay subir pisos. Es decir, con los pilares hizo el esquelo del edificio, la arquitectura.
Cuando termino los planos, se los enseño al cliente:
- "bien..bien..pero...yo quería garaje.."
El arquitecto se quedo a cuadros también, claro esta. Y se quedo por que como el garaje va debajo de los pisos, tendría que haber una separación entre los pilares para crear las plazas de garaje, con lo cual, tendría que modificar la arquitectura de los pilares para encajar las plazas de garaje.



Aquí, en este ejemplo, se ve claramente como se modifica la arquitectura.
En el caso del software, la dependencia de que cada i,j tiene su altura, hizo que cuando este supuesto no es cierto, todo se cae a bajo, como un castillo de naipes.
Algo como, hallar el dato de altura más cercano a punto i,j podría haber sido una arquitectura más resistente los cambios de requisitos.

Como punto final, la diferencia entre el aquitecto del garaje y el arquitecto del terreno 3d, es que el primero, solo tuvo que hacer las modificaciones en un papel, el otro es sobre código, sobre algo ya construido.
Es como si el arquitecto del edificio, despues de haber consstruido los pilares, según la distrubición que le ha marco un programa de calculo de estructuras, llega el arquitecto y manda a los albañiles a mover los pilares para dejar espacio a las plazas de garaje. Da miedo, no?.

happy coding!


domingo, 8 de abril de 2012

Interprete de Ecuaciones

Desde hacía mucho tiempo, tiempos donde compilaba con el borland c++, me llamaba mucho la atención en poder representar gráficamente una fórmula matemática:

y = x*x+5
y= x*cos(x/2)

Pero tenía un problema, una vez escribía la función:

double eq1(double x)
{
    return (x*x+5)
}

Ya no podía cambiar. El usuario, no podía escribir la ecuación que quisiera ver representada en la pantalla.

Hasta que me decidí a investigar este campo un poco y también a arrepentirme un poco más de no haber elegido la asignatura de libre elección "compiladores e interpretes" en segundo de la carrera. A si qué, empeze a mirar libros como "Engineering a Compiler" y "Modern Compiler Implementation in C". Ahí ví las gramáticas por la izquierda, que son las gramáticas más facil de implementar, con lo cual, mejor empezar por algo fácil. Y implemente está gramática:


S => E$
E => TERMINAL Eprima
Eprima => +TERMINAL Eprima
Eprima => -TERMINAL Eprima
Eprima => cos(E)
Eprima =>


TERMINAL => FACTOR Tprima
Tprima =>*FACTOR Tprima
Tprima =>/FACTOR Tprima
Tprima =>


FACTOR => NUM
FACTOR => ( E )
FACTOR => VARIABLE
FACTOR => cos( E )
FACTOR => sin( E )


Como se puede ver en el video, se pueden escribir variables (x, a,...) que a la hora de realizar la gráfica el programa, las va dando valores de un rango de -50 a 50 para realizar la gráfica.
Admite ecuaciones de dos variables, pero esto sería ya para realizar una visualización en tres dimensiones.




La implementación de este tipo de algoritmos, permite al usuario obrar con más libertad a la hora de interactuar con cualquier aplicación. En este por ejemplo, se permite experimentar con visualizar casi todo tipo de equaciones (que permita este simple gramática), pero en aplicaciones grandes, se podría por medio de comandos variables...es decir,..un mini-lenguaje, hacer más productiva una aplicación.

domingo, 29 de enero de 2012

Uso de Nueva Tecnología


Uso de Nueva Tecnología


Al iniciar un proyecto uno de las cosas que hay que decidir es la tecnologia con la que se va desarrollar el software. Hay muchas fuerzas por las cuales puede ser elegida uno y no otra. Puede ser que la empresa cliente imponga la tecnología por que luego se quedará con el código fuente y la tecnología que conoce. O por que el equipo de desarrollo quiere aprender una nueva tecnologia. O por que una tecnología permite hacer determinadas cosas con un par de lineas de código.


En el caso concreto de WPF es una tecnología que te permite hacer muchas cosas con un par de líneas de código pero si estás acostumbrado a programar al estilo de MFC o winforms, habrá cosas en las que uno tendrá que perder un poco el tiempo buscando la forma de hacerlo.


- No se puede hacer una copia de un objeto. En wpf hay que serializarlo, y luego deserializar para crear otro. ¿y que pasa si hay una clase wpf que no se puede serializar? es algo en lo habría uno que investigar.
- El repintado no se hace con un updateall sino llamando a un Invoke en wpf.


O por ejemplo, otro caso, el elegir los sockets de toda la vida o usar las diversas tecnologías para comunicaciones (.net remoting, WCF, ...). Que cuando uno sea más o menos un experto en .net remoting saldrá a la luz una nueva tecnología para comunicaciones.


Con esto quiero decir, que a veces, cuando eliges una tecnología para ir más rápido, el hecho de no conocerla a fondo hace que unas cosas se avanza rápido en un proyecto y otras tengas que parar a investigar. Cosas que con tecnologías que ya conocias, era a más rápido.


Aunque claro está, este conocimiento que se va adquiriendo en un primer proyecto con una tecnología nueva (como dicen en el libro Software Project Secrets), en un segundo proyecto que use dicha tecnología irá mucho más rápido el proyecto. Pero, cuando surja ese segundo proyecto, es muy posible que ya exista otra tecnología que sustituya a la anterior y volvamos al principio.


Pero una de las cosas más peligrosas a mi entender para el éxito de un proyecto es el realizar un proyecto novedoso con tecnología novedosa.