Hola gente!
Tengo un caso de uso en mente, puede que no muy importante. Pero hoy estuve
agregando esta posibilidad:
https://github.com/ajlopez/AjTalk/commit/27535cef4ec3bc89888b6ab94494ee4a0de8cce8| obj |
" Object methods "
obj := Object new.
obj compile: 'sayHello: name ^''Hello '', name'.
[(obj sayHello: 'World') = 'Hello World'] assert.
[obj isPrototype] assert.
[obj isMemberOf: Object] assertFalse.
[obj isKindOf: Object] assert.
Es decir, puedo definir un metodo (con compile:) sobre UN OBJETO, para
agregarle algo a esa instancia.
Ayer, pude crear objetos dinamicos (creo que se llaman null objects), donde
los setters y getters siempre existen y no dan error, en todo caso, dan nil.
| dyn |
dyn := DynamicObject new.
dyn name: 'Joe Doe'.
[dyn name isNotNil] assert.
[dyn name = 'Joe Doe'] assert.
Ahora, combinando las dos features, puedo definir un objeto dinamico,
ponerle ancho y alto, y definir para ese objeto un metodo area:
| dyn |
dyn := DynamicObject new.
dyn height: 10.
dyn width: 20.
dyn compile: 'area ^self width * self height'.
[dyn area == 200] assert.
Lo bueno que es que la implementacion que elegi (crear una clase nueva
dedicada a ese objeto), no afecta el rendimiento del resto de los objetos.
Tengo pensado esto para algun mock, para refactorizar y mejorar el Web
server de ayer, que salio algo "quick and dirty". No uso mucho mocks en mis
otros codigos, pero bueno, sera cuestion de ver, explorar e investigar.
Una vez que el objeto dinamico esta creado, podria hacer
dyn class new
para crear un "hermanito" que hereda los metodos de ese prototipo. Pero no
escribi test ni lo necesite por ahora. Hasta podria definir un Object>>new
que haga eso: self class new
Nos leemos!
Angel "Java" Lopez
@ajlopez
gh:ajlopez