Package: ObjectBrowser-Collections
Colecciones en Ozono y sus meta-objetos
En Ozono, las colecciones son objetos con meta-objetos especiales. Dado que (casi)reutilizamos las colecciones de pharo, necesitamos que el comportamiento de sus meta-objetos varíe: la forma de clonar colecciones es distinta, quizás queremos restringir la edición de colecciones, o simplemente no eliminar la clase de una colección cuando su objeto se borra (tal como se hace con los objetos normales).
Ozono soporta cinco tipos distintos de colecciones: bags, sets, ordered collections, dictionaries y sorted collection. Los base-objects de estas colecciones son instancias de respectivamente OBBag, OBSet, OBOrderedCollection, OBDictionary y OBSortedCollection. Estas cinco clases heredan de sus respectivos pares en Pharo (Bag, Set, OrderedCollection, ...) para agregar en cada una de ellas el atributo que referenciará al meta-objeto y el comportamiento base de los OBObjects (compartido a través de los traits TOBCollection y TOBObject). A partir de ahora llamaremos OBCollection a todo objeto cuya clase incluya al trait TOBCollection.
(Guille: Éste párrafo me dice que hay un bug ahora que miro el código :D Hay que escribir tests sobre las invariantes de las colecciones y la clonación y esas cosas) Cada OBCollection referencia a través de su variable de instancia _metaObject a su meta objeto correspondiente. En la implementación actual, hay dos tipos de meta-objetos para colecciones: OBCollectionMetaObject y OBDictionaryMetaObject (que especializa al primero). Estos meta objetos controlan las meta-operaciones que uno puede hacer sobre las colecciones.
Colecciones literales
Para facilitar el uso de colecciones Ozono provee de colecciones literales. Es decir, desde cualquier punto del código en una lección (tanto métodos como tests y workspaces) uno puede crear colecciones a partir de código de la siguiente manera:
unSet := set clone.
unBag := bag clone.
Los literales existentes para una lección se inicializan en el siguiente método de la lección:
OBLesson >> initializeLiterals
literals := Dictionary new.
literals at: #bag put: (OBBagPrototype newForLesson: self).
literals at: #set put: (OBSetPrototype newForLesson: self).
literals at: #ordered put: (OBOrderedCollectionPrototype newForLesson: self).
literals at: #orderedcollection put: (OBOrderedCollectionPrototype newForLesson: self).
literals at: #sorted put: (OBSortedPrototype newForLesson: self).
literals at: #sortedcollection put: (OBSortedPrototype newForLesson: self).
literals at: #dictionary put: (OBDictionaryPrototype newForLesson: self).
Como pueden ver, para el manejo de literales se registran bajo los nombres los prototipos de las colecciones. Estos prototipos son necesarios porque cada vez que creamos una colección con el mensaje #clone, esa nueva colección debe ser registrada en la lección como un objeto para trackearla y poder ser dibujada en el diagrama (tenga o no referencias a sí misma).
OBCollectionPrototype >>
basicClone
| collection |
collection := self newMetaObjectForCollection: self createRealCollection.
lesson addObject: collection.
^collection
(Guille: acá hay un problema/mistmatch que hay que resolver entre los prototypes y los meta objetos de colecciones)
Para entender como los literales registrados arriba pueden ser usados desde el código, referirse a la sección de compilación.