[Q] Newbie - Multiple Return Values
Donald Major
Donald.Major at sas.com
Thu May 1 18:00:06 UTC 2003
I'll grant all those arguments -- I'm just showing my LISP and PERL
experiences, where it's you're only choice in one, and more convenient
in the other (gotta love that "( $fee, $fie, $foe ) = &fum();" syntax in
PERL :-)).
Boris Gaertner wrote:
>
> Ingo Hohmann <ingo at 2b1.de <mailto:ingo at 2b1.de>> asked about ways to
> represent
> multiply return values and he got some interesting answers.
>
> I agree with Cees that code like
>
> result := foo doSomething.
> (bar := result at: 1) > 0
> ifTrue: [self error: (result at: 3)]
> ifFalse: [^result at: 2]
> is a candidate for easy improvements. Yes, it is of course possible to
> use an Array and it works, but
>
>
> * when you use a class - say: MyStructuredMessage - you can use
> the option "class refs" of the browser to find all methods that
> reference the class. You can of course also ask for all
> references to class Array, but in our newest standard image the
> browser will disappoint you with almost 2.000 methods. It is
> then your task to find out what all these methods do and which
> are the ones that you are looking for.
> * when you use methods with specific names, you can search for
> both the senders and the implementors. This is often very
> helpful. You can of course search for all senders of method
> 'at:' but you have to know that this method is defined in the
> instance protocol of Object (and inherited by Array) and you
> will get more the 3.500 senders (in out standard image)
> * as Cees pointed out, method names are much more informative than
> array indices. Users of your code will find it easier to read
> 'result payload' 'result status' 'result checksum' than (result
> at: 1), (result at: 2) and so on. You should also not
> underestimate the possibility that you want to change the format
> of you structured return value for some reason. Consider the
> following situation:
> o You have a value *Array with: payload with: checksum
> with: state*
> o Somewhere in your code you access the state with (array
> at: 3), in other places you write (array last)
> o You did not anticipate it, but for some reason you have to
> add a fourth data field to your value. To keep the
> expression (array last) correct, you cannot add the new
> field after the last one, and to keep the expression
> (array at: 3) correct, you have to add the new field after
> the third field which is the last one. You have now all
> reason to rethink your use of an array.
>
> There is a related problem and I want to explain that too, because it
> is one of the most costly mistakes that I ever made (in Smalltalk, not
> in life)
>
> I had a lot of cooperating classes and in the instance protocol of all
> these classes I had methods with identical names (I wanted to use
> polymorphism and that was ok). Initially these methods had a small
> number of parameters, but later I had repeatedly to add additional
> parameters. Every time I needed a new parameter, I added that new
> parameter to all these methods and than I updated all senders. Finally
> I removed all the obsoleted methods. I can only regret my foolishness,
> but it took me some time to understand that I failed to define a class
> for all my parameters. (I was even not smart enough to use an array!)
> Now that I have understood that, the introduction of an additional
> parameter is very easy. I add an instance variable and access methods
> to the class that keeps all the parameters and I have to rework only
> the methods that have to access the additional parameter.
>
> Given this experience, I think now that is is not best practice to ask
> "Do I really need a class?". It is - in my opinion - much better to
> ask: "What problems will I incur when I do not define a class?"
>
> By the way, I agree that the use of exception is not always a good
> solution. Use of exceptions becomes increasingly difficult when you
> have to handle additional data elements (the equivalent of adding
> instance variables to a class)
>
> Just my 2 eurocents,
> Boris
>
>------------------------------------------------------------------------
>
>
>
>
--
.. Donald Major "Tech Support..your Windows machine doesn't
dtm SAS Institute Inc. work? Have you tried installing a Macintosh?"
Cary, NC 27513 - me SAS - "The Power to Know"
AKA "Ol' Baby Lee"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20030501/e4d1c3f2/attachment.htm
More information about the Squeak-dev
mailing list
|