Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



sábado, 30 de noviembre de 2013

Patrón State: Ejemplos: Conexión/Desconexión y Ventanilla del Banco

Patrón State

Ejemplos:  Conexión/Desconexión y Ventanilla del Banco



Este patrón permite que un objeto modifique su comportamiento cada vez que cambie su estado interno. Busca que un objeto pueda reaccionar según su estado interno. Si bien muchas veces esto se puede solucionar con un boolean o utilizando constantes, esto suele terminar con una gran cantidad de if-else, código ilegible y dificultad en el mantenimiento. La intención del State es desacoplar el estado de la clase en cuestión.

En determinadas ocasiones se requiere que un objeto tenga diferentes comportamientos según el estado en que se encuentra. Esto resulta complicado de manejar, sobretodo cuando se debe tener en cuenta el cambio de comportamientos y estados de dicho objeto, todos dentro del mismo bloque de código. El patrón State propone una solución a esta complicación, creando un objeto por cada estado posible.
Este patrón debe ser utilizado cuando:

  • El comportamiento de un objeto depende de un estado, y debe cambiar en tiempo de ejecución según el comportamiento del estado.
  • Cuando las operaciones tienen largas sentencias con múltiples ramas que depende del estado del objeto.

 Este patrón se utiliza cuando un determinado objeto tiene diferentes estados y también distintas responsabilidades según el estado en que se encuentre en determinado instante. También puede utilizarse para simplificar casos en los que se tiene un complicado y extenso código de decisión que depende del estado del objeto.



Diferencias entre patrón State y Strategy:
El patrón State permite hacer diferentes cosas dependiendo del estado del objeto. En otras palabras, lo que cambia de acuerdo al estado es que se hace. Además, todas las posibilidades están incluidas en el código del modelo. A la hora de agregar nuevos estados y su correspondiente acción asociada basta con agregar una subclase sin tocar las demás (observando el Open-Close principle).
En cambio el patrón Strategy permite hacer lo mismo de diferentes maneras. En otras palabras, lo que cambia es como se hace. Este patrón usualmente permite que la implementación específica (la estrategia) se pueda seleccionar por configuración, por el estado de cierto objeto, etc.

Ejemplo:  Conexión y Desconexión
Tenemos una conexión la cual puede estar en dos estados: conectada  y desconectada

-Clase Conexion:
->

-Clase Conectado
->

-Clase Desconectado
->

-Programa principal:
->


Pantallazo en la ejecución:


Ejemplo: Ventanilla de Banco
Tenemos un banco y en el una ventanilla de atención al público.
Cuando llegamos, nos colocamos en la fila de la ventanilla.

  •  Si la misma esta abierta, seguiremos en la fila.
  •  En cambio, si esta cerrada nos colocaremos en otra fila o tomaremos alguna decisión acorde.
  •  Por otro lado, si vemos un cartel que dice "Espere 5 minutos por favor..." quizás tenemos que contemplar el tiempo disponible que tenemos. 

 Es decir, para nosotros, el comportamiento de un banco cambia radicalmente según el estado en el que se encuentre.
Esquema del Banco, Ventanilla y estado de la Ventanilla.

Clase Ventanilla
->

Clase EstadoVentanilla
->

Clase Abierta
->

Clase Cerrada
->

Clase Suspendida
->

Clase Banco
->

Clase Persona
->

Programa principal:
->





Pantallazo en la ejecución:


Enlaces de descarga:
Ejemplo Conexion
Ejemplo Banco-Ventanilla


Fuentes:
http://migranitodejava.blogspot.com.es/2011/06/state.html
http://lcanaveral.com/ean/state.pdf
http://www.design-nation.net/es/archivos/001844.php
http://carlospeix.com/2011/04/cul-es-la-diferencia-entre-el-patrn-strategy-y-state/
http://userpages.umbc.edu/~tarr/dp/lectures/StateStrategy.pdf
http://r0d.developpez.com/articles/dp-state-es/

El patrón State aplicado al desarrollo de juegos
http://www.design-nation.net/es/archivos/001844.php

El patrón State aplicado al desarrollo de juegos ( II )
http://www.design-nation.net/es/archivos/001845.php

El patrón State aplicado al desarrollo de juegos ( III )
http://www.design-nation.net/es/archivos/001846.php

El patrón State aplicado al desarrollo de juegos ( IV y final )
http://www.design-nation.net/es/archivos/001856.php

viernes, 29 de noviembre de 2013

Patrón Builder. Ejemplo: Creando Coches de Marca


Patrón Builder

Ejemplo: Creando Coches de Marca





Este patrón permite la creación de un objeto complejo, a partir de una variedad de partes que contribuyen individualmente a la creación y ensamblaje del objeto mencionado.
Centraliza el proceso de creación en un único punto, de tal forma que el mismo proceso de construcción pueda crear representaciones diferentes. (ver fuentes)

Se utiliza:
-Independizar el algoritmo de creación de un objeto complejo de las partes que constituyen el objeto y cómo se ensamblan entre ellas.
- Que el proceso de construcción permita distintas representaciones para el objeto construido, de manera dinámica.
- Este patrón debe utilizarse cuando el algoritmo para crear un objeto suele ser complejo e implica la interacción de otras partes independientes y una coordinación entre ellas para formar el ensamblaje.

Esquema:
Parte que lo forman:

  • Producto: representa el objeto complejo a construir.
  • Builder: especifica una interface abstracta para la creación de las partes del Producto. Declara las operaciones necesarias para crear las partes de un objeto concreto.
  • ConcreteBuilder: implementa Builder y ensambla las partes que constituyen el objeto complejo.
  • Director: construye un objeto usando la interfaz Builder. Sólo debería ser necesario especificar su tipo y así poder reutilizar el mismo proceso para distintos tipos.


El Cliente crea el objeto Director y lo configura con el objeto Builder deseado.
El Director notifica al constructor cuándo una parte del Producto se debe construir.
El Builder maneja los requerimientos desde el Director y agrega partes al producto.
El Cliente recupera el Producto desde el constructor.

 Consecuencias

  • Permite variar la representación interna de un producto.
  • El Builder ofrece una interfaz al Director para construir un producto y encapsula la representación interna del producto y cómo se juntan sus partes.
  • Si se cambia la representación interna basta con crear otro Builder que respete la interfaz.
  • Separa el código de construcción del de representación.
  • Las clases que definen la representación interna del producto no aparecen en la interfaz del Builder.
  • Cada ConcreteBuilder contiene el código para crear y juntar una clase específica de producto.
  • Distintos Directores pueden usar un mismo ConcreteBuilder.
  • Da mayor control en el proceso de construcción.
  • Permite que el Director controle la construcción de un producto paso a paso.
  • Sólo cuando el producto está acabado lo recupera el director del builder.


Ejemplo: (basado en el ejemplo de:  
Crear un objeto Auto, este sería nuestro producto. El auto se compondrá de varios atributos que lo componen: motor, marca, modelo y cantidad de puertas.
Esquema del proyecto:


Clase Auto:
->

Clase Motor:
->

Clase AutoBuilder:
El Builder (AutoBuilder) define al menos dos cosas: un método para devolver el Producto (el auto en nuestro caso) y los métodos necesarios para la construcción del mismo.
->

Clase FiatBuilder
->

Clase FordBuilder
->

Clase AutoDirector:
Lo primero que debe hacerse con esta clase es enviarle el tipo de auto que se busca construir (Ford, Fiat, etc). Luego, al llamar al método constructAuto(), la construcción se realizará de manera automática.
->


Programa principal:
->



Aplicación ejecutándose:



Enlace de descarga del ejemplo: enlace


Fuentes:
http://migranitodejava.blogspot.com.es/search/label/Builder
http://informaticapc.com/patrones-de-diseno/builder.php
http://sourcemaking.com/design_patterns/builder

miércoles, 27 de noviembre de 2013

Gambas3: Colocar los controles proporcionalmente cuando se redimensiona un formulario

Gambas3: Colocar los controles proporcionalmente cuando se redimensiona un formulario



Gambas3 tiene  controles de layout (HBox, Vbox, etc.), que permiten ordenar los contrones de manera automática en el formulario, cuando se redimensiona el formulario.


Bien, algunas veces, lo que necesitamos es que los controles se organicen proporcionalmente cuando se redimensione el formulario.

Por ejemplo, estoy realizando un juego de tablero, basandome en imágenes de tableros reales, donde van a colocarse botones, imágenes, etc... Como la disposicion es irregular, lo suyo es usar algún método que organice los controles proporcionalmente cuando se redimensione.


 Os dejo aqui una clase que es capaz de realizar esta tarea, y que se puede usar en cualquier formulario con diversos objetos, y al final del articulo encontrareis pantallazoas y el codigo fuente para la descarga.

->
-
Y su uso en el programa principal:
->




El programa de ejemplo en funcionamiento:

Cuando se inicia la aplicación

Se ha cambiado el tamaño del formulario,
 las posiciones y dimensiones de los controles se han modificado proporcionalmente

La clase lo que hace, es:
1) Cuando se inicia  se guarda la posicion X,Y,Ancho y Largo, del formulario y del los controles que contenga. Para ello se guarda en el archivo de configuración usando la clase settings.
2) Cuando se modifica las dimensiones del formulario, redefine la posición de los controles proporcionalmente con los valores guardados.


Enlace de descarga del ejemplo: descarga


Saludos

Nota:
Mejora añadida: 1 de diciembre de 2013
A partir de un hilo del foro de gambas, Tanteador de Tenis de Mesa, he añadido una nueva forma de ordenarse proporcionalmente los controles, dependiendo de una nueva propiedad:
orden.FormaAdaptacion = 0 'se ordenan, sin deformación de la imagen de fondo (como inicialmente la programé, vease pantallazos del juego "Lobo Grises en el Atlántico"
orden.FormaAdaptacion = 1 'se ordenan, con las dimensiones del formulario, pudiendose deformarse la imagen de fondo.
Dependiendo de tipo de orden queremos que se realice, nos interesará uno u otro.
Aqui teneis un ejemplo de como se ordenaría los controles en el programa "Tanteador de Tenis"
Tanteador de Tenis de Mesa


#TIMO: #BBVA le informa que tu #cuenta ha sido #premiada con un importe en valor de 600 euros.


TIMO: BBVA le informa que tu cuenta 
ha sido premiada con un importe
 en valor de 600 euros.

Me acaba de llegar este mensaje al correo electrónico:


BBVA le informa que tu cuenta ha sido premiada con un importe en valor de 600 euros.
Para mas información por favor accede el link de abajo:
Clic aqui para mas informacion!


El enlace lleva a esta página web:  http://69.50.213.165/.ide/ide.htm




Como podéis ver la dirección que muestra la barra es:
http://www3.bbva.sistema.premio.wtqft.jawkz.com/TBLS/index.html ,
 y es muy parecida a la pagina real del banco. De hecho si le pulsáis a los enlaces de "banca personal", "banca privada",etc... te lleva a los enlaces de la pagina real del banco!!!

Si introduzco algún dato (cualquiera) como usuario  y contraseña me lleva a la siguiente página:


Solicitándome datos de la tarjeta para supuesta mente "recibir el premio"...

¿que raro no? ¿el banco me pide datos que ya tiene?...y sobre todo ...

¿que me va regalar 600 euros, por mi cara bonita????



Evidentemente se trata de una falsificación de la pagina web real, que es la siguiente
https://www.bbva.es/particulares/index.jsp

Para diferenciarla, fijaos bien, que la falsa empieza por "http://www3.bbva" y la buena empieza por "https;//www.bbva"


Esta claro que se trata de un engaño para conseguir los datos personales de nuestras cuentas y tarjetas de crédito o débito...

Mirad la pagina del banco donde nos comentan las normas de seguridad: https://www.bbva.es/sistema/meta/seguridad.jsp

Conclusión: 
Nadie da "duros a pesetas", siempre hay alguno que se quiere aprovechar...


Nota:
¿alquien sabe de alguna pagina web de la policia donde denunciar esta página?


martes, 26 de noviembre de 2013

#Estadisticas resultados Minuto / #Gol de la #liga de #futbol


Estadísticas resultados Minuto / Gol 

de la  liga de fútbol

 2013-2014





Estoy preparando un programa para llevar la estadísticas de fútbol de la liga. 

Pero para empezar, estoy apuntando en una hoja de cálculo los datos de los partidos en las distintas jornadas. Estos son los campos:
  • jornada
  • minuto aproximado en que se marca
  • encuentro
  • que equipo lo marca
  • que equipo recibe el gol
  •  jugador que lo marca
  • resultado definitivo del encuentro



Tengo metidos hasta la ultima jornada a fecha de hoy (jornada 14º de la liga), siendo los datos filtrados fácilmente:





Por curiosidad, se sacado algunas gráfica (usando un histograma) para ver en que intervalo de 5 minutos, se marcan los goles.

El resultado,  es este:


 Según los datos  el 10.6 % de los goles marcados hasta la jornada 14 (inclusive)  se marcan a partir del minuto 85 en adelante, curioso ¿verdad?.

Otra gráfica que se puede hacer con el minuto gol , es la relativa a los equipos de futbol y compararla entre ellos:

Comparación de minuto gol entre FC Barcelona y Real Madrid


Si alguien desea la hoja de cálculo, que me envie un correo y por un pequeño donativo, se la envío por correo electrónico.

Este es mi correo:



Saludos

sábado, 23 de noviembre de 2013

Síndrome de Diógenes Digital: El descargador Compulsivo


Síndrome de Diógenes Digital:
 El descargador Compulsivo 

      Tengo un amigo que tiene más de 10 discos duros (de diversos tamaños) y que cada 6 o 9 meses, se ve en la necesidad de comprar uno nuevo.... el dice que se los autorregala :)

       El es coleccionista de juegos de videoconsola y películas HD, su "afán" es completar su colección que lleva años con ella. Antes lo almacenaba todo en CD y luego se pasó a los  DVD. 

      Era frecuente, verlo en los mercadillo, en los puestos de tarrinas de CD y DVD, comprándolos. Con la bajada de los precios de los discos duros, se pasó a estos, ya que le ocupa menos espacio los discos duros que los CD y DVD. 

      Lo curioso es que de la colección de juegos, me ha confesado que ha jugado menos de un 10% y que le pasa casi lo mismo con las películas, las descargas, y las guardas, porque casi no tiene tiempo para verlas. Nota: no se dedica a revenderlas, solo las guardas para su colección.

Le he dicho muchas veces que se lo tiene que mirar, que no es normal... llevarse las tardes y tardes, limpiando discos duros pasando archivos de un lugar a otro, organizando sus descargas....

¿se lo llevará la Guardia Civil esposado por sus continuas descargas, denunciado por la SGAE u otro organismo?
¿le dará el premio de cliente "honorífico"  la compañía que le proporciona el ADSL, por su consumo de banda ancha?
¿se le pondrá de huelga su "chiquitina", una raspberry pi, que desde la compró, solo ha conocido  y ejecutado programas de descargas?
¿estará creando su propia "Biblioteca de Alejandría" multimedia?



Nota:
Otro día os hablaré de otro amigo, que es "instalador compulsivo" de programas.



viernes, 22 de noviembre de 2013

Patrón Facade (fachada): Ejemplo de Inmobiliaria



Patrón de Fachada: 

Ejemplo de Inmobiliaria



Busca simplificar el sistema, desde el punto de vista del cliente, proporcionando una interfaz unificada para un conjunto de subsistemas, definiendo una interfaz de nivel más alto. Esto hace que el sistema sea más fácil de usar. 
Este patrón busca reducir al mínimo la comunicación y dependencias entre subsistemas. Para ello, utilizaremos una fachada, simplificando la complejidad al cliente. El cliente debería acceder a un subsistema a través del Facade. De esta manera, se estructura un entorno de programación más sencillo, al menos desde el punto de vista del cliente (por ello se llama "fachada").
Ref: http://migranitodejava.blogspot.com.es/2011/06/facade.html

Organización del programas sin usar el patrón y usandolo.
(http://powerdream5.wordpress.com/tag/facade-pattern/ )
Los clientes se comunican con el subsistema a través de la facade, que reenvía las peticiones a los objetos del subsistema apropiados y puede realizar también algún trabajo de traducción. Los clientes que usan la facade no necesitan acceder directamente a los objetos del sistema.

Ejemplo:  (ref:  http://migranitodejava.blogspot.com.es/2011/06/facade.html )
Vamos a realizar el software para una inmobiliaria. Una inmobiliaria realiza muchos trabajos diferentes, como:
- el cobro de alquiler
- muestra de inmuebles
- administración de consorcios
- contratos de ventas
- contratos de alquiler
- etc.
Por una cuestión de seguir el paradigma de programación orientada a objetos, es probable que no se realice todo a una misma clase, sino que se dividen las responsabilidades en diferentes clases.
En el soft de la inmobiliaria tenemos diversos tipos de Personas, todas con sus atributos y métodos correspondientes.Lo mismo con los métodos principales de las diversas clases que tiene el sistema.

Ahora haremos una clase llamada Inmobiliaria que será nuestro Facade

Para ver las ventajas de usar el patrón, veamos ahora 2 tipos de clientes.
-> El primero no llamará al Facade
-> y el segundo si lo utilizará.
Veremos como el primero esta obligado a conocer muchos detalles de los subsistemas y el segundo no.
Proyecto:


Las clases:
Clase AdministracionAlquiler

Clase CuentasAPagar

Clase MuestraPropiedad

Clase VentaInmueble

Clase Inmobiliaria (esta clase hará la función clase FACADE "fachada")

Clase Persona

Clase Cliente

Clase Interesado

Clase Propietario

El programa principal:

Salida por pantalla:



Descarga del código fuente: enlace a box.com


Consecuencias.

  • Oculta a los clientes de la complejidad del subsistema y lo hace fácil de usar.
  • Favorece un acoplamiento débil entre el subsistema y sus clientes, consiguiendo que los cambios de las clases del sistema sean transparentes a los clientes.
  • Facilita la división en capas y reduce dependencias de compilación.
  • No se impide el acceso a las clases del sistema.


Temas a tener en cuenta.

  • Lo más importante de todo es que este patrón se debe aplicar en las clases más representativas y no en las específicas. De no ser así, posiblemente no se tenga el nivel alto deseado. 
  • Por aplicación, es ideal construir no demasiados objetos Facade. Sólo algunos representativos que contengan la mayoría de las operaciones básicas de un sistema.

Es interesante el uso de este patrón, en trabajos en grupo, donde cada persona se dedica a subsistemas concretos, y los demas, si necesitan usarlos, lo usan mediante la clase "FACADE" (Fachada). En nuestro ejemplo la clase "Inmobiliaria".
Enlaces:
http://migranitodejava.blogspot.com.es/2011/06/facade.html

http://zarza.fis.usal.es/~fgarcia/docencia/poo/03-04/Trabajos/Fachada.pdf

http://powerdream5.wordpress.com/tag/facade-pattern/