Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Particularidad Al Instanciar Clase.
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Particularidad Al Instanciar Clase. 
 
Hola, hace unos días estoy revisando gambas (uso la versión 3.4), antes que nada gracias y disculpa por la extensión, pero el código alargo mucho el mensaje, en realidad la idea es corta (Codigo Final---El código esta acá si no quieren leer todo eso); tampoco soy un programador de mucha experiencia, pero intente implementar Singleton, y leyendo vi que había que realizar "Create Static", pero que no se controlaban las instancias inicializadas. Por no ser un experto tuve que experimentar un poco para entender que pasa. No encontré si hoy hay una solución para la implementacion del patrón singleton (me harían un favor enorme), pero les paso una particularidad que observe.


Proyecto completo: http://nextmedici.com/projectos/pruebaStatic.tar.gz


Primero cree un proyecto consola con los siguientes códigos:
singleton.class
' gambas class file
'Archivo Singleton

Create Static

Property Read direccion As String
Property cadena As String
Static Private $cadena As String
Property cadena2 As String
Static Private $cadena2 As String
Property cadena3 As String
Static Private $cadena3 As String



Private Function direccion_Read() As String

  Return "Direccion de Memoria: " & Object.Address(Me) & " SizeOf : " & Object.SizeOf(Me)

End

Private Function cadena_Read() As String

  Return $cadena

End

Private Sub cadena_Write(Value As String)

  $cadena = value

End

Private Function cadena2_Read() As String

  Return $cadena2

End

Private Sub cadena2_Write(Value As String)

  $cadena2 = value

End

Private Function cadena3_Read() As String

  Return $cadena3

End

Private Sub cadena3_Write(Value As String)


Despues el archivo:
clase1.class

' gambas class file

Property Read propiedad1 As String
Property Read propiedad2 As String
Property Read propiedad3 As String


Private $singleton As New Singleton

Public Sub _main()

 $singleton.cadena = "Valor en _main().clase1"
 Print "En clase1: " & $singleton.direccion
 
End

Public Sub valor1()
 
 $singleton.cadena2 = "Valor en valor1().clase1"
 
 Print "En clase1: " & $singleton.direccion
  
End


Public Sub valor2()
  
    $singleton.cadena3 = "Valor en valor2().clase1"
  Print "En clase1: " & $singleton.direccion
  
End



Private Function propiedad1_Read() As String
Dim tmp As String  
tmp = $singleton.cadena

  Return tmp

End


Private Function propiedad2_Read() As String
Dim tmp As String
tmp = $singleton.cadena2
  Return tmp
End

Private Function propiedad3_Read() As String
 Dim tmp As String
 tmp = $singleton.cadena3
  Return tmp

End
 


El archivo:
clase2.class

' gambas class file

Property Read propiedad22 As String


Private $singleton2 As New Singleton

Private Function propiedad22_Read() As String

  Dim tmp As String
  
  Print "En clase2: " & $singleton2.direccion
  tmp = $singleton2.cadena2
  Return tmp

End

 


MMain.module
' gambas module file

Public Sub Main()
Dim class1 As New Clase1
Dim class2 As New Clase2

class1.valor1()
class1.valor2()

Print class1.propiedad1
Print class1.propiedad2
Print class1.propiedad3

Print class2.propiedad22


Wait 3
End



Cuando ejecute esto me sorprendió un poco el resultado:



En clase1: Direccion de Memoria: 89F4824 SizeOf : 0
En clase1: Direccion de Memoria: 89F4824 SizeOf : 0

Valor en valor1().clase1
Valor en valor2().clase1
En clase2: Direccion de Memoria: 89F40BC SizeOf : 0
Valor en valor1().clase1



O sea que:


En clase1: Direccion de Memoria: 89F4824 SizeOf : 0 <-- Inicializa en esa dirección de memoria.
En clase1: Direccion de Memoria: 89F4824 SizeOf : 0 <--- Continua con el objeto ubicado en esa dirección.
                                       <--- Aqui deberia estar en valor pasado en _main() de la clase uno, pero no es asi, primera sorpresa para mi
Valor en valor1().clase1    <--- OK
Valor en valor2().clase1    <--- OK
En clase2: Direccion de Memoria: 89F40BC SizeOf : 0 <--- Inicializa en otra direccion de memoria, porque hice NEW...   
Valor en valor1().clase1                                     <--- Pero trae correctamente el valor.


Pero bien, seguí experimentando con cosas que ni siquiera coloco acá porque no tienen sentido, utilizando el método estático _init() para atajar el instanciamiento del objeto, pero se me ocurrió hacer algunos cambios en la forma de instanciarlos... entonces modifique lo siguiente:

Cuando los declare globalmente en la clase no los instancie con NEW. Entonces cada vez que lo utilizo usaba la palabra clave NEW y cuando terminaba de usarlo  $objSingleton = Null. y el resultado fue así:


En clase1: Direccion de Memoria: 850492C SizeOf : 0
En clase1: Direccion de Memoria: 850492C SizeOf : 0

Valor en valor1().clase1
Valor en valor2().clase1
En clase2: Direccion de Memoria: 850492C SizeOf : 0
Valor en valor1().clase1


Las tres veces se instancio en la misma dirección de memoria!!!!!!...

Todo el codigo de clase1.class y clase2.class:

clase1.class
' gambas class file

Property Read propiedad1 As String
Property Read propiedad2 As String
Property Read propiedad3 As String


Private $singleton As Singleton

Public Sub _main()
$singleton = New Singleton
 $singleton.cadena = "Valor en _main().clase1"
 Print "En clase1: " & $singleton.direccion
 $singleton = Null
 
End

Public Sub valor1()
 $singleton = New Singleton
 $singleton.cadena2 = "Valor en valor1().clase1"
 
 Print "En clase1: " & $singleton.direccion
  $singleton = Null
End


Public Sub valor2()
  $singleton = New Singleton
    $singleton.cadena3 = "Valor en valor2().clase1"
  Print "En clase1: " & $singleton.direccion
  $singleton = Null
  
End



Private Function propiedad1_Read() As String
Dim tmp As String  
$singleton = New Singleton
tmp = $singleton.cadena
$singleton = Null
  Return tmp

End


Private Function propiedad2_Read() As String
Dim tmp As String
$singleton = New Singleton
tmp = $singleton.cadena2
$singleton = Null
  Return tmp
End

Private Function propiedad3_Read() As String
 Dim tmp As String
$singleton = New Singleton
 tmp = $singleton.cadena3
 $singleton = Null
  Return tmp
End

 


clase2.class

' gambas class file

Property Read propiedad22 As String


Private $singleton2 As Singleton

Private Function propiedad22_Read() As String

  Dim tmp As String
  $singleton2 = New Singleton
  Print "En clase2: " & $singleton2.direccion
  tmp = $singleton2.cadena2
  $singleton2 = Null
  Return tmp

End
 



Ahora otra cosa, pero que intuyo porque es si instancio la clase desde el MMain.module me genera otra dirección de memoria, pero puede ser que se separe las clase de los módulos, les muestro el cambio y que paso:

MMain.module
' gambas module file

Public Sub Main()
Dim objTmp As New Singleton

Dim class1 As New Clase1
Dim class2 As New Clase2

class1.valor1()
class1.valor2()

Print class1.propiedad1
Print class2.propiedad22
Print class1.propiedad2
Print class1.propiedad3


Print objTmp.direccion

Wait 5
End

 


Resultado:

En clase1: Direccion de Memoria: 98748E4 SizeOf : 0
En clase1: Direccion de Memoria: 98748E4 SizeOf : 0

En clase2: Direccion de Memoria: 98748E4 SizeOf : 0
Valor en valor1().clase1
Valor en valor1().clase1
Valor en valor2().clase1
Direccion de Memoria: 9874154 SizeOf : 0


Alguien puede aclararme un poquito el panorama, darme algún consejo, o alguna lectura. Saludos.
 



 
última edición por Perceval el Lunes, 25 Marzo 2013, 17:22; editado 1 vez 
Perceval - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Particularidad Al Instanciar Clase. 
 
Para los que no sabemos lo que es singleton.

Tenemos documentación en:

http://es.wikipedia.org/wiki/Singleton

http://es.wikipedia.org/wiki/Conjunto_unitario

Perceval:

El tema de static se ha tratado un poco en la comunidad.
En su día pregunte, que era o como funcionaba un procedimiento static.
En ese post hay una breve referencia sobre singleton. No se si te solucionara
parte de tu pregunta.Puedes usar el buscador.

Lamento no poder ayudarte con tu pregunta.Aun no me ha quedado claro static,
o no lo he tenido lo suficientemente en cuenta.Costumbres.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Instanciar Un Objeto Shell General 2 Jueves, 24 Noviembre 2011, 01:31 Ver último mensaje
Shell
No hay nuevos mensajes Ejemplo De Clase Publica Y Clase Privada Shell Aplicaciones/Fragmentos de Código 2 Martes, 28 May 2013, 11:41 Ver último mensaje
shordi
No hay nuevos mensajes ¿ Es La Clase Padre Una Clase Abstracta ? Shell General 3 Viernes, 04 Julio 2014, 08:58 Ver último mensaje
jsbsan
No hay nuevos mensajes Clase Audio Y Clase Configuracion De Audio... v3ctor Aplicaciones/Fragmentos de Código 3 Jueves, 08 Octobre 2015, 08:35 Ver último mensaje
jsbsan
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron