A little disappointed so far

Graham Nicholls graham at rockcons.co.uk
Sun May 18 22:57:48 EDT 2003


Jay O'Connor wrote:

> On Mon, 19 May 2003 02:36:53 +0100, Graham Nicholls
> <graham at rockcons.co.uk> wrote:
> 
> 
>>Thanks again.  I'll be browsing for a while :-)
> 
> Your welcome.  The capabilities you want are all easy to do, but they
> all come in modules you import so you have to read the modulae
> documentation to learn about them
> 
> 
>>> Actually, from a Smalltalk pure OO background I find that case
>>> statements are superflous in OO languages and had been programming
>>> Python for about 8 months before I even wondered if the language had
>>> them :)
>>>
>>How do you handle, say
>>if arg == 'd':
>>        switch on debug
>>if arg == 'v':
>>        switch on verbose
>>        
>>etc ?
> 
> Well...it a very simple case, probably a lot like that but with a
> break to not have to test each condition :)
pedant! :-)
> 
> if arg =='d':
> debug = 1
> break
> if arg == 'v':
> verbose = 1
> break
> 
> etc...
> 
> 
> However, back to my real point...
> 
> From one level, in an OO sense, a case statement is really testing the
> state of one object, and then performing some operation.  Well, from
> an OO point of view, if you are testing another object to do
> something, might as well just give that responsibility to the other
> object and allow polymorphism  to handle the particulars.  For
> example, rather than testing a shape if it is a cricle, and then
> drawing a circle, or a square, etc...yuo simple call 'draw()' on the
> shape and let polymorphism handle that the correct version of draw()
> for cicles, squares, etc.. is called (I acn post a code exmple if you
> would like).  
If its not too much trouble...
> An often used part of this a technique called double
> dispatch (where when you call to the object, in a general way, it
> calls back to you in a specify way..again I can provide a code
> example)
ditto...
> 
> So, from a 'proper OO' perspective, for the most part, cases
> statements are superflous and actually not to be desired as you are
> not properly distributing responsibilites to the right objects.  As a
> matter of fact, I'm not a big fan of long is statements for the same
> reason.
> 
> This works for most situations. Testing characters is kinda a
> pathological case in that characters are not normally real objects
> that can be distinguished with polymorphism.  From
> 
> 
> For simple cases, I'd probably do like above.  It's not really that
> much worse than
> 
> case (arg)
> switch ('d') {
> debug = 1;
> break}
> switch ('v") {
> verbose = 1;
> break
> 
> or similar.
> 
> For more complicated situations, I'd probably use some sort of
> dictionary dispatch mechanism.  Here's one isuing a dictionary keyed
> off of the arg with the values as references to functions defined
> earlier.
> 
> def cased():
> #do lost of stuff here
> 
> def casev():
> #do lots of stuff here
> 
> 
> cases = {'d":cased,
> 'v':casev}
> 
> case = cases(arg)  # llookup what function to call
> case()                                # call it
> 
Aha - thats exactly what I was hoping to be able to do in my arg handling,
and was disappointed that I couldn't - thanks !  Might be a bit verbose for
handling a simple debug/verbose switch, but in general is exactly what I
want.

> You could do something similar with class methods in a Case class
> 
> 
> Again, it really depends in the level of complexity.  In any more
> complex logic, I find using other OO tools such as polymorphism to be
> more powerful in the long run.  For medium complexity tasks, I like to
> use dictionaries where the key is what I am testing and the value
> is..some mechanism that will do what I need.  For simple tasks and if
> with break works fine.
> 
> Hope that helps.
> 
> Take care,
> Jay
Excellent, Thanks.

-- 
Graham Nicholls
All round good guy.




More information about the Python-list mailing list