Object references

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Object references

Miguel Cobá
Hi all,

I have a question regarding the correct use of object references. Maybe
this has already been asked before. If so, I will thank any pointer.

I have a ClassA that contains a collections of objects of ClassB

Object subclass: #ClassA
        instanceVariableNames: 'list'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Test'

ClassA >> list
        ^ list ifNil: [ list := OrderedCollection new ]

Object subclass: #ClassB
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Test'

ClassA can add and remove objects of ClassB at any time.
When a ClassB object is removed from ClassA, the object is not needed
anymore so, as nobody else references it, the Garbage Collector dispose it.
That is ok, and the intended behavior.

Now, after a time, a new class named Group was created, to manage lists
of objects of classB, imagine a kind of bookmark.


Object subclass: #Group
        instanceVariableNames: 'list'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Test'

Group >> list
        ^ list ifNil: [ list := OrderedCollection new ]


This class needs to work the following way:

- I can add and remove objects of ClassB to a Group any time.
- When an object of ClassB is added to a Group, there are 2 references
to the object.
- When an object of ClassB is removed from Group, the reference to
ClassB object from Group is removed and now only ClassA has a reference
to the object.

But:
- If I remove the object from ClassA, the object must also be removed
from Group, because the Group can only reference objects of ClassB that
are actually part of a ClassA object.

I think that this behavior can be achieved the following way:

When deleting an object of ClassB from an object of ClassA, all the
Groups must be scanned to search for ocurrences of the object of ClassA
and remove it from Group and then remove it from ClassA

This has the following drawbacks:
- is not atomic, must remove from 2 places to succed
- is slow if there a lot of object in each group
- is, appears to me, not elegant.

I can also add a reference in each ClassA object to its ClassA parent
and a list of references to the groups the object is part of.

This is even trickier, because you now must update both the ClassA and
the ClassB each time you associate an object with another.

The question is. When you have an object that is referenced from many
places, but only one of them is the correct according to the problem
domain, how do you manage the adding, removing and updating of the
object to the other interested?

Is there a guideline here?

Thanks for the advise,
Miguel Cobá

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Object references

Nicolas Cellier-3
Miguel Enrique Cobá Martínez <miguel.coba <at> gmail.com> writes:

> snip... (sorry, gmane want this)
>
> The question is. When you have an object that is referenced from many
> places, but only one of them is the correct according to the problem
> domain, how do you manage the adding, removing and updating of the
> object to the other interested?
>
> Is there a guideline here?
>
> Thanks for the advise,
> Miguel Cobá
>

What you need is a WeakArray or some cousin of it.
Browse this class and examples of use.

Nicolas





_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Re: Object references

Miguel Cobá
Oh, yes, that's just what I need. From the class comment of WeakArray:

"WeakArray is an array which holds only weakly on its elements. This
means whenever an object is only referenced by instances of WeakArray
it will be garbage collected".

Thank you Nicolas.

On Tue, Apr 21, 2009 at 10:14 AM, nicolas cellier <[hidden email]> wrote:

> Miguel Enrique Cobá Martínez <miguel.coba <at> gmail.com> writes:
>
>> snip... (sorry, gmane want this)
>>
>> The question is. When you have an object that is referenced from many
>> places, but only one of them is the correct according to the problem
>> domain, how do you manage the adding, removing and updating of the
>> object to the other interested?
>>
>> Is there a guideline here?
>>
>> Thanks for the advise,
>> Miguel Cobá
>>
>
> What you need is a WeakArray or some cousin of it.
> Browse this class and examples of use.
>
> Nicolas
>
>
>
>
>
> _______________________________________________
> Beginners mailing list
> [hidden email]
> http://lists.squeakfoundation.org/mailman/listinfo/beginners
>
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners