Hola gente! Carlos, gracias por la explicacion. Ahora entendi. Estaba confundido: el classVariableNames: define las shared, mientras que
MiClase class instanceVariableNames: 'pepe' define class instance variables. Para mi, era lo mismo, era equivalente Object subclass: #MiClase instanceVariableNames: '...' classVariableNames: 'pepe' .... que hacerlo en dos pasos: Object subclass: #MiClase instanceVariableNames: '...' classVariableNames: '' .... MiClase class instanceVariableNames: 'pepe' ESA ERA MI CONFUSION: para mi, classVariableNames: definia variables de instancia en la metaclase, para que sean variables en su unica instancia, que es la clase. Veo que es TOTALMENTE distinto a lo que pensaba. Define variables en un "pool" especial implicito. Y por convencion, se ponen en mayusculas, pero no parece mandatorio. Gracias a todos! Angel "Java" Lopez @ajlopez gh:ajlopez 2012/12/17 Carlos E. Ferro <[email protected]> > Angel, > los artículos de Juanita ewing son sobre Smalltalk/V. > Allí, como ella dice, hay class variables y class instance variables. > Las class variables, paradójicamente, se "declaran"en la "definición" > de la clase (junto con las de instancia "de las instancias"), el mensaje > #subclass:instanceVariableNames:classVariableNames:poolDictionaries:. Las > comillas son porque eso no es una declaración, ni una definición de la > clase, sino un mensaje que se envía a un objeto, en este caso, a una clase. > Las variables de instancia de la clase, se declaran "del lado class > del browser" con otro mensaje que se envía, en este caso, a una metaclase. > Por poner un ejemplo (trivial, porque no tiene variables de instancia), > sería > MessageBox class instanceVariableNames: '' > > Las variables de clase se empiezan con mayúscula para indicar que son > compartidas. Compartidas entre la clase y todas sus instancias, y sus > subclases y todas sus instancias. > Las variables de instancia de la clase, son sólo eso. La clase es un > objeto (cada una, una instancia de Metaclass) y puede tener variables de > instancia. Entonces, esas no son compartidas, son "locales" . Se pueden > usar en métodos de clase. Si creás una subclase, hereda la definición de > las variables de instancia (como pasa con las instancias), pero como es un > objeto distinto, tiene otras variables de instancia, aunque tengan el mismo > nombre. Puede sonar confuso, pero es exactamente igual que lo que pasa con > las instancias. > > Pharo tiene una implementación diferente y usa algo que llama, > propiamente, SharedVariables. A grandes rasgos, para las "variables de > clase" es un diccionario en la clase. También lo usa para los "viejos" > PoolDictionaries. > > En cuanto al compilador, los que conozco tienen una ristra de scopes > anidados, como cualquier otro. Entonces, una colisión de nombres (por > ejemplo, entre una variable de clase y una "global" definida en Smalltalk) > se resuelve porque primero está el scope de la clase y más afuera, el del > diccionario Smalltalk. > > Saludos > > PD: La variable Listmenu no te la muestra, porque no da la "definición " > de la clase que está usando, ya que la cambia varias veces. Pero cuando > habla de ella, deja claro que es una class variable, consecuente con el > hecho de que adhiera a la convención de la mayúscula inicial. > > > On 17/12/2012 03:36 p.m., Angel Java Lopez wrote: > > Hola gente! > > Gracias Guillermo por los enlaces, muy interesante. > > Segun esa nomenclatura "instance Variable" es lo que se define en los > instanceVariableNames: en general. > Y lo que es "class instance variable" es lo que se define en los > classVariableNames: (y esto es lo que me confunde, lo que se llama "class > instance variable" aparece como classVariableNames:) > > Entiendo instanceVariableNames, classVariableNames y toda la estructura > interna. No diria que una "class instance variable" o lo que define > classVariableNames: es algo similar a lo estatico en Java o en C++. Y me > sigue pareciendo que lo que los papers (y Valloud) llama "class variables" > (insisto, yo lo hubiera llamado shared variabels), tienen una > implementacion distinta. > > PERO, aca viene la duda que persiste, y que en esos papers no esta > dilucidada, hasta donde vi. > > En el > http://esug.org/data/Articles/Columns/EwingPapers/class_variables.pdf > pone "How to define Class Instance Variable" y eso lo entiendo desde > principios de los ochenta. > > Pero en el > http://esug.org/data/Articles/Columns/EwingPapers/cvars&cinst_vars.pdf > > Da como ejemplo de "class variable" a ListMenu. PERO NO DICE COMO SE > DEFINE (no vi en ningun lado un ejemplo que defina una subclase y en el > classVariableNames: venga ListMenu), simplemente la referencia en el metodo > de clase y con Mayuscula. > > ListInterface class > initialize > “Create a menu. Create constants.” > ListMenu := Menu labels: #(‘add’ ‘remove’) > menu > “Return the list menu.” > ^ListMenu > ListInterface > hasMenu > “Return true if a menu is defined.” > ^self class menu notNil > performMenuActivity > “Perform the mouse-based activity for my view.” > self hasMenu > ifTrue: [^self class menu startUp]. > > Como sabe que ListMenu es una shared variable, en vez de algo que esta > en Smalltalk??? > > Valloud habla de Shared Variables, como de algo nuevo (ya en las > secciones anteriores menciono lo de que las clases tienen "instance > variables" definidas en la metaclass). Y que se accede NO POR class > methods, sino como variables compartidas, directamente accesibles desde > cualquier lado de la jerarquia de ESA CLASE. > > Por ejemplo, escribe: > > "In addition to instances variables on the instance and class sides of > the browser, there are hybrid entities calles class variables. Despite the > slight difference in their names, their scope is quite different: a class > variable is visible from the class the class that defines it and also from > all the instances of the class. Moreover, it is also visible by subclasses > of the class in which it is defined, and by instances of these subclasses > as well. This means it is a global variable whose scope begins at the class > that introduces it. In particular, class variables are accessible from > class instances as well as from emtaclass instances. Clearly, these are not > our everyday instance variables" > > Es decir, no veo que sea las que se definen en classVariableNames: > > No veo tampoco que sean las que esten definidas en una metaclase, de > alguna forma especial. Porque dice que se pueden ver desde las instances, > la clase original, y las subclases. No vi/no entendi que ninguna forma de > instanceVariableNames:, o classVariableNames:, aplicadas a la clase o la > metaclase, o a piruloclase ;-) CONSIGUIERA SEMEJANTE CONDUCTA de > visibilidad. > > Como es? > > (si existen como se describe en ese texto, yo las hubiera llamado > directamente Shared Variables, como creo recordar que estan en el libro > Smalltalk-80, pero que nunca son usadas o ejemplificadas en ese libro, > hasta donde recuerdo). > > Nos leemos! > > Angel "Java" Lopez > @ajlopez > gh:ajlopez > > 2012/12/17 Guillermo Schwarz <[email protected]> > >> Qué enredo. >> >> - Eso estaba desde Smalltalk-80? Estaba explicado en el libro >> "clasico" de Smalltalk-80, The language? O solo nombrado? >> >> Sí. Existe desde 1980. >> >> - Como se declara que Beta es una class or shared variable? Por lo que >> entendi, simplemente se le asigna un valor en un metodo de una clase. Es >> asi? >> >> Cuando se declara una clase se pone la lista de instaceVariables y de >> classVariables. >> >> >> http://stephane.ducasse.free.fr/FreeBooks/ByExample/31%20-%20Chapter%2029%20-%20Meta-Programm.pdf >> >> - Necesita estar en primera letra mayuscula? Me imagino: >> -- Si, el compilador de metodos asi determina que es Shared >> -- No, el compilador de metodos determina que es Shared si no es >> Instance, Local, Argument, etc.... >> >> En Smalltalk 80 el lugar para definir las instaceVariables no es el >> mismo que para definir las classVariables: >> >> http://esug.org/data/Articles/Columns/EwingPapers/class_variables.pdf >> http://esug.org/data/Articles/Columns/EwingPapers/cvars&cinst_vars.pdf >> >> Smalltalk es una instancia de SystemDictionary y es donde están >> definidas las constantes de la aplicación, en particular las clases están >> definidas en Smalltalk como "nombre" -> la clase propiamente tal, con la >> salvedad de que en el lenguaje Smalltalk no hay diferencia entre tiempo de >> edición, compilación y ejecución, y por lo tanto tan constantes no son, o >> si quieres, son constantes hasta que las cambias y por lo tanto son >> variables globales (podrías guardarlo en cualquier otro dictionary, pero el >> compilador de Smalltalk tiene la tendencia a usar Smalltalk como su >> dictionary). >> >> La única diferencia entre instanceVariables y classVariables es que >> unas están asociadas a las intancias (son un dictionary que están asociado >> a cada instancia), mientras que classVariables están asociadas a la clase >> propiamente tal y como tal, todas las instancias pueden acceder a ellas (si >> utilizan un classMethod en vez de un instanceMethod para acceder a ellas). >> Para invocar un class method debes hacer self class <<métdodo>>. ¿Se >> entiende? >> >> De todas maneras es una trivialidad porque las clases son objetos. En >> particular son instancias de la clase "class", de modo que self class class >> debiera ser siempre Class (o MetaClass dependiendo de la variante de >> Smalltalk que uses), pero no es así exactamente. Porque las >> instanceVariables de Class son las classVariables de la clase en cuestión >> (entonces todas las clases tendrían las mismas classVariables) y por eso >> Smalltalk crea una metaclase heredada de Class o MetaClass para cada clase >> que se crea, y esa clase si no me equivoco no está en Smalltalk (el >> SystemDictionary) ya que de todas maneras está en MetaClass subclasses y en >> cada self class class. >> >> Si conoces C++ o Java, el instanceVariable y el classVariable es lo >> mismo que la diferencia entre atributo normal y atributo estático, uno es >> propio de la instancia y el otro es propio de la clase y por eso se >> considera "compartido" (shared). Bueno y si no los conoces, es cosa de ver >> la implementación que tiene SystemDictionary y Compiler si al fin y al cabo >> en Smalltalk se puede ver todo el código. >> >> "Alpha dosomething..." => Integer doesNotUnderstand: #doSomething >> >> El compilador busca Alpha en Smalltalk y lo reemplaza por 1 (un >> Integer), luego le envía el mensaje dosomething y si no lo entiende... no >> sé cómo ser más claro... >> >> Juanita Ewing dice que existen 3 casos: >> >> 1. instance variables. >> 2. Class variables. >> 3. Class instance variables. >> >> La diferencia entre 2 y 3 es que en el caso 2, se comparten con las >> subclases y en el caso 3 no, por lo tanto argumenta Juanita que es mejor 3. >> >> Saludos, >> Guillermo. >> >> >> 2012/12/17 Angel Java Lopez <[email protected]> >> >>> Hola gente! >>> >>> No recuerdo si ya lo pregunte en la lista... bueno, encuentro en el >>> libro Fundamentals of Smalltalk Programming Technique (que adquiri en >>> Smalltalks 2010), del bueno de Andres Valloud, la seccion 4.2.6, el titulo >>> >>> Class (or shared) variables >>> >>> con la aclaracion al pie, de Note that in some Smalltalks (e.g: >>> VisualWorks) class variables are referred to as shared variables instead. >>> >>> Preguntas: >>> >>> - Eso estaba desde Smalltalk-80? Estaba explicado en el libro >>> "clasico" de Smalltalk-80, The language? O solo nombrado? >>> - Como se declara que Beta es una class or shared variable? Por lo que >>> entendi, simplemente se le asigna un valor en un metodo de una clase. Es >>> asi? >>> - Necesita estar en primera letra mayuscula? Me imagino: >>> -- Si, el compilador de metodos asi determina que es Shared >>> -- No, el compilador de metodos determina que es Shared si no es >>> Instance, Local, Argument, etc.... >>> - Por lo que vi, no puedo hacer en el workspace >>> >>> Alpha := 1 >>> >>> pero puedo hacer >>> >>> Smalltalk at: #Alpha put: 1 >>> >>> y de ahi en mas referenciar a Alpha >>> >>> Como se llama a Alpha? Una global variable? >>> >>> - Como sabe el compilador de metodos, que si encuentra algo como >>> >>> Alpha dosomething... >>> >>> se refiere a una global variable definida en Smalltalk, vs. una Shared >>> variable de la clase actual donde va el metodo que se va a compilar? >>> >>> >>> Nos leemos! >>> >>> Angel "Java" Lopez >>> @ajlopez >>> gh:ajlopez >>> >>> -- >>> To post to this group, send email to [email protected] >>> To unsubscribe from this group, send email to >>> [email protected] >>> >>> http://www.clubSmalltalk.org >> >> >> >> >> -- >> Saludos cordiales, >> >> Guillermo Schwarz >> Sun Certified Enterprise Architect >> -- >> To post to this group, send email to [email protected] >> To unsubscribe from this group, send email to >> [email protected] >> >> http://www.clubSmalltalk.org > > > -- > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected] > > http://www.clubSmalltalk.org > > > > -- > > * carlos e. ferro *| senior developer* *| *caesar systems * > > [email protected] > > -- > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected] > > http://www.clubSmalltalk.org > -- To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] http://www.clubSmalltalk.org
