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:



Mostrando entradas con la etiqueta poo. Mostrar todas las entradas
Mostrando entradas con la etiqueta poo. Mostrar todas las entradas

miércoles, 25 de junio de 2014

Teoría de la Programación Orientada a Objetos


Teoría de la Programación Orientada a Objetos


Leyendo las entradas realizadas por Miguel Ángel Álvarez en http://www.desarrolloweb.com/manuales/teoria-programacion-orientada-objetos.html, he realizado un documento con ellas añadiendo información de como aplicarlo a gambas3, creando un pequeño pdf de 28 páginas que lo podeis descargar en lulu.com, de forma gratuita.





El Indice del documento:

  1. Qué es la programación orientada a objetos
  2. Operador Punto usado en propiedades y métodos
  3. Concepto de herencia en la programación orientada a objetos: un mecanismo básico por el que las clases hijas heredan el código de las clases padre.
    1. Uso Patron “Delegation”
  4. Qué es el polimorfismo en la Programación Orientada a Objetos, el motivo de su existencia y cómo implementar polimorfismo en clases y objetos.
  5. Concepto de abstracción en el paradigma de la Programación Orientada a Objetos y situaciones en las que se puede y se debe aplicar.

Anexo 1: Para Gambas3:  Param y uso en el constructor _new()
Anexo 2: Polimorfismo y Herencia Múltiple: Patrón Adaptador
Anexo 3: Operar con determinados tipos de objetos almacenado  en un array de una clase.
Anexo 4: Super

Espero que os resulte útil.

Descargar


Enlace en google drive: enlace

Saludos


viernes, 14 de febrero de 2014

Como eliminar los Select Case ( switch ) usando POO y el patrón Strategy.

Como eliminar los Select Case ( switch ) usando POO y el patrón Strategy.

La orden Select Case (o Switch en otros lenguajes de programación), tiene el inconveniente de que cada vez que tengamos que añadir más casos, supone que tengamos que modificar el código ya escrito anteriormente.

Aunque ya lo he comentado en otras entradas (ver referencia), voy a hacer un ejemplo simple para que veais el mecanismo de como se sustituye usando clases y el patrón Strategy:

Vamos a partir de este simple ejemplo:

->

El bucle Select  Case lo vamos a sustituir por la siguiente estructura de clases:



Estructura del proyecto:



Código de las Clases:
Clase Switch:
->

Fijaos en la opcion "add" y "remove" que nos van a permitir añadir o quitar opciones.

Clase Interface:
->

Clase Opcion1:
->

Las demas opciones, son muy parecidas, vease el codigo fuente completo.

Programa Principal: Mmain
->


Bueno, y pensareis ¿es mucho trabajo y más código para hacer lo mismo? ¿que ventajas obtengo?

La primera ventaja que teneis es que el código es fácilmente ampliable, ya que simplemente se le vais que tener que nuevas clases "opciones".
Y otra muy importante, durante la ejecución del programa, podemos añadir o quitar dinamicamente opciones, cosas que es imposible hacerlo usando un Select Case.

Próximamente os enseñaré un ejemplo de esto último que os comento "añadir o quitar dinámicamente en ejecución, opciones".

Codigo fuente completo: alojada en Box.Com

Entradas Relacionadas:
http://jsbsan.blogspot.com.es/2014/01/combinar-patrones-de-diseno-ejemplo-de.html

domingo, 4 de agosto de 2013

Modelo Vista Controlador (MVC): ejemplos usando base de datos sqlite3 (2º parte: mostrando en un gridviews)

Modelo Vista Controlador (MVC): ejemplos usando base de datos sqlite3  (2º parte: mostrando en un gridviews))



Bueno, como os comenté en el anterior post (http://jsbsan.blogspot.com.es/2013/08/modelo-vista-controlador-mvc-ejemplos.html ), le he añadido un gridviews , para mostrar todos los datos, y por supuesto sigo siguiendo el patrón de MVC para la ampliación de la aplicación:

Lo que se le ha añadido ha sido lo siguiente:
En la clase PersonaDAO, una nueva funcion:

Public Function MostrarPersonas() As Result
Dim resultadoConsulta As Result
Dim conectar As New Conexion
Dim sqlstring As String
conectar.Conexion()
SQLString = "Select * from dato"
Try resultadoConsulta = conectar.hconn.Exec(SqlString)
If Error Then Message.Info("No se ha podido obtener el listado de personas. Error: " & Error.Text)
Return resultadoConsulta
End

Que devuelve el resultado de la consulta "Select * from dato". Nota: la base de datos se llama "Personas" , pero la tabla se llama "dato"
En la clase Logica, otra función que haria la validación y llamaria a la funcion de PersonaDao.MostrarPersonas, devolviendo un Result


Public Function validadMostrarPersonas() As Result
Dim miPersonaDao As New PersonaDao
Return miPersonaDao.MostrarPersonas()
End
En la clase Coordinador, que usa la clase lógica para que haga la validación y devuelva un resul



Public Function MostrarPersonas() As Result
Return milogica.validadMostrarPersonas()
End

Y ya por ultimo, en el formulario principal, he definido el gridview, usado el evento DATA para rellenar y colorear las filas, y que cada vez que se Registre o Administre la base de datos, se actualice el gridview.



'--------------------------------formatero del gridview---------------------------------
Public Function gridFormatearColumnas(grid As GridView) As Gridview
With grid
.header = 3
.rows.count = 0
.columns.count = 5
.Columns[0].title = "id"
.Columns[0].width = 80
.Columns[1].title = "nombre"
.Columns[1].width = 80
.Columns[2].title = "edad"
.Columns[2].width = 80
.Columns[3].title = "profesion"
.Columns[3].width = 80
.Columns[4].title = "telefono"
.Columns[4].width = 80
.font.name = "Sans"
.font.size = 10
.Background = 16777215
.Foreground = 0
End With
Return grid
End

'-------------------------- Actualizacion datos gridview-------------------------
Public Sub GridViewMuestraDatos_Data(row As Integer, column As Integer)
' este evento se encarga de dibujar los datos en el gridviews, para que aparezcan en la pantalla.
resultado.MoveTo(row)
GridViewMuestraDatos.Data.text = Str(resultado[GridViewMuestraDatos.Columns[column].text])
' colorea la fila, según sea par o impar
If row Mod 2 = 0 Then GridViewMuestraDatos.Data.Background = Color.LightBackground
End

Public Sub RefrescarDatos()
resultado = coordina.MostrarPersonas()
GridViewMuestraDatos.Rows.count = 0 'lo ponemos a cero el numero de filas
GridViewMuestraDatos.Rows.count = resultado.count 'actualizamso al resultado de la consulta
End

Os dejo aqui el código fuente completo del ejemplo: enlace de descarga


Saludos







sábado, 3 de agosto de 2013

POO en Gambas3: Copiar Objetos

Programación Orientada a Objetos  
en Gambas3: Copiar Objetos


Alguna veces nos interesa hacer una copia de nuestros objetos en los programas.

Este lenguaje no trae ninguna función para hacer esto directamente, pero mirando en  las listas de usuarios de gambas (mailing gambas-user) y  en el gambasforce francés ( code-62-copier-un-controle-ou-un-conteneur-et-ses-enfants) viene un código capaz de copiar las propiedades y los hijos de un control.:


He modificado un poco el codigo, para que sea capaz de copiar Objetos (sus propiedades y métodos), y además le he añadido que si una propiedad es otro objeto, también lo copie (haga un nuevo objeto y copie el valor, y no lo copie por referencia, que es lo que hace el codigo frances con todas las propiedades).

Os pongo aqui él código de la función.


Ejemplo de uso:

Tenemos dos clases:
ClassPata:
     Es una clase que tiene una sola propiedad: Numero
ClassPerro:
     Donde tiene varias propiedades:
                  arrayInteger As Integer[]
                  varian As Variant
                  N As ClassPATA
                  nombre As String






La salida que se genera en la ejecución del ejemplo es la siguiente:
1) Copia del objeto perro a copiaperro
Original:.......................
Nombre: nazarena
patas: 3
Varian:         (String[] 0xf5b5b8)  valores: hola adios
Array integer:  (Integer[] 0xf5b6e8)
(Id:0: 1) (Id:1: 2) (Id:2: 4) (Id:3: 56)
La copia incial es:
Nombre: nazarena
patas: 3
Varian:         (String[] 0xf5bb48)  valores: hola adios
Array integer:  (Integer[] 0xf5bfc8)
(Id:0: 1) (Id:1: 2) (Id:2: 4) (Id:3: 56) 
2) Hacemos una modificación de la copia, y comprobamos que no se ha modificado el original
copia modificada: -------------
Nombre: Canela
patas: 4
Varian:         (Variant[] 0xf5b4b8)  valores: Hello adios Bye Bye perrito 3,14
Array integer:  (Integer[] 0xf5bb48)
(Id:0: 10) (Id:1: 22) (Id:2: 3) (Id:3: 4) (Id:4: 34)
El original es:
Nombre: nazarena
patas: 3
Varian:         (String[] 0xf5b5b8)  valores: hola adios
Array integer:  (Integer[] 0xf5b6e8)
(Id:0: 1) (Id:1: 2) (Id:2: 4) (Id:3: 56)

3) Ahora modifico el original, y compruebo que la copiamodificada no se ha modificado con este ultimo cambio
Modifico Original, veo si ha cambiado en algo la copiaModificada....
El original Modificado es:

Nombre: nazarena Raza desconodia
patas: 8003
Varian:         (String[] 0xf5b508)  valores: Alfa Beta
Array integer:  (Integer[] 0xf5b5b8)
(Id:0: 1) (Id:1: 2) (Id:2: 43) (Id:3: 56)
Copia Modificada anteriormente:
Nombre: Canela
patas: 4
Varian:         (Variant[] 0xf5b4b8)  valores: Hello adios Bye Bye perrito 3,14
Array integer:  (Integer[] 0xf5bb48)
(Id:0: 10) (Id:1: 22) (Id:2: 3) (Id:3: 4) (Id:4: 34)


4) Y ya por ultimo, lo que hago es mostrar los nombre internos de las variables (arrays y clases) que intervienen en el ejemplo:
Muestro las referencias de los objetos:
objetos:(ClassPerro 0xf6d318)   (ClassPerro 0xf6d368)
clases:(ClassPATA 0xf5b488)     (ClassPATA 0xf5bb18)
Arrays Integer:(Integer[] 0xf5b5b8)     (Integer[] 0xf5bb48)
Arrays Variant:(String[] 0xf5b508)      (Variant[] 0xf5b4b8)

Con estos ejemplos, podeis comprobar que los propiedades de los objetos ( los arrays, variant, clases, etc), se han copiado por valor, cuando normalmente se copian por referencia.


Enlace de descarga del ejemplo completo: enlace de descarga

Nota:
Si se copia por Referencia una variable, lo que ocurre, que cualquier cambio producido en esta modifica todos los objetos que la tienen por referencia.
Si se copia por Valor una variable, se se modifica, solo afecta al objeto donde este, quedando el objeto original igual.



Nota 2:
Esta función copia tanto las propiedades como los métodos que tenga el objeto.
No copia variables publicas (Public) definidas dentro del objeto, ni por supuesto las definidas como privadas (Private)


lunes, 10 de junio de 2013

Python: Ejemplo de Clase, herencia y polimorfismo , y como recorrer lista de elementos

Python: Ejemplo de clase 

como recorrer una lista de elementos

Os dejo aqui un simple ejemplo de como hacer una clase, y crear clases heredadas de ellas con python.


La clase padre se llama "cosa", que tiene varias propiedades (nombre, y apellidos)  y dos  métodos:

  • nombre: que asigna a las propiedades nombre y apellidos valores
  • ver: que muestra los valores del nombre y apellidos.

Luego defino la clase robot, que hereda de la clase "cosa", con un método nuevo llamado "calculista" y redefine el método ver.

La clase humano, que también es heredada de "cosa",  y define el método "calculista".

En el programa principal, se usa una variable "Lista" que contiene los dos objetos que creo (r1, y r2) que aunque son de distinto tipo, se pueden añadir a la lista sin ningún problema.

Luego se muestra el contenido de los objetos, de dos formas, directamente usándolo y  usando la lista con su indice correspondiente...




Otra forma más cómoda de  la lista de elementos seria usando for: