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:
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).
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