http://qs321.pair.com?node_id=310013


in reply to Why get() and set() accessor methods are evil

Your example is breaking encapsulation. That is, it is avoiding the accessor and reaching in to the internals. If we have the object:
package OOtest; sub new { my $invoker = shift; my $class = ref($invoker) || $invoker; my $self = {}; bless ($self, $class); $self->{list} = []; return $self; } sub get_array { my $self = shift; return $self->{list}; }
To access the array, use the accessor get_array and do not bypass it by delving in and directory accessing the private variable.
my $obj = OOtest->new(); # NOT foreach my $tmp ( @{ $obj->list() } foreach my $tmp ( @{ $obj->get_array() } ) { # process list }
Now, internally, you want to change OOtest to use a hash, but you do not want to break other code that expects it to use (and wants) an array. Behold the beauty of accessors, you merely change the get_array subroutine.
package OOtest; sub new { my $invoker = shift; my $class = ref($invoker) || $invoker; my $self = {}; bless ($self, $class); $self->{list} = (); return $self; } sub get_array { my $self = shift; return values %{$self->{list}}; # anything asking for an array gets + it }
enoch