https://foro.gambas-es.org/viewtopic.php?f=5&t=3147
-----------------------------------
Shell
Martes, 28 May 2013, 10:35

Ejemplo De Clase Publica Y Clase Privada
-----------------------------------
Hola de nuevo!.

En estos dos ejemplos que hacen lo mismo, tenemos un formulario como este:

 [img]http://foro.gambas-es.org/files/images/768/colecciones.png[/img] 

En estos ejemplo, añadimos un nombre al trabajador y su salario.Estos datos
son pasados a la lista en la que se la asigna un código para que podamos trabajar
con la colección.

Tendremos:

- La clase empleado
- La clase miniEmpresa
- El formulario

Básicamente como programadores vemos como nuestra aplicación va mejorando.
Estos ejemplos vuelven a ser convertidos y cambiados de VB en el cual trata un poco la POO para que
podamos verlos en Gambas, los he cambiado y traídos a la comunidad.

Como los nombres de los ejemplos dicen tenemos:

- La casa de paja
- La casa de madera.

Falta la casa de ladrillos en que la se supone que usa propiedades (property)

En estas dos aplicaciones observamos como va cambiando el uso de propiedades publicas a privadas.
Lo que significa un mejor código, mas seguro, menos propenso a errores, los cambios que nos origina
hacerlo, como va cambiando la distribución del código en el que la casa de paja, usa casi todo el manejo
de la aplicación en el formulario y en la casa de madera vamos viendo como desaparece gran parte
de este código y queda en las clases.

Con ciertas clases no necesitamos modificarlas para trabajar con ellas y solo dependemos de algunos
cambios en otras.

La Casa de Paja:

La clase Empleado es común a los dos ejemplos. No se ha modificado.

[code linenumbers=false syntax=gambas]
Public Nombre As String
Public Salario As Float
Private id As String

Property muestraid As String


Private Function muestraid_Read() As String
  Return id
End

Private Sub muestraid_Write(Value As String)
  id = Value
End
[/code]

La clase MiniEmpresa apenas es nada en "La casa de Paja".

[code linenumbers=false syntax=gambas]
Public Empleados As New Collection
[/code]

Y depende de todo lo que hace el formulario:

[code linenumbers=false syntax=gambas]
'En este ejemplo vamos a crear una coleccion Publica

Public empresa As New MiniEmpresa
Static Public iNumEmpleado As Integer

Public Sub _new()

End

Public Sub Form_Open()
Me.Caption = "Coleccion de Empleados"

End

Public Sub btnAnadeEmpleado_Click()
  Dim nuevoEmpleado As New Empleado
  
  'El uso de with hace que el código sea mas rápido
  'y conciso (.muestraid en vez de poner nuevoEmpleado.muestraid)
  
  With nuevoEmpleado
    iNumEmpleado += 1
    .muestraid = "E" & Format(iNumEmpleado, "00000")
    .Nombre = txtNombre.Text
    .Salario = CFloat(txtSalario.Text)
    empresa.Empleados.Add(nuevoEmpleado, .muestraid)
  End With
  txtNombre.Text = ""
  txtSalario.Text = ""
  btnListaEmpleados.Value = True
End

Public Sub btnListaEmpleados_Click()
  Dim emp As New Empleado
  lstEmpleados.Clear
  
  For Each emp In empresa.Empleados
      lstEmpleados.Add(emp.muestraid & ", " & emp.Nombre & ", " & emp.Salario)  
  Next

End

Public Sub btnQuitar_Click()
  Me.Close
End

Public Sub btnBorraEmpleado_Click()
  'Comprueba que hay un empleado seleccionado
  If lstEmpleados.Index > -1 Then
      'Los seis primeros caracteres son el id.
      empresa.Empleados.Remove(Left(lstEmpleados.Text, 6))
  Endif
  'Hace click en el boton de actualizar lista
  btnListaEmpleados.Value = True
End
[/code]

Ahora vayamos al ejemplo de la casa de madera.

Vemos la clase MiniEmpresa que ha cambiado.

[code linenumbers=false syntax=gambas]
'Propiedades
Private Empleados As New Collection
Static Private inumEmpleado As Integer

'Metodos
Public Function AgregarEmpleado(Nombre As String, Salario As Float) As Empleado
  Dim nuevoEmpleado As New Empleado
  
  With nuevoEmpleado
    inumEmpleado += 1
    .muestraid = "E" & Format$(inumEmpleado, "00000")
    .Nombre = Nombre
    .Salario = Salario
    'Agrega la referencia del objeto Empleado a la
    'coleccion, con la propiedad muestraid como clave
    Empleados.Add(nuevoEmpleado, .muestraid)
  End With
  'Devuelve una referencia al nuevo objeto Empleado
  Return nuevoEmpleado
  
End


Public Function ContarEmpleados() As Integer  
  Return Empleados.Count  
End

Public Sub EliminarEmpleados(Indice As String)
  Empleados.Remove(Indice) 
End

Public Function Trabajador(Indice As String) As Empleado
  Return Empleados[Indice]  
End

Public Sub Problema()
  Dim x As New Empleado
  
  Empleados.Add(x)
    
End

Public Function MostrarEmpleados() As Collection  
  Return Empleados  
End
[/code]

Y su formulario, observamos que hemos quitado bastante código de este para
que quede en la clase MiniEmpresa.

[code linenumbers=false syntax=gambas]
'Ejemplo de coleccion privada

Private empresa As New MiniEmpresa


Public Sub _new()

End

Public Sub Form_Open()

Me.Caption = "Coleccion de Empleados"

End

Public Sub btnAnadeEmpleado_Click() 
  Dim nuevoempleado As Empleado
    
  nuevoempleado = empresa.AgregarEmpleado(txtNombre.Text, txtSalario.Text)
  txtNombre.Text = ""
  txtSalario.Text = ""
  
  With nuevoempleado  
    lstEmpleados.Add(.muestraid & ", " & .Nombre & ", " & .Salario)
  End With

End


Public Sub btnListaEmpleados_Click()
 Dim unempleado As Empleado
 
 lstEmpleados.Clear
 
 For Each unempleado In empresa.MostrarEmpleados()
    With unempleado      
        lstEmpleados.Add(.muestraid & ", " & .Nombre & ", " & .Salario)
    End With      
 Next
 
End

Public Sub btnQuitar_Click()
  Me.Close
End

Public Sub btnBorraEmpleado_Click()
  'Verifica si hay un empleado seleccionado    
  If lstEmpleados.Index > -1 Then
  'Los seis primeros caracteres son el id      
      empresa.EliminarEmpleados(Left(lstEmpleados.Current.Text, 6))
      lstEmpleados.Remove(lstEmpleados.Index)
  Endif
 btnListaEmpleados.Value = True
End
[/code]

Para verlo mejor, aquí tenéis el código de los dos ejemplos:

Saludos


-----------------------------------
Shell
Martes, 28 May 2013, 10:36

Re: Ejemplo De Clase Publica Y Clase Privada
-----------------------------------
Y el ejemplo que faltaba.

La casa de madera:

Saludos


-----------------------------------
shordi
Martes, 28 May 2013, 11:41

Re: Ejemplo De Clase Publica Y Clase Privada
-----------------------------------
Shell +1


