On Wednesday 18 February 2009 18:05:13 Roger Hall wrote:
> All,
>
>
>
> I'm a fan of Class::Std and Dr. Conway's efforts, but I'm bemused by a
> failing perlcritic test on a new module. I used a hash reference to hold
> several values to make it easier to dump with YAML, so my code is peppered
> with code like this:
>
>
>
> $config->{query}
>
>
>
> Perlcritic complains that "Private Member Data shouldn't be accessed
> directly" because "Accessing an objects data directly breaks encapsulation
> and should be avoided". I get that. Only problem: it's not an object. It's
> just a hashref.
Well, if I understand the ideology behind this warning in your case, then
using a $config->{CONSTANT} where CONSTANT is any Perl constant string like
say $config->{'name'}, $config->{'query'}, $config->{'address'} etc., is a
Perl anti-pattern. That's because if you want to collect several values into
one, then you really should use an object for that (while using accessors,
etc.). I'm not saying I support it, but it's a valid philosophy.
I think $hash_ref->{$key}, where $key is any Perl variable or non-constant
expression, should be fine, because then you use the $hash_ref as a bona-fide
keys->values mapping (instead of a C-like struct), which is a valid use.
You can always exclude this particular P::C check from the .pm files where
this pattern is exhibited, if you want.
Regards,
Shlomi Fish (who doesn't like Inside-out objects)
--
-----------------------------------------------------------------
Shlomi Fish http://www.shlomifish.org/
Parody on "The Fountainhead" - http://xrl.us/bjria
<mauke> I'm not interested in what you're doing; what are you trying to
achieve?
<PerlJam> mauke: I'm trying to achieve world peace and this regex is
the last thing standing in my way! ;)