I’m continuing my learn-to-write-OO-Ruby journey. Had a recent bad
experience trying to convert a complex method to a class. The method
gets a lot of use in my program, and each time it needs to know a lot
about the environment outside itself. I found myself having to write a
ton of instance variable data into the class instance to get it to do
its job, before I called it each time, then read a few more back out to
get the results. It was awful. What had been a one line call was now
about 14 lines of code. Ack! I gave up and converted it back to a
method, which simply makes more sense. I could not find any
“class-magic” in this experience - just a lot of locked doors.
I now have three questions. I have read a number of people’s accounts of
what classes are and how you build them, etc., etc., and no one seems to
address these matters at all well (or else I missed it):
- HOW do you use a class?
I was assuming that since I couldn’t pass data to an instance, after
creation, I have no option but to write data into its instance vars as
needed. Sometimes, it seems there simply is no other option.
But, is it approved practice to do something like
junk = MyClass.new( var_1…var_n ).mymethod
which creates an instance and calls a method which leaves its results in
some instance vars., then simple read the results with…but how?
there’s no instance object! (Not that I can find, anyway.) That seems to
leave me only with this possibility:
myclass = MyClass.newMyClass.new( var_1…var_n )
varA = myclass.var_whatever
etc…until I have all my results back out of the instance.
Compared to a simple method call, this seems designed to make me crazy
quickly. Is there a better way?
Then, to call the instance again, I have to write new data into its
instance vars. This simply looks like nonsense, unless one really needs
to have the encapsulation that an instance offers. Am I missing
something? Is this just the facts of life when using classes?
- Is it accepted practice to simply create a new instance every time
the class is needed, thus setting the instance’s state once, using it
with one or more method calls, then moving on to the next new instance?
It occurs to me that maybe Ruby’s garbage collection would sweep the old
instance right up, knowing it won’t be used again, but I don’t know.
My nightmare case is a class which operates on an input record, but
differently each time, depending upon a number of factors in the
environment outside the class. I just can’t see a graceful way to do
this. I’m struggling to see why I do OO programming at all in this case.
- Finally, I’m still struggling with the “when do I make something a
class?” question. I’m surprised that this question is so unimportant or
its answer so obvious that no one much addresses it. Dave T., in his
3rd ed. (I just upgraded, and its really nice!) finally gives two
sentences to the matter, which is way more than I can find anywhere
else: “Whenever you’re designing OO systems, a good first step is to
identify the things you’re dealing with. Typically each type of thing
becomes a class in your final program, and the things themselves are
instances of these classes.”(p. 59)
I’ve been thinking only in terms of functions, things my program does,
and not things it works on or with. Both are relevant, clearly, and I’m
now out on a hunt for “things” that are more than functions. Maybe that
Anyone have any additional advice about “when to make something a
class?” The principle reasons I see are to achieve scope closure,
persistent state, and object duplication (multiple instances). Did I
miss anything important?
I come to the list with these questions only after days of struggle,
with lots of code, some of it a rather nasty experience (errors I’ve
never ever seen before!!!). The questions above are the ones I simply
have not been able to resolve, and any help offered will be gratefully
The easier one (probably):
Tom C., MS MA, LMHC - Private practice Psychotherapist Bellingham, Washington, U.S.A: (360) 920-1226 << email@example.com >> (email) << TomCloyd.com >> (website) << sleightmind.wordpress.com >> (mental health weblog)