Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 2 de 2
Ir a la página Anterior  1, 2
 
Función O Procedimiento Static, Tipo Static
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
Gracias Fabian me has aclarado bastante con tus explicaciones el concepto de STATIC, lo que no acabo de entender es porque en el código siguiente:
Create Static

 Static Private iTipo As Integer
 Static Private sCampos As String
 Static Private sValores As String

 Property Tipo As Integer
 Property Campos As String
 Property Valores As String

Public Sub _new()

  If Object.Count(Me) > 1 Then
    Print Object.Count(Me)
    Error.Raise("No se permite más de una instancia")
  Endif
  
  Catch  
    
End
 

La primera vez que se instancia el objeto Object.Count(Me) = 3 , imagino que gambas crea instancias ocultas.

Pero se pueden crear instancias de la clase con  NEW y se crean instancias distintas de la clase, no veo como evitar que se pueda crear una sola instancia, la única forma que he encontrado es declarar las variables como Static, de esa forma siempre tienes acceso a los mismos valores independientemente de las instancias que tengas de la clase, es como engañar a la clase (Tu crearas todas las instancias que quieras pero te devolveré siempre los mismos valores), entonces todo el codigo de _new() es innecesario ya que siempre podemos crear otra instancia.
 



 
angelnu - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
angelnu:

Si al contar el numero de objetos que se crean sabes que existen mas de uno, se podrá eliminar los nuevos.
Aunque el código no parece cumplir bien la función.

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
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
fabian:

fabianfv escribió: 


Formulario principal:

PUBLIC SUB btnCrear_Click()
 DIM miform AS Form
 
 miform = NEW FormPlantilla
 
 miform.Show()  

END
 


Citar:

Si analizas el código anterior, tal vez te encuentres que funciona pero no sabes por qué.

Te dejo esta pregunta para que lo pienses:

- Dado que la variable miform es local, cuando finaliza la ejecución del manejador del evento Click, la referencia a FormPlantilla se pierde y cuando esto ocurre no quedan referencias a FormPlantilla por lo que gambas debería eliminar ese objeto. Es decir, que el código anterior no debería funcionar... pero funciona ¿por qué?



Es como si la variable objeto y el  formulario fueran dos cosas diferentes.

Comentarte. En este ejemplo en gambas si eliminas el primer formulario, todos los demás desaparecen.(Una vez me hablaste de esto).
Lo curioso es que en VB siendo un ejemplo similar no pasa eso. Uno por uno tienes que cerrar.

A todo esto, quizás seria bueno tener en la comunidad un foro dedicado a POO.  

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
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
Tengo una duda si un modulo es una clase estática, en que circunstancias se puedo utilizar un modulo y en cual una clase tipo estática o se pueden utilizar cualquiera de las dos. Por lo que recuerdo al crear un componente en gambas se utilizan una clase estática.
 



 
gara_pm - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
angelnu escribió: [Ver mensaje]
Gracias Fabian me has aclarado bastante con tus explicaciones el concepto de STATIC, lo que no acabo de entender es porque en el código siguiente:
Create Static

 Static Private iTipo As Integer
 Static Private sCampos As String
 Static Private sValores As String

 Property Tipo As Integer
 Property Campos As String
 Property Valores As String

Public Sub _new()

  If Object.Count(Me) > 1 Then
    Print Object.Count(Me)
    Error.Raise("No se permite más de una instancia")
  Endif
  
  Catch  
    
End
 

La primera vez que se instancia el objeto Object.Count(Me) = 3 , imagino que gambas crea instancias ocultas.

Si controlas que Object.Count(ME) no pueda ser mayor que 1, entonces no tiene sentido que crees variables de clase (estáticas) porque lo que estás diciendo es que quieres una única instancia. Entonces, si tienes una sola instancia ¿con qué otras instancias se van a compartir las variables de clase si instancias sólo hay una? Eso no cuadra.

Si lo piensas, una clase estática en tiempo de ejecución se transforma en una única instancia. Entonces, si creas variables estáticas en una clase que implementa el patrón singleton, en tiempo de ejecución necesariamente tendrás 2 instancias: el objeto que representa a la clase (con esas variables estáticas) y el objeto que representa a la faceta dinámica de la clase (el singleton).

Pero entonces, ¿no es lo mismo crear una clase estática que una clase de instancia única (singleton)? Yo diría que es lo mismo ... o casi, la diferencia es cuanto tienes que escribir.

Una clase estática es una clase en la que todas sus variables, métodos y propiedades (públicas o privadas) son estáticas, lo que te obliga a declarar todos esos símbolos con la palabra clave STATIC (es decir, te convierte en un mono dactilógrafo igual que por tener que declarar todos los símbolos que querés que sean públicos con la keyword PUBLIC).

De allí, que el singleton en gambas se implementa, en parte, mediante la palabra clave CREATE STATIC.

Lo que hace CREATE STATIC instruir al intérprete para que:

1- Cree automáticamente una instancia de la clase cuando se referencia por primera vez a cualquiera de sus miembros públicos, es decir, propiedades y métodos ... bueno también variables, pero eso no se hace, rompe el encapsulamiento (caca nene, eso es muy feo, esto es para que lo recordemos).

2- Permita que se acceda a esa instancia mediante el nombre de la clase, lo que la convierte en un objeto global y eso es algo no muy recomendable: un objeto global sólo debería existir si no existe ninguna otra posibilidad de implementarlo de otro modo y el singleton si debe poder implementarse declarando una variable de referencia como se hace normalmente con cuaquier objeto. Un objeto global puede ser un problema porque uno de los criterios del diseño orientado a objetos más importantes es que los objetos deben "hablar" sólo con los objetos que conocen (nene no hablés con los desconocidos porque anda por ahí el cuco y te va a llevar); bueno esto no se puede entender tan fácilmente, sólo con esta frase, pero igual es bueno recordarlo.

Entonces, un singleton requiere escribir menos y no ensucia el código con tantas palabras innecesarias (STATIC hasta en la sopa).

angelnu escribió: [Ver mensaje]

Pero se pueden crear instancias de la clase con  NEW y se crean instancias distintas de la clase, no veo como evitar que se pueda crear una sola instancia, la única forma que he encontrado es declarar las variables como Static, de esa forma siempre tienes acceso a los mismos valores independientemente de las instancias que tengas de la clase, es como engañar a la clase (Tu crearas todas las instancias que quieras pero te devolveré siempre los mismos valores), entonces todo el codigo de _new() es innecesario ya que siempre podemos crear otra instancia.


Como te decía antes, las variables estáticas en un singleton no tienen sentido.

El problema de que el Count = 3, parece un bug. En ese caso debería ser que Count = 2.

Yo probé distintas alternativas y el Count también me dió mal. Además, no encontré la forma de crear un singleton sin usar CREATE STATIC, lo que es un poco inconveniente.

Saludos
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Función O Procedimiento Static, Tipo Static 
 
gara_pm escribió: [Ver mensaje]
Tengo una duda si un modulo es una clase estática, en que circunstancias se puedo utilizar un modulo y en cual una clase tipo estática o se pueden utilizar cualquiera de las dos. Por lo que recuerdo al crear un componente en gambas se utilizan una clase estática.


Un módulo no es una clase estática, es casi una clase estática porque no se puede extender un módulo, es decir, no se puede crear un módulo que herede de otro módulo. Si una clase estática cubre tus necesidades y no necesitas herencia, puedes usar un módulo en su lugar. El problema acá es que no debería ser necesario usar un elemento ajeno al paradigma de objetos. Es decir, la parte POO de gambas debería excluir módulos y clases estáticas, y eso se lograría tan sólo con hacer que el singleton fuera muy fácil de implementar (y que funcionara)... bueno, puede que por cuestiones de rendimiento las clases estáticas tengan una justificación para existir, pero son un bicho raro en la POO.

Saludos.
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - 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 Jugando Con Static Shell General 4 Lunes, 20 May 2013, 03:57 Ver último mensaje
sebikul
No hay nuevos mensajes Sintaxis En Un Procedimiento O Función. Shell General 3 Domingo, 20 Abril 2014, 09:37 Ver último mensaje
Shell
No hay nuevos mensajes Cual Es La Diferencia Entre Public Y Stati... v3ctor General 1 Lunes, 13 Abril 2015, 10:57 Ver último mensaje
jsbsan
No hay nuevos mensajes Static? Que Significa (mas Explicito) En V... mckaygerhard General 2 Lunes, 19 Junio 2017, 20:44 Ver último mensaje
mckaygerhard
 

Publicar nuevo tema  Responder al tema  Página 2 de 2
Ir a la página Anterior  1, 2

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados
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