[Rio-pm] Perl 5.10 e Hash::Util::FieldHash

Lorn lorn.br em gmail.com
Terça Março 25 10:58:43 PDT 2008


Oi Breno, baseado no seu email ( não li o artigo do PerlTips :P ) eu estou
gostando muuuito do Moose, acho que todos deveriam testar :P é bem fácil e o
tutorial do CPAN é simples e direto.
Esse artigo é uma boa desculpa para estudar Moose :
http://blog.jrock.us/articles/Myth%3A%20Moose%20is%20an%20unnecessary%20dependency.pod

On Tue, Mar 25, 2008 at 1:04 PM, breno <breno em rio.pm.org> wrote:

> Abaixo, artigo da PerlTips. Aos programadores de plantão, uma
> pergunta: embora o autor comente o uso do tão falado Class::Std (do
> Conway) e do Object::InsideOut (do Hedden), ele cita o
> Hash::Util::FieldHash como uma ótima alternativa. Pessoalmente nunca
> usei o Object::InsideOut, mas o Class::Std parece mais um framework de
> OO (como o Moose - embora nunca tenha usado o Moose) do que qualquer
> outra coisa. Mesmo sendo do Conway, tenho certo receio em relação a
> performance por todas as coisas que rolam por debaixo dos panos, e
> pelo fato de não ser core. Já o Hash::Util::FieldHash me pareceu uma
> solução muito mais "Perlish", pq permite a criação de objetos
> inside-out de forma simples, preguiçosa e sem preocupações de DESTROY
> (contra vazamento) ou CLONE (para multithreading). E agora é core.
>
> Qual a percepção de vcs?
>
> []s
>
> -b
>
>
> ==== Perl 5.10 and Hash::Util::FieldHash ====
>
>   Perl 5.10 adds the ``Hash::Util::FieldHash'' module to the list of core
>   modules. Just like all of the other core modules such as ``File::Find''
>   and ``File::Temp'' this means that ``Hash::Util::FieldHash'' will now be
>   installed as standard with Perl for all versions from 5.10.0 onward.
>
>
> ==   Inside-out objects and Hash::Util::FieldHash   ==
>
>   Inside-out objects provide a method of strong encapsulation and
>   compile-time error checking using Perl's object oriented features. This
>   is done by keeping a separate hash for each object attribute, and using
>   a unique identifier for the object (commonly its memory address) to
>   access these attributes.
>
>   You can refresh your memory of inside-out objects at our Perl tip at
>   <http://perltraining.com.au/tips/2006-03-31.html>.
>
>   Unfortunately, inside-out objects have two common disadvantages:
>
>   1.  Care must be taken to clean-up your attribute hashes when your
>       object is destroyed (by going out of scope, for example). If you
>       don't do this, you can end up leaking memory.
>
>   2.  Care must be taken when memory addresses are used as hash keys, as
>       these addresses may change (potentially invalidating the object)
>       when using a forked or threaded process.
>
>   When working with inside-out objects, we recommend you use a helper
>   module like ``Class::Std'' or ``Object::InsideOut'' which can solve some
>   or all of these problems for you. However if these modules are not
>   suitable, or if you're working with existing code that does not use
>   them, ``Hash::Util::FieldHash'' provides a convenient and reliable way
>   to build inside-out objects.
>
>   Put very simply, a hash declared as a ``fieldhash'' has the following
>   attributes:
>
>   *   A reference can be used directly as a hash key.
>
>   *   This reference will alter itself appropriately if the process forks,
>       spawns a new thread, or otherwise causes the reference to relocate
>       in memory.
>
>   *   Our hash key is considered a *weak reference*, meaning that if the
>       only use of our reference is inside ``fieldhash'' structures, then
>       the entire key/value pair will be garbage collected. This provides
>       for automatic destruction of any objects that fall out of scope.
>
>   These properties mean that we can write inside-out objects without the
>   headaches of finding appropriate identifiers for our objects,
>   forking/threading issues, or garbage collection. It's also possible to
>   enable only *some* of the above features if we want more specific
>   behaviour (see "Further reading" below).
>
>   Imagine a playing card as an object: it would have a suit and a face
>   value (rank). We can use ``Hash::Util::FieldHash'' to simplify the
>   creation of this as an inside-out object. A minimal class may look like
>   this:
>
>           package PlayingCard;
>           use strict;
>           use warnings;
>           use Hash::Util::FieldHash qw(fieldhash);
>
>           fieldhash my %suit_of;
>           fieldhash my %rank_of;
>
>           sub new {
>                   my ($class, $rank, $suit) = @_;
>
>                   # This strange looking line produces an
>                   # anonymous blessed scalar.
>
>                   my $this = bless \do{my $anon_scalar}, $class;
>
>                   $suit_of{ $this } = $suit;
>                   $rank_of{ $this } = $rank;
>
>                   return $this;
>           }
>
>           sub get_suit {
>                   my ($this) = @_;
>                   return $suit_of{ $this };
>           }
>
>           sub get_rank {
>                   my ($this) = @_;
>                   return $rank_of{ $this };
>           }
>
>           1;
>
>   What's interesting about this example is what's missing. We don't need a
>   ``DESTROY'' method for memory management, nor a ``CLONE'' method for
>   threading. By declaring %suit_of and %rank_of with ``fieldhash'', this
>   work is already done for us.
>
>   We could use our playing card as follows:
>
>           #!/usr/bin/perl -w
>           use strict;
>           use feature qw(say);
>           use PlayingCard;
>
>           my $card = PlayingCard->new('ace', 'spades');
>           say 'My rank is ', $card->get_rank;
>           say 'My suit is ', $suit->get_suit;
>
>           {
>                   my $card2 = PlayingCard->new('king', 'diamonds');
>                   say 'My new card rank is a ', $card->get_rank;
>           }
>
>   $card2 will automatically be destroyed and its memory garbage collected
>   at the end of its block.
>
>
> ==   Further reading   ==
>
>   To find out what other modules have been included in the core read the
>   Perl delta for 5.10.0 at <http://search.cpan.org/perldoc?perl5100delta>.
>   To learn more about ``Hash::Util::FieldHash'' read
>   <http://search.cpan.org/perldoc?Hash::Util::FieldHash>.
>
>   More information about ``Class::Std'' can be found at
>   <http://search.cpan.org/perldoc?Class::Std>, and more information about
>   ``Object::InsideOut'' can be found at
>   <http://search.cpan.org/perldoc?Class::InsideOut>.
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>



-- 
Lindolfo "Lorn" Rodrigues
- www.slackwarezine.com.br
- http://lornlab.org
- http://sao-paulo.pm.org
use Catalyst;
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/rio-pm/attachments/20080325/47fa8169/attachment-0001.html 


Mais detalhes sobre a lista de discussão Rio-pm