Hola GallegO
> ¿Cómos seria una iteración robusta?
>
A mi entender sería una iteración donde uno pudiera escribir sin problemas
la expresión
clientes do: [:each | each estaOcupado ifTrue: [clientes remove: each]]
sin ni siquiera necesitar preguntarse si trae problemas o no.
En el libro de patterns (el de Gamma) en la pag. 261 dice
"How robust is the iterator? It can be dangerous to modify an aggregate
while you're traversing it. If elements are added or deleted from the
aggregate, you might end up accessing an element twice or missing it
completely. A simple solution is to copy the aggregate and traverse the
copy, but that's too expensive to do in general.
A robust iterator ensures that insertions and removals won't interfere with
traversal, and it does it without copying the aggregate."
Yo creo que el hecho de que sea poco performante hacer la copia no es el
único inconveniente.
También está el hecho de tener que estar atento para no meter la pata.
Fijate que yo metí la pata al proponer esa expresión de más arriba y al
toque recibí dos o tres mails de advirtiéndome del peligro de lo que estaba
por hacer. Eso significa que hay que tener parte de la atención de uno
puesta en cuidarse de eso, que si no fuera por lo poco robusta que es la
iteración sería la manera más simple y natural de escribir la solución.
Y ni que hablar si el remove estuviera oculto en un mensaje enviado desde el
interior del bloque que se está iterando. La no robustez del iterador obliga
a no poder derivar el texto del interior del bloque a métodos que puedan
ignorar tranquilamente que están siendo usados dentro de una iteración.
Porque sino volvemos a quedar expuestos al mismo peligro.
Ese me parece un problema feo: el de estar obligado a tener en cuenta el
tipo de uso que se le quiere dar al o que uno está escribiendo. Es contrario
al tipo de trabajo que uno pretende hacer con objetos: No escribir para un
uso particular o para un objetivo cerrado sino por el contrario dedicarse a
escribir comportamientos ignorando expresamente para qué serán utilizados.
Saludos
--
Juan/.
----- Original Message -----
From: "Sebastián Calvo" <scalvo@...>
To: <smalltalking@...>
Sent: Monday, October 04, 2004 9:27 AM
Subject: Re: [objetos] duda
>
> Juan:
>
> ¿Cómos seria una iteración robusta?
>
> Saludos
> GallegO
>
> At 19:59 01/10/2004, you wrote:
>
> >Gracias Sergio y Guillermo.
> >
> >Es cierto. Hice la prueba con una OrderedCollection en Dolphin, y lo que
se
> >puede decir es que las iteraciones no son robustas para tomar el término
que
> >figura en le libro de Gamma.
> >
> >Me mandé un ejemplo de testeo:
> >
> >oc3 := ((1 to: 9) collect: [:each|each * each]) asOrderedCollection.
> >
> >oc3 an OrderedCollection(1 4 9 16 25 36 49 64 81).
> >
> >oc3 do: [:each |each % 3 = 0 ifFalse: [oc3 remove: each]].
> >
> >Si la iteración que lleva a cabo el #do: fuera robusta debería responder
> >solamente con los cuadrados de los múltiplos de tres: 9 36 81 (tres
> >elementos).
> >
> >Pero da el error UndefinedObject does not understand #%.
> >
> >y la colección queda en un resultado erróneo a pesar de que el error se
da
> >recién después de haber procesado todos los elementos:
> >
> >oc3 printIt => an OrderedCollection(9 25 36 64 81)
> >
> >Este resultado puede entenderse viendo la implementación del #do: y del
> >#removeAtIndex:
> >
> >El remove va contrayendo la colección, y el #do: sigue iterando por los
> >índices previos a todo remove.
> >
> >En definitiva, no son iteraciones robustas y hay que tenerles cuidado.
> >
> >
> >
> >Saludos y gracias por el dato.
> >
> >Juan/.
> >
> >
> >
> >
> >
> >
> >----- Original Message -----
> >From: "Guillermo Sapaya" <gsapaya@...>
> >To: <smalltalking@...>
> >Sent: Friday, October 01, 2004 5:26 PM
> >Subject: Re: [objetos] duda
> >
> >
> > >
> > > Holasss,
> > >
> > > > Haciendo algo así (donde clientes es la colección de todos tus
clientes)
> > > >
> > > > clientes do: [:each | each estaOcupado ifTrue: [clientes remove:
> >each]].
> > > >
> > >
> > > OJO con esto, te va a traer muchos dolores de cabeza ;-)
> > > NO deberías modificar una colección al mismo momento en que la estás
> >recorriendo...
> > > Yo no creo que quieras "perder" los clientes de tu coleccion original,
> >seguramente lo que
> > > deseás es una copia de esa colección en la que estén solamente los que
> >están libres, si
> > > hacés esto o lo que dice Esteban, tené en cuenta, que luego, nunca mas
vas
> >a poder
> > > acceder a tus "clientes ocupados" en el objeto en donde los estabas
> >referenciando.
> > > Ahora me doy cuenta que el mail anterior me salió con respuesta solo a
> >Nair...
> > > En el decía que hagas algo así en el objeto que conoce tus clientes:
> > >
> > > clientesLibres
> > > "Devuelve una coleccion con los clientes que se encuentran libres."
> > >
> > > ^self clientes reject: [:each | each estaOcupado ]
> > >
> > > De esta manera, obtenés los clientes libres mediante este mensaje al
> >objeto que conoce los
> > > clientes y NO perdés los "clientes ocupados". Es decir, si luego en
otra
> >instancia necesitás
> > > los clientes ocupados, por ejemplo, podrías hacer algo así:
> > >
> > > clientesOcupados
> > > "Devuelve una coleccion con los clientes que se encuentran ocupados."
> > >
> > > ^self clientes select: [:each | each estaOcupado ]
> > >
> > > Y en la coleccion de clientes seguis teniendolos a todos
> > >
> > > Saludos, Guiye
> > >
> > >
> > >
> > >
> > > Para más información sobre la Asociación escribir a
info@...
> > >
> > > Smalltalking es un espacio colaborativo creado para el estudio y
> >desarrollo en Ambientes de Objetos.
> > > Se sustenta gracias a la participación de sus socios.
> > >
> > > Las reglas de etiqueta sobre la lista están en
> >http://www.smalltalking.net/join/netiquete.htm
> > >
> > > Enlaces de Yahoo! Grupos
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> >
> >
> >
> >Para más información sobre la Asociación escribir a info@...
> >
> >Smalltalking es un espacio colaborativo creado para el estudio y
> >desarrollo en Ambientes de Objetos.
> >Se sustenta gracias a la participación de sus socios.
> >
> >Las reglas de etiqueta sobre la lista están en
> >http://www.smalltalking.net/join/netiquete.htm
> >
> >Enlaces de Yahoo! Grupos
> >
> >
> >
> >
>
> Saludos
> José Sebastián Calvo
> scalvo@...
>
>
>
>
> Para más información sobre la Asociación escribir a info@...
>
> Smalltalking es un espacio colaborativo creado para el estudio y
desarrollo en Ambientes de Objetos.
> Se sustenta gracias a la participación de sus socios.
>
> Las reglas de etiqueta sobre la lista están en
http://www.smalltalking.net/join/netiquete.htm
>
> Enlaces de Yahoo! Grupos
>
>
>
>
>
>
>