On 9/29/06, kikote gregoris <kikogregoris@...> wrote:
Supongo que es despreciable no?. Es una constante mas(por lo menos viendolo desde alto nivel) no?
Yo muchas veces redefino el new para decir que no deberia estar implementado. ¿Cuando lo hago?. Supongamos que tengo una clase persona y asumamos que una persona sin nombre ni apellido no tiene sentido de existir. Entonces a la hora de implementar hare:
Persona>>new
^self sentNotImplemented
Persona>>name: aName surname: aSurname
^(super new)
initialize: aName
surname: aSurname.
Aunque si queres podrias creartela con un basicNew pero no es el sentido a nivel de aplicacion hacerlo. Algunas otras opciones? Me interesan mucho sus experiencias...
Hola Ale y EstebanEntiendo.Ahora se supone que la inicialización perezosa debería ser utilizada en los casos que plantea Esteba, donde los recursos no son siempre necesarios e inmediatos.Lo curioso que en lo que yo pegue como ejemplo el recurso es totalmente necesario.Cual es el costo de tener que preguntar si el objeto es nil o no para inicializarlo??.En términos de performance claro.
Supongo que es despreciable no?. Es una constante mas(por lo menos viendolo desde alto nivel) no?
Lo digo pensando en que esto se generalice a gran parte del sistema, o es insignificante ??Por lo del #new me referia a cuando usar una u otra alternativa.Se supone que si redefino el #new es para hacer un #initialize o no ?
Yo muchas veces redefino el new para decir que no deberia estar implementado. ¿Cuando lo hago?. Supongamos que tengo una clase persona y asumamos que una persona sin nombre ni apellido no tiene sentido de existir. Entonces a la hora de implementar hare:
Persona>>new
^self sentNotImplemented
Persona>>name: aName surname: aSurname
^(super new)
initialize: aName
surname: aSurname.
Aunque si queres podrias creartela con un basicNew pero no es el sentido a nivel de aplicacion hacerlo. Algunas otras opciones? Me interesan mucho sus experiencias...
Desgraciadamente en la facultad solo vimos una de las alternativasHola kiko,
Hay (al menos) dos tipos de inicialización.
1.- mediante new/initialize
2.- lo que viste, que se llama inicialización diferida,
bajo demanda o lazzy
Son mecanismos NO equivalentes.
Cuando y porque se usa uno u otro es un tema de
las materias básicas de objetos hoy, en día.
En esta lista hemos hablado mucho del tema,
seguramente esta en los mails históricos
bastante material sobre esto.
Sobre el #release no se ha definido tan
formalmente como hacerlo en la comunidad aún;
a menudo yo prefiero la modalidad que resaltas.
> Quería saber a que se debe esta forma de trabajar,
A hacerlo así por años (no se si hay mas o
menos de cien razones).
Quienes trabajaron conmigo usan algunas de estas
modalidades, no todos... son cosas que se adquieren
y se pierden rápidamente; al entrar/salir de un equipo.
> tiene que ver con el concepto de no generar basura.
No. Tiene que ver con un gestual, una forma de realizar una actividad.
No es necesario buscar el no generar basura.
Es tan innecesario como el economizar clases...
> En muy pocos casos observe que redefinieras
> el #new y colocaras un #initialize.
Si, son muy pocos los casos dónde es necesario
hacerlo de esa manera.
Por lo general quien empieza usa ese mecanismo
casi siempre y lo hace así por años si no se
encuentra con un equipo que trabaje distinto;
fijate que dije "un equipo"... no "una persona"
(considero que son modismos que se transmiten por
un proceso educativo).
> Es siempre conveniente trabajar de esta forma?.
Es siempre conveniente usar el mecanismo
apropiado para la situación.
Si no sabes reconocer mas de una situación (reconoces
solo "inicialización"/construcción) entonces es
siempre conveniente usar lo mismo :-)
> Cuando es necesario redefinir un #new ¿?
En el mismo caso que necesitas refinar cualquier mensaje.
El #new es un mensaje mas.
hasta pronto,
Ale.
----- Original Message -----
From: "kikote gregoris" < kikogregoris@...>
To: < smalltalking@...>
Sent: Friday, September 29, 2006 11:26 AM
Subject: [objetos] Estilo de programacion
> Hola Ale
>
> Estuve viendo que en muchas oportunidades, cuando necesitas retornar el
colaborador de un objeto haces lo siguiente:
>
> engine
> "Returns the instance var of the receiver
> for external manipulation"
>
> engine isNil ifTrue: [ self initializeEngine ].
> ^engine
>
> En la universidad se nos enseño que cuando uno tiene que inicializar un
objeto, lo que hace es redefinir el #new y hacer un # initialize, donde se
coloca todo lo que quiero inicializar del objeto, en tu caso inicializas el
objeto a medida que lo necesitas.
> Esto además se ve mucho en el código C++ con el #constructor y el
#destructor.
> Luego para setear un objeto haces:
>
> engine: anEngine
> "Sets the instance var of the receiver.
> Release the old instance if needed."
>
> engine notNil ifTrue: [ engine release ].
> engine := anEngine
>
> Luego para liberar los recursos de el objeto haces:
>
> release
> " Private - Release the receiver. "
>
>
> self
> engine: nil;
> yourself.
>
> super release
>
> Lo cual en el release tradicional simplemente harías un release del
engine y no mandarle nil .
>
> Quería saber a que se debe esta forma de trabajar, tiene que ver con el
concepto de no generar basura.
> En muy pocos casos observe que redefinieras el #new y colocaras un
#initialize.
>
> Es siempre conveniente trabajar de esta forma?.
> Cuando es necesario redefinir un #new ¿?
>
> saludos kiko
>
>
> ---------------------------------
> Preguntá. Respondé. Descubrí.
> Todo lo que querías saber, y lo que ni imaginabas,
> está en Yahoo! Respuestas (Beta).
> Probalo ya!
Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
Probalo ya!
--
Saludos
Esteban