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:



domingo, 29 de diciembre de 2013

La potencia del C en Gambas


La potencia del C en Gambas

Gambas3, como Python y Java, es un lenguaje interpretado. Podemos crear  codebyte (.gambas), que son más rápidos que cuando se ejecutan en el IDE de Gambas, pero ¿que ocurre cuando necesitamos potencia de cálculo?
¿que hacer entonces?.


Gambas permite usar librerías externas realizadas en C, para aprovechar la velocidad/rendimiento  de este lenguaje en nuestros programas.

Os dejo aquí un simple ejemplo de realizar librerías en C, compilarlas y usarlas en un programa de Gambas.
Vamos a crear 3 funciones.
a) sumar: esta función recibe dos números y devuelve su suma (usando return)
b) duplica: recibe un vector y lo multiplica por 2, devolviendo el vector (sin usar return)
c) ValorarTablero: recibe una matrix cuadrada de N dimension, y devuelve la suma de sus componentes (usando return)

1º. definimos las cabeceras de las funciones que vamos a usar: archivo test.h
->

 2º definimos las funciones: test.c
->


3º Compilamos y creamos la libreria:
$ gcc -Wl,-soname=test.so -o test.so -std=c99 -fpic -shared -shared-libgcc test.c

4º Enviamos la libreria al directorio /usr/lib y creamos los enlaces (tenemos que ser root):
# cp test.so /usr/lib/test.so
# ldconfig /usr/lib


5º Ahora en Gambas, creamos un módulo, donde definimos las funciones externas:
->

6º Usamos las funciones en el programa:
->

He hecho un pequeño ejemplo, para comparar como mejora el uso de las funciones en C con las mismas funciones hechas en Gambas.

Este es el resultado del perfilado del programa (cuanto tarda cada función):
Donde se aprecia mayor mejora es en la funcion valorarTableroGambas y valorarTablero, ya que para hacer lo mismo, la función valorartablero solo tarda 283.209 (usa la libreria en C) y la de valorarTableroGambas tarda 56.053.209 (codigo nativo en Gambas3).

Descarga del completo ejemplo: https://app.box.com/s/fjvzuqm3921j25ifgb0h




Ejemplo de uso real: Programa de Cálculo de Estructuras
El proyecto Estrud3D (enlace: http://forge.gambas-es.org/projects/estru3d y http://www.gambas-es.org/viewtopic.php?f=5&t=3470&highlight=estru3d) es un programa realizado por Martín P. Cristiá inicialmente programado en Visual Basic y C,  que se está portando a Gambas. Para este programa es fundamental realizar los cálculos la estructura lo más rápido posible, y para ello, se usan librerías escritas y compiladas en  C que realizan "el trabajo duro" del cálculo, siendo usado Gambas, para definir la estructura (dimensiones, nodos, barras, tipos de materiales que se usa) y obtener los resultados (gráficos de esfuerzos e informes de todo tipo).




Fuentes:
http://www.gambas-es.org/viewtopic.php?f=4&p=19790#p19790
http://gambaswiki.org/wiki/lang/extdecl?l=es
http://gambaswiki.org/wiki/howto/extern?l=es

martes, 24 de diciembre de 2013

Analisis de Cuotas de Apuestas de la jornada 17 de la Liga futbol



Análisis de Cuotas de Apuestas

 de la jornada 17 de la Liga fútbol




Este fin de semana, he hecho un pequeño ejercicio sobre las cuotas de apuestas en los partidos de fútbol de la liga española,  que se ofertaban antes de los partidos y los resultados definitivos de ellos, para ver si había muchos o pocos aciertos, y si las cuotas son buen referente a la hora de apostar.
Jornada 17º: Cuotas de apuesta el pasado 20/12/2013


Jornada 17º: Resultado de las jornadas dias 20,21 y 22 de diciembre de 2013

¿que hubiese pasado si hubiéramos aportado un euro a cada encuentro que consideramos  con mayor probabilidad de ganar según las cuotas de apuestas?
En principio después de estudiar las cuotas, apriori, no apostaría a encuentros muy igualados en las cuotas. En este caso Elche - Malaga y Granada - Real Sociedad, por lo tanto solo apostaría a 8 de los encuentros.

Bien, el resultado de estas apuestas seria el siguiente:



Esto quiere decir que hubiéramos acertado en solo 5 encuentros (todos ellos con cuotas de menos de 2.00 para el vencedor), con un beneficio bruto de 7,52 euros (1.17+1.8+1.44+1.5+1.61), con un coste de 8 euros, quedándonos un beneficio neto en -0.48 euros (perdemos dinero).

Sabiendo que estás perdidas pueden ser mayores ya hubo encuentros que se decidieron en los últimos minutos (Valencia - Real Madrid) y por lo tanto las pérdidas hubieran sido mayores,  esta claro que este método, en esta jornada, no es muy bueno...

Os dejo aquí una gráfica de como evolucionaron las cuotas de apuestas en el partido Valencia - Real Madrid durante el encuentro, que estuvo muy movido en lo que se refiere al marcador:


Evolución de cuotas de apuestas durante el partido Valencia - Real Madrid
¿Y si hubiésemos apostados solo a los encuentros con menos de 1.50 de cuota? 
¿estaríamos más seguros de ganar algo?
Solo dos partidos se daban a esa apuesta:
Atletico de Madrid - Levante (1.17 / 6.5 / 17.00)
y Getafe - Barcelona ( 7 / 4.33 / 1.44)
Estas apuestas si acertaron completamente, con un beneficio bruto de: 2.61 y coste de 2, beneficio neto: +0.61 euros.
Pero el riesgos de estas apuestas, es que no hay margen de error, y si hay un mal resultado, las pérdidas son mayores. Por ejemplo hay que recordar que el Barcelona tuvo que remontar un 2 - 0 y que el Atletico de Madrid, estuvo igualado hasta el minuto 77, donde metió el gol que le dio la victoria por un ajustado 3-2.


Saludos.


Nota:

La única forma de no perder dinero en las apuestas es.... no apostar





lunes, 23 de diciembre de 2013

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





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






Resultado 17º jornada Liga de Fútbol de España 2013/2014


Minuto Gol 
En 3 encuentros de los 10 partidos celebrados se metieron goles durante los minutos iniciales (del 0 al 5).

Del total de goles metidos (37), en la primera parte se metieron 21 y en la segunda 16.





A destacar el gran número de vitorias de equipos visitantes 6/10, un solo empate 1/10 y 3 victorias locales 3/10.


Clasificación una vez terminada la jornada 17:



Los 3 equipos primeros de la liga ganaron en esta jornada, pero de distinta forma:
- El Barcelona fue capaz de remontar un 2-0, juganto contra el Getafe, quedando al final en un resultado 2-5, a favor del Barcelona.


- El Athletico de Madrid, también remontó un tempranero gol del Levante (en el minuto 1) , siendo un partido muy disputado
At. Madrid -  Levante
    0           -      1  'minuto 1
    1           -      1   'minuto  30
    2           -      1   'minuto  47
    2           -      2   'minuto  56
    3           -      2   'minuto  77


- El encuentro del Real Madrid contra el Valencia, tambien fué muy disputado, resolviendose también en los minutos finales  quedando  al final en un 3-2
Valencia - Real Madrid
     0        -       1         'minuto 28
     1        -       1         'minuto 34
     2        -       1         'minuto 40
     2        -       2         'minuto 62
     2        -       3         'minuto 82






Fuente: http://www.superdeporte.es/deportes/futbol/primera-division/clasificacion-liga.html


viernes, 20 de diciembre de 2013

Patrón Interpreter. Ejemplo Evaluador de Expresiones Notación Polaca Inversa



Patrón Interpreter:

 Ejemplo Evaluador de Expresiones en Notación Polaca Inversa



Este patrón es un caso especial de “Composite”, aplicado al parseo. El parseo transforma una entrada de texto en una estructura de datos (usualmente un árbol) que es apropiada para ser procesada. Generalmente los parseadores primero identifican los símbolos de la entrada y luego construyen el árbol de parseo para esos símbolos. 
Dado un lenguaje, el patrón “Interpreter” define una representación para su gramática y un intérprete para su lenguaje. Se emplea para definir un lenguaje para definir expresiones regulares que representen cadenas a buscar dentro de otras cadenas. Utiliza una clase para representar cada regla gramática.



En el mundo real, los lenguajes están formados por expresiones no terminales que contienen construcciones terminales dentro. Encontramos el patrón “Interpreter” a la hora de analizar esas expresiones.
Este patrón se debe utilizar cuando hay un lenguaje que interpretar y se puede interpretar sus palabras como árboles sintácticos abstractos. Para ello, la gramática debe ser simple.

Ejemplo de árbol sintáctico abstracto:
Árbol de sintaxis abstracta para el siguiente código del algoritmo de Euclides:
while b ≠ 0
if a > b
a := a − b
else
b := b − a
return a
Esquema UML del patrón:

AbstractExpression: declara una interfaz para la ejecución de una operación.
TerminalExpression: implementa una operación asociada con los símbolos terminales de la gramática
NonterminalExpression: implementa una operación de interpretación asociada con los símbolos no terminales de la gramática.
Context: contiene información global para el interprete.
Client: construye un árbol sintáctico abstracto que representa una sentencia particular en el lenguaje que la gramática define. El cliente construye una expresión

Ventajas:

  • Facilidad para cambiar la gramática, mediante herencia, dado que las diferentes reglas se representan con objetos.
  • Facilidad para implementar la gramática, dado que las implementaciones de las clases nodo del árbol sintáctico son similares, pudiendo usarse para ello generadores automáticos de código.
  • Facilidad para introducir nuevas formas de “interpretar” las expresiones en la gramática.


Desventajas:

  • Limitación en el tipo de gramática: si no es simple, es casi imposible implementarlo.
  • No es conveniente utilizarlo si la eficiencia es un punto clave.


Ejemplo:  Evaluador de Expresiones. Ejemplo de la wikipedia ampliado
Se trata de evaluar expresiones matemáticas en notación polaca  inversa ( wikipedia  ). Vamos a tener encuenta las operaciones suma, resta, multiplicación y division. Ademas, si se produce algún error al analizar la expresión,  devolverá información sobre el, para que el usuario pueda modificar la expresion.
Proyecto:


Clase Expresion:
Va ha ser el interfase usado por las operaciones y numeros
->

Clase TerminalExpresion_Plus (operador suma)
->

Clase TerminalExpresion_Minus (operador resta )
->

Clase TerminalExpresion_Multi  (operador multiplicacion)
->
Clase TerminalExpresion _Div (operador  divisor)
->

Clase TerminalExpresion_Number (numero decimal)
->

Clase Parser:
Se encarga de recibir la expresion, construir el arbol y evaluar dicho arbol retornando informacion del valor o error producido
->

Clase Fmain: Programa principal
Formulario en pantalla, que rellenar el textbox con una expresion y pulsar el boton "Evaluar", se encarga de mostrar la información.
->

Captura de la aplicación ejecutandose:





Enlace de Descarga: enlace



Fuentes:
http://es.wikipedia.org/wiki/Interpreter_(patr%C3%B3n_de_dise%C3%B1o)
http://www.godtic.com/blog/2012/11/15/patrones-de-diseno-gof/
http://migranitodejava.blogspot.com.es/search/label/Interpreter
http://www.oodesign.com/interpreter-pattern.html
http://ldc.usb.ve/~mgoncalves/IS2/sd07/grupo6.pdf
http://www.blackwasp.co.uk/Interpreter.aspx
http://sourcemaking.com/design_patterns/interpreter/cpp/1

miércoles, 18 de diciembre de 2013

Como contar las lineas de un proyecto



Como contar las lineas de un proyecto

¿te gustaría saber cuantas lineas de código tiene tu proyecto?
Pues ejecutando la siguiente linea de comando en el directorio de tu proyecto lo puedes saber:

$ find . -name '*.class' -o -name '*.module' | xargs wc -l


Lo que estamos haciendo es buscar los archivos *.class y *.module, mostrar las lineas que tienen y al final nos sale un total.


Ejemplo de salida:
Quiero saber cuantas lineas tiene el proyecto "PatronDecorador", ( que esta en la ruta ~/Documentos/PatronDecorador ):

~/Documentos/PatronDecorador$ find . -name '*.class' -o -name '*.module' | xargs wc -l
  29 ./.src/Hielo.class
  15 ./.src/DarkRoast.class
  15 ./.src/Decaf.class
  28 ./.src/Canela.class
  65 ./.src/FMain.class
  15 ./.src/Espresso.class
  10 ./.src/CondimentoDecorador.class
  27 ./.src/Chocolate.class
  15 ./.src/HouseBlend.class
  21 ./.src/Bebida.class
  29 ./.src/Leche.class
  29 ./.src/LecheCondensada.class
 298 total

¿fácil verdad?

 Fuente:
Jussi Lahtinen, de las listas de gambas [Gambas-user]  lists.sourceforge.net

Ploticus: herramienta para hacer gráficas

Ploticus: 

Herramienta para hacer gráficas 

Seguramente muchos conoceréis a gnu plot ( http://www.gnuplot.info/ ), como herramienta libre  para realizar gráficas de todo tipo. Pero buscando por internet y foros, encontré a Ploticus, que es más simple de usar, con bastantes tipo de gráficas y nos puede servir también.



Podéis ver en su galería de ejemplos, todo tipo de gráficos y sus códigos fuentes de como hacerlos:




Ejemplo de uso: Gráfica de Resultados De Alumnos
Yo me he hecho mi propia gráfica con datos a partir de un ejemplo (http://ploticus.sourceforge.net/gallery/students.htm 

Nota:
En azul pongo los datos que he modificado del ejemplo original.

Código fuente: (archivo examenes.txt,  se describe el tipo de gráfica y lleva incluido los datos)
#set COLORLIST = red,yellow,blue,green,orange,pink,black,white
// added scg 8/4/04.. allows spaces to be represented using underscores..
#proc settings
  encodenames: yes
#proc page
pagesize: 7 4
#if @DEVICE in gif,png
  scale: 1
#endif
#proc getdata
fieldnameheader: yes
#intrailer // get data from end of this file
#endproc   //necessary in order to do the following computation involving NRECORDS
// compute XMAX (number of records+1 for bar graphs)
#set XMAX = $arith(@NRECORDS+1)
// set up area
#proc areadef
title: Grafica de Resultados
rectangle: 1 1 6 3
xrange: 0 @XMAX
yrange: 0 100   // no way currently to do autorange on variable # of fields
xaxis.stubs: datafield=1
xaxis.label: Estudiantes
yaxis.stubs: inc 10
yaxis.label: Puntuacion
// initialize loop variables
#set I = 3
#set NCLUST = $arith(@NFIELDS-2)
// start loop
#loop
  // set vars for this iteration
  #set FNAME = $fieldname(@I)   // this function is new
  #set ICLUST = $arith(@I-2)
  #set COLOR = $nmember(@ICLUST,@COLORLIST)
  // do bars
  #proc bars
  lenfield: @I
  cluster: @ICLUST / @NCLUST
  color: @COLOR
#hideund
  legendlabel: @FNAME
#showund
  barwidth: 0.1
  // update I and see if time to stop..
  #set I = $arith(@I+1)
  #if @I > @NFIELDS
    #break
  #endif
#endloop
// slap on the legend
#proc legend
format: singleline
location: 1 0.5
sep: 0.5
// here's the data
#proc trailer
data:
id group Aprobados Suspensos Matricula IndeExam_d
Julio N 44 45 71 89
Eva N 56 44 54 36
Jorge B 46 63 28 87
Isa B 42 28 39 49
Manuel B 52 74 84 66

Para crear la imagen, en la terminal escribimos:

  • $ploticus -png examenes.txt


Y se crea un archivo de imagen tipo .png con el nombre: out.png



Saludos


Fuente: http://ploticus.sourceforge.net/doc/welcome.html

martes, 17 de diciembre de 2013

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

Jornada 16



Análisis de frecuencia de goles por periodo de minutos (5 minutos)



Análisis de frecuencia de goles por periodo de minutos (15 minutos):


También podemos ver las victorias de locales / visitantes o empates.


A destacar el Real Madrid, que iba perdiendo 2-0 contra el Osasuna, y en el minuto 43 se quedo con un jugador menos (expulsión de Sergio Ramos), y fue capaz de empatar  el partido, llegando al resultado de 2-2

El Betis después de terminar el primer tiempo empatado 1-1 frente el Real Sociedad, sucumbió, en la segunda parte, perdiendo finalmente el partido por un abultado 5-1.


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/



domingo, 15 de diciembre de 2013

Patrón Singleton: Ejemplo: Creando Log


Patrón Singleton:

 Ejemplo: creando log



El Patrón Singleton también se conoce como Instancia única, su objetivo es restringir la creación de objetos  pertenecientes a una clase, de modo que solo se tenga una única instancia de la clase para toda la aplicación, garantizando así un punto de acceso global al objeto creado.
Como observareis, en Gambas3, ya tenemos implementado ese patrón con el uso de los módulos (module).
Incluso, si lo queremos aplicar a una clase, usaríamos la orden Create Static, para convertirla en clase tipo Singleton.

Este patrón es  muy útil cuando necesitamos crear un clase común y global para todo el sistema.

Ejemplo:
Vamos a crear una aplicación que haga un log (un registro) de las acciones de los usuarios en los formularios (pulsar botones). Para ello usaremos una clase singleton (ClaseLogSingleton) que será la encargada de almacenar lo que hagan los usuarios.

Proyecto

Clase ClaseLogSingleton:


Clase PersonaVo:


Clase Main:


Clase (formulario) VentanaPrincipal


Clase (formulario) VentanaEventos:


Clase (formulario) VentanaLog:


Ejemplo de la aplicación:

enlace de descarga del ejemplo completo: enlace de descarga

Fuentes:
http://codejavu.blogspot.com.es/2013/07/ejemplo-patron-singleton.html
Documentación: http://gambasdoc.org/help/lang/createstatic?es&v3

martes, 10 de diciembre de 2013

Patrón Iterator: Ejemplo: Recorrer una lista de diversas formas

Patrón Iterator

 Ejemplo: 

Recorrer una lista de diversas formas




El objetivo principal de este patrón es la manipulación de datos mediante los indices de una estructura ya sea estática (Arrays) o dinámica (Listas). la condición de este patrón es que el acceso debe de ser secuencial mente, a continuación se mencionan algunas de las operaciones que puede contener una clase iterador:

      -Recorridos uno a uno hacia delante.
      -Recorridos uno a uno hacia atras.
      -Recorridos en saltos.
      -Aplicación de Filtros.
      -Aplicación de operaciones.
      -Consulta de un dato por su posición.
      -etc..





Ejemplo:
Vamos a tener una lista (array) de cadenas de texto, y la vamos a mostrarla de diversas maneras:
1) Del elemento 0 hasta el final
2) Desde el final hasta el elemento 0
3) Solo los elementos que ocupen posiciones pares en el array
4) Solo los elementos, cuyas cadenas  contentan la letra "m"

Proyecto:
Clase: Iterador


Clase IteradorHaciaAdelante:


Clase IteradorHaciaAtras:


Clase IteradorPares


Clase IteradorContenidoCadena


Programa principal:


Programa ejecutándose:



Enlace del ejemplo:enlace a box


Fuentes:
http://ayudajoe.blogspot.com.es/2012/03/patron-de-diseno-iterador-java.html
http://jarroba.com/arraylist-en-java-ejemplos/
http://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=589:ejercicio-y-ejemplo-resuelto-interface-iterable-y-metodo-iterator-java-cu00912c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

http://jahepi.blogspot.com.es/2007/09/patrn-iterador-actionscript-30.html -> varios tipos de iteradores








domingo, 8 de diciembre de 2013

Patrón Memento: Ejemplo: Marcador de Futbol

Patrón Memento

Ejemplo: Marcador de Futbol



El patrón de comportamiento Memento, un modelo para capturar (parte o todo) y externalizar el estado interno de un objeto para restaurarlo más tarde sin violar el encapsulamiento. Puede ser usado  en combinación con los Patrones Command e Iterator. 
El patrón Memento es aplicable cuando: 
  • Todo o parte del estado de un objeto debe ser guardado para ser restaurado más tarde. 
  • Cuando una interfaz directa para obtener el estado de un objeto exponga detalles de su  implementación


Participantes 
· Memento.
  • - Almacena el estado interno de un objeto Originator. El Memento puede almacenar mucho o parte del estado interno de Originator. 
  • - Tiene dos interfaces. Una para Caretaker, que le permite manipular el Memento  únicamente para pasarlo a otros objetos. La otra interfaz sirve para que Originator pueda almacenar/restaurar su estado interno, sólo Originator puede acceder a esta interfaz, al menos en teoría. 
 · Originator.
  • - Originator crea un objeto Memento conteniendo una fotografía de su estado interno. 
  • - Originator usa a Memento para restaurar su estado interno. 

· Caretaker
  • - Es responsable por mantener a salvo a Memento. 
  • - No opera o examina el contenido de Memento

 Patrones relacionados
· Command: Puede usar “Mementos” para guardar el estado de operaciones restaurables.
· Iterator: “Mementos” puede ser usado con Iterator para buscar colecciones para estados específicos.

Ejemplo: Marcador de Fútbol
Se trata de realizar un marcador de fútbol, donde deberá aparecer:
-Resultado del 1º tiempo
-Resultado del 2º tiempo
-Resultado Final
-Nombre de Jugadores y minuto de cuando marca gol según el equipo.
Además se podrá deshacer y rehacer la introducción de resultados y jugadores.

Clases en el Proyecto:

Clase State:
Esta clase se encargará de almacenar los datos que nos interese del estado.

Clase Memento:


Clase Caretaker:


Programa Principal:





Captura de pantalla del programa en ejecucion:

Enlace de descarga: enlace a box

Enlaces:
http://www.slideshare.net/An3s/patron-memento
http://migranitodejava.blogspot.com.es/2011/06/memento.html
http://www.freewebz.com/amanecer/personal/papers/paper.memento.pdf


viernes, 6 de diciembre de 2013

Patrón Adaptador: Ejemplo tipos de motor

 Patrón Adaptador: 

Ejemplo tipos de motor

Este patrón permite la cooperación entre clases para extender sus funcionalidades a clases de diferentes tipos, que no pueden usarlas por mecanismos comunes como la herencia. 
Permite trabajar juntas a dos clases con interfaces incompatibles:
 Convierte la interfaz de una clase en otra interfaz que el cliente espera. Esto permite a las clases trabajar juntas, lo que de otra manera no podrían hacerlo debido a sus interfaces incompatibles

Este patrón se debe utilizar cuando:
  • Se quiere utilizar una clase que llame a un método a través de una interface, pero se busca utilizarlo con una clase que no implementa ese interface.
  • Se busca determinar dinámicamente que métodos de otros objetos llama un objeto.
  • No se quiere que el objeto llamado tenga conocimientos de la otra clase de objetos.
Diagrama UML patrón Adapter (Adaptador)

Target: define la interfaz específica del dominio que Cliente usa.
Client: colabora con la conformación de objetos para la interfaz Target.
Adaptee: define una interfaz existente que necesita adaptarse
Adapter: adapta la interfaz de Adaptee a la interfaz Target
El Cliente llama a las operaciones sobre una instancia Adapter. De hecho, el adaptador llama a las operaciones de Adaptee que llevan a cabo el pedido.



Ejemplo: Diversos tipos de motores
Queremos compartir funcionalidades (encender, acelerar y apagar), mediante la herencia creando una clase Motor,  entre estos tipos de motores: MotorComun, MotorEcologico y MotorElectrico.
Pero el MotorElectrico, se comporta de una manera muy diferente que los otros.
Para poderlo usar de la misma forma que los demás (con los mismos métodos), vamos a usar una clase adaptadora, que sirva de puente entre la clase padre "Motor" y la clase MotorElectrico, y que se encargue de traducir los métodos de la clase MotorElectrico a los métodos de clase "Motor" . Así el cliente podrá usar  los motores sin difirenciarlos.

Esquema del ejemplo:
http://codejavu.blogspot.com.es/2013/08/ejemplo-patron-adapter.html




Esquema del proyecto:

Clase Motor
->

Clase MotorComun
->

Clase MotorEconomico
->

Clase MotorElectrico
->

Clase MotorElectricoAdapter
Con esta clase, conseguimos adaptar el uso de la clase MotorElectrico con los métodos de la clase Motor
->

Clase Aplicacion:
->

Programa principal:
->

Resultado de la aplicación:

Enlace de descarga ejemplo: https://app.box.com/s/qflrvc7xtmalktjn4dge

Fuentes:
http://migranitodejava.blogspot.com.es/2011/06/adapter.html

http://codejavu.blogspot.com.es/2013/08/ejemplo-patron-adapter.html

http://pinbit.blogspot.com.es/2008/09/patrones-estructurales-i-patrn-adapter.html

jueves, 5 de diciembre de 2013

Patrón Delegation. Ejemplo: Empleado de Tienda



Patrón  Delegation
 Ejemplo: Empleado de Tienda


Se trata de una técnica en la que un objeto permite mostrar cierto método al exterior, pero internamente la implementación o las acciones desencadenadas por el llamado de este método se delega a otro objeto de una clase distinta pero asociado. La delegación es utilizada como un mecanismo para centralizar en torno a un solo objeto  los compartimentos (métodos) de varios objetos donde dichos comportamientos mantienen cierto nivel de relación.


Utilidad:

  • Cuando se quiere extender y reutilizar la funcionalidad de una clase sin utilizar la herencia.
  • Alternativa a la herencia múltiple, en lenguajes que no la soportan.

Ventajas:

  •  Cuando una clase que hereda de otra quiere ocultar algunos de los métodos heredados
  •  Compartir código que NO se puede heredar

Con herencia Múltiple y Delegación: simulándola con herencia simple y composición
Nota:
Diferencia entre Herencia y Composición: 

  • Herencia:  Debería modelar una relación es-un entre la clase derivada y la clase base.
  • Composición: La relación que modela es un tiene-un y, en general, la composición debe preferirse a la herencia.


Ejemplo:
Tenemos la clase EmpleadoTienda, que es a su vez Persona y Empleado. Podemos representarlo mediante herencia múltiple y también, usando el patrón delegation, con herencia simple :



En gambas3, se haría usando el patrón delegation.

Proyecto:


Clase Trabajador:
->

Clase Persona
->

Clase  EmpleadoDeTienda
Esta clase va a ser herencia de Persona y ademas está compuesta por una objeto de la clase Trabajador. En ella hemos definidos los métodos que llamarán a los métodos de la clase trabajador.

Programa Principal:
->



Pantallazo de la aplicación:



Enlace de descarga del ejemplo: enlace


Fuentes:
http://codejavu.blogspot.com.es/2013/06/ejemplo-patron-delegate.html
 http://siul02.si.ehu.es/~alfredo/iso/06Patrones.pdf
http://es.wikipedia.org/wiki/C%2B%2B#Herencia_simple
http://ingeniods.wordpress.com/2013/09/11/delegation-patron-de-diseno/