Erwin Abbott
5/28/2007 3:08:00 AM
On 5/27/07, dblack@wobblini.net <dblack@wobblini.net> wrote:
>> I think it works pretty well, but I'd like to know what you prefer
>> instead. I realize distinguishing objects by class is not encouraged,
>> but I find myself needing it often, for better or worse.
>
> But you're running aground on exactly why it isn't encouraged: namely,
> it doesn't give you definitive information about the object's behavior
> or interface.
Say you have some method that accepts various objects that represent a
time. It's job is to return true if the given time is more than a week
old. We have DateTime, Time, Date, and probably some more I don't know
about. We can test that these objects have a comparison operator, and
not pay attention to their class, but that doesn't help me because
Date.new < Time.now doesn't work. In fact, Date's <=> checks if it was
passed an Integer or a Date object, because knowing the object's class
is necesarry to know how to compare them.
I don't see any other way to write that method, am I missing
something? It seems the most definitive information about any objects
behavior is its source code, next to that we can ask what class it is
and look up the documentation. I agree distinguishing objects by class
has its problems, like Date#<=> doesn't work with anything but Dates
and Integers (when maybe it should be testing respond_to? :ajd when it
isn't given an Integer), but is there a better alternative?
> Are you sure a mixin wouldn't make more sense?
Instead of using a proxy? It's a trade-off at this point between
getting case to work and having to write code that can't use intstance
variable names like @id or @name because the original object might
already be using them, or having to alias an existing #name as
#old_name and making sure my #name doesn't break any code in that
class. I might still break something with a proxy class answering
#name, but it won't break the underlying object when it calls name on
itself. I think at this point I'll accept that case statements won't
work, but I'm going to try a few other things before giving up.
Regards,
Erwin