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:



miércoles, 4 de diciembre de 2013

Patrón Bridge: Ejemplo dibujando punteado y normal


Patrón Bridge: 

Ejemplo dibujando punteado y normal




Este patrón permite modificar las implementaciones de una abstracción en tiempo de ejecución. Básicamente es una técnica usada en programación para desacoplar la interface de una clase de su implementación, de manera que ambas puedan ser modificadas independientemente sin necesidad de alterar por ello la otra.
Este patrón debe ser utilizado cuando:

  • Se desea evitar un enlace permanente entre la abstracción y su implementación. Esto puede ser debido a que la implementación debe ser seleccionada o cambiada en tiempo de ejecución.
  • Tanto las abstracciones como sus implementaciones deben ser extensibles por medio de subclases. En este caso, el patrón Bridge permite combinar abstracciones e implementaciones diferentes y extenderlas independientemente.
  • Cambios en la implementación de una abstracción no deben impactar en los clientes, es decir, su código no debe tener que ser recompilado.
  • Se desea compartir una implementación entre múltiples y este hecho debe ser escondido a los clientes.
  • Permite simplificar jerarquías demasiado pobladas.

Consecuencias

  • Desacopla interface e implementación: una implementación no es limitada permanentemente a una interface. Le es posible a un objeto cambiar su implementación en tiempo de ejecución. Este desacoplamiento fomenta las capas, que pueden conducir a un sistema mejor estructurado.
  • La parte de alto nivel de un sistema sólo tiene que conocer Abstraction e Implementor.
  • Mejora la extensibilidad: se puede extender las jerarquías de Abstraction e Implementor independientemente.
  • Esconde los detalles de la implementación a los clientes

Diagrama UML:

Abstraction: define una interface abstracta. Mantiene una referencia a un objeto de tipo Implementor.
RefinedAbstraction: extiende la interface definida por Abstraction
Implementor: define la interface para la implementación de clases. Esta interface no se tiene que corresponder exactamente con la interface de Abstraction; de hecho, las dos interfaces pueden ser bastante diferentes entre sí. Típicamente la interface Implementor provee sólo operaciones primitivas, y Abstraction define operaciones de alto nivel basadas en estas primitivas.
ImplementadorConcreto: implementa la interface de Implementor y define su implementación concreta.

Abstraction emite los pedidos de los clientes a su objeto Implementor. El cliente no tiene que conocer los detalles de la implementación.

Ejemplo:
Imaginemos que necesitamos dibujar distintas figuras geométricas (círculo, rectángulo, etc). Cada figura geométrica puede ser dibujada con diferentes tipos de líneas (normal, punteada, etc).
Vamos a combinar las clases de tal forma que tanto un Círculo como un Rectángulo sepan como dibujarse de manera abstracta, pero le dejaremos la implementación a un especialista en dibujo.
Esquema de clases:



Esquema del proyecto:

Partimos de las Clases especialistas en dibujar:
Clase Dibujo:
->

Clase DibujoNormal:
->


Clases DibujoPunteado:
->


Definimos la clase Forma, de donde heredan las de Circulo y Rectangulo.
Las clases Círculo y  Rectángulo sabrán como dibujarse pero de manera abstracta.
- Clase Forma
->

-Clase Circulo
->

-Clase Rectangulo
->

Programa principal:
->

Pantallazo de la aplicación ejecutándose:



Enlace de descarga del código fuente: enlace a box

fuente:
http://migranitodejava.blogspot.com.es/search/label/Bridge



lunes, 2 de diciembre de 2013

Patrón Proxy: Ejemplo Realizar un control de acceso a recursos y/o partes del programa


Patrón Proxy

Ejemplo Realizar un control de acceso a recursos y/o partes del programa




El patrón Proxy se utiliza como intermediario para acceder a un objeto, permitiendo controlar el acceso a él. Para ello obliga que las llamadas a un objeto ocurran indirectamente a través de un objeto proxy, que actúa como un sustituto del objeto original, delegando luego las llamadas a los métodos de los objetos respectivos.

Este patrón se debe utilizar cuando:
  • Se necesite retrasar el coste de crear e inicializar un objeto hasta que es realmente necesario.
  • Se necesita una referencia a un objeto más flexible o sofisticada que un puntero.
Algunas situaciones comunes de aplicación son:
  • Proxy remoto: representa un objeto en otro espacio de direcciones. Esto quiere decir que el proxy será utilizado de manera tal que la conexión con el objeto remoto se realice de forma controlada sin saturar el servidor.
  • Proxy virtual: crea objetos costosos por encargo. Cuando se utiliza un software no siempre se cargan todas las opciones por default. Muchas veces se habilitan ciertos módulos sólo cuando el usuario decide utilizarlos.
  • Proxy de protección: controla el acceso a un objeto. Controla derechos de acceso diferentes.
  • Referencia inteligente: sustituto de un puntero que lleva a cabo operaciones adicionales cuando se accede a un objeto (ej. contar el número de referencias, cargar un objeto persistente en memoria, bloquear el objeto para impedir acceso concurrente, ...).
El patrón Proxy es muy versátil. Puede ser utilizado en infinitas ocasiones y se le puede otorgar varios usos. Tiene una gran ventaja y es que no obliga al desarrollador a crear demasiada estructura para realizar este patrón, sino que es una forma estándar de acceder a una clase que potencialmente puede ser conflictiva. Por otro lado, no ayuda al desarrollador a crear un algoritmo, sino que el desarrollador tiene que hacer toda la lógica.
Por estas razones, es un patrón donde no siempre se puede saber a priori cuando utilizarlo.
Esquema UML:

Subject: interfaz o clase abstracta que proporciona un acceso común al objeto real y su representante (proxy).
Proxy: mantiene una referencia al objeto real. Controla la creación y acceso a las operaciones del objeto real.
RealSubject: define el objeto real representado por el Proxy.
Cliente: solicita el servicio a través del Proxy y es éste quién se comunica con el RealSubject.


Esquema de Proxy usado para control de acceso a un recurso


Ejemplo: Control De Acceso A Recursos/Partes del Propgrama
Para enseñar como  se  usaría este patrón para realizar un control de acceso a distintos recursos, y ademas llevar un contador de cuantos intentos de accesos se han realizado y cuantos han accedido. (lo usaremos como  Proxy de protección  y Referencia inteligente )
 Tenemos 3 tipos de usuarios y dos departamentos (recursos), que tienen su acceso permitido segun este cuadro:

Esquema de interacción entre clases:



Este sería el proyeto en Gambas3:

Recursos:
Clase Irecurso:
->

Clase RecursoAlmacen:
->

Clase RecursoContabilidad:
->

Control mediante Proxy de los Recursos:
Clase RecursoProxy:
->

En esta clase, he definido la variable "hnivel" para el recurso, que con su valor se comprobará si puede acceder o no el usuario.


Clase RecursoAlmacenProxy:
->

Clase RecursoContabilidadProxy:
->

Clase Usuario:
->

Los usuarios, tienen una propiedad "nivelAcceso" que les  indica cual será su  nivel de acceso.
Es muy sencillo, gestionar el acceso a los usuarios a los distintos recursos, simplemente cambiando el valor de esta propiedad.


Programa Principal:
->



Ejecutando la aplicación en el IDE de Gambas3:

Podéis ver, como en la consola se va mostrando información de los intentos accesos de los usuarios .
 Estos datos se pueden guardar fácilmente en un archivo, no lo he querido añadir, para simplificar al máximo el ejemplo.


Enlace de descarga del ejemplo: enlace box

Fuentes:
http://arantxa.ii.uam.es/~eguerra/docencia/0809/12%20Proxy.pdf
http://migranitodejava.blogspot.com.es/search/label/Proxy

Liga de Fútbol. Jornada 15 análisis de minuto / gol. Resultados y Estadísticas



Resultados y estadísticas de la jornada nº 15 de la liga de fútbol española:



Análisis de frecuencia de goles por periodo de minutos:




En esta jornada, no ha habido goles entre los periodos:

  • 0 a 5
  • 15 a 25

A destacar el gran numero de goles producidos desde el minuto 85 al final del partido: 5 goles


Siendo estos goles decisivos en los 3 de los 5 partidos producidos:
    Villarreal - Malaga (1-1)
    Real Betis- Rayo (2-2)
    Granada- Sevilla FC (1-2)


Nota:
Si alguien desea la hoja de cálculo con los datos de la estadisticas de todas las jornadas de esta temporada, que me envie un correo y por un pequeño donativo, se la reenvío por correo electrónico.
Este es mi correo:


Saludos



Fuente de la información de resultados: http://www.superdeporte.es/