The blogger agrees that you should make your object's data available
to the outside world in a way lets you change the underlying
implemtation when you need to.
In Java, it seems like the "best practice" is to copy and paste a bunch
of identical get/set methods.
The blogger seems to be against copying and pasting when native language
features can give you the same benefit. With Python (apparently) you
can use the built-in features to make public attributes that can be
transparently upgraded from simple attributes to get/set methods,
without changing the API:
contact.email = "x@x.com"
Behind the scenes this can be implemented by a simple attribute
variable or a get/set method. The user of the object doesn't care.
This feature isn't built in to Perl 5. If you break
encapsulation and access the underlying hash keys directly:
$contact->{'email'} = "x@x.com";
Then you can't protect the access without a tied hash.
On the other hand, if you wrap the accessor in a method:
$contact->email("x@x.com");
Then you have to copy and paste multiple identical get/set methods.
The better solution is to let a module generate the methods for you.
For instance,
Attribute::Property
(which looks excellent, BTW - thanks for pointing it out, wolv!),
automatically makes methods that are assignable like hash elements:
# module code
sub email : Property;
# ...
# user code
$contact->email = "x@x.com";
When you need to upgrade 'email' to do some validation, you can
change the accessor into a full sub:
# module code
sub email {
# do some validation or processing here
}
# ...
# user code - API stays the same.
$contact->email = "x@x.com";
Michael
|