in reply to Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?

This depends on your design decisions!

Looks like you have a bidirectional membership relation, implemented with references (which isn't the only way to do it, see below)

If I were you I'd first think hard about the membership semantics you want and consequently how deletion is supposed to work.

What are your desired N to M relations ?

And after that deletion semantics

Most of us have more or less similar answers based on experience with filesystem operations, but yours might be different. But FS differ and some have inodes, symlinks, hardlinks, etc...

Furthermore: as indicated, you don't necessarily need to use (circular) references to design this relation. Like with symbols for references

So you could also have class variables'%instance' collecting objects for each class (i.e. all files, all directories) with identifiers as keys and object references as values. (A possible natural unique ID is just the stringification of the reference plus timestamp)

Just store the related IDs now in the objects

Of course you'll have to design the necessary delete or DESTROY methods now on your own, to clean up broken relations after an object is deleted.

Cheers Rolf
(addicted to the Perl Programming Language :)
see Wikisyntax for the Monastery

  • Comment on Re: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object? (design decisions)

Replies are listed 'Best First'.
Re^2: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?
by nysus (Parson) on Jan 21, 2024 at 16:54 UTC

    Thanks. But what do you mean by "symbols for references?" Are you referring to something like this: Symbolic references?

    $PM = "Perl Monk's";
    $MC = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar Parson";
    $nysus = $PM . ' ' . $MC;
    Click here if you love Perl Monks

      A unique textual identifier for each object. A name following rules and closely coupled to an object.

      To get the actual reference, you'll call a class method like My::File->get_obj(symbol) to lookup in %My::File::instance

      That's the "weakest" way...

      Update

      This allows to designs systems where warnings like "object (File/Directory) doesn't exist anymore" are possible. Think inodes!

      Also keep in mind that Perl can reuse refs for new variables after destructions, tho I doubt this happens when there is still a weakened ref around. (?)

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      see Wikisyntax for the Monastery

        Also keep in mind that Perl can reuse refs after destructions, tho I doubt this happens when there is still a weakened ref around. (?)

        If all the strong refs to an object go away, it gets freed; there is nothing stopping the memory being reused after that.

        When a reference is weakened, a flag is set on the reference, and a record of the reference is added to a list of weakrefs attached to the object (stored under PERL_MAGIC_backref magic). When the object gets freed, it uses that list to set the affected weakrefs to undef to keep things safe.

        Note that the weakrefs are stored as a simple list, so freeing a weakref can get expensive when an individual object has many weakrefs to it: it has to do an O(n) scan of the list to find the entry to remove, so removing all of the weakrefs individually is O(n^2) whereas removing them in one go by freeing the object is O(n).