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

Responder a