En realidad lo que dice Juanita es que las class instance variables son lo mismo que las class variables, pero superiores porque no son compartidas con las subclases, lo cual tiene bastante sentido.
En el primer paper http://esug.org/data/Articles/Columns/EwingPapers/class_variables.pdf explica como se instancian: AnimatedObject class instanceVariableNames: '' Por lo tanto va fuera de la definición de la clase. Respecto de porque en el segundo paper http://esug.org/data/Articles/Columns/EwingPapers/cvars&cinst_vars.pdf no indica cómo instanciar una classVariable, es porque opina que es muy simple: Object subclass: #AnimatedObject instanceVariableNames: 'position oldPosition jumpIncrement direction ... goCount ' classVariableNames: '' poolDictionaries: 'WinConstants ' Efectivamente no coloca nada en classVariableNames. Pero si miras la figura 1 del segundo paper verás que ClaculatedListINterface desciende de ListInterface y ambos ven la misma classVariable llamada ListMenu. Según Juanita eso es propio de classVariable y no de classIntanceVariable. Simplemente omitió el detalle de la declaración de ambas clases, pero claramente ListMenu está definida en ListInterface. Fíjate qu ea continuación define ListINterface class initialize, la que obviamente se ejecuta una sola vez, ¿cuando? Probablemente cuando se instancia el primer objeto, porque la clase debe existir cuando se define este método. Creo que con shredvariables entonces se refiere a PoolSharedVariables o poolDictionaries. A pesar de que todas las clases lo tienen ahí presente, muy pocas lo usan. Recuerdo que alguna vez las usé y eran muy cómodas de usar. Si mal no recuerdo, el compilador no encuentra el objeto referenciado en un método en Smalltalk, lo busca en instanceVariableNames, luego en classVariableNames y finalmente en los poolDictionaries que definiste en la clase. Bueno, digo que es el compilador, pero debe ser el runtime que hace la magia, porque si cambio el poolDicitonary, no creo que recompile la clase. Acá hay un ejemplo de cómo usar poolDcitionaries: http://stephane.ducasse.free.fr/FreeBooks/ByExample/09%20-%20Chapter%207%20-%20Global%20Variabl.pdf Nota: pool es inglés significa "piscina" y además significa "compartido". CarPool = compartir el auto. Saludos, Guillermo. 2012/12/17 Angel Java Lopez <[email protected]> > 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 > -- 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
