[Tutor] Better structure?

Jacob S. keridee at jayco.net
Tue Feb 1 05:38:03 CET 2005


Ah, I like.

BTW, it was a few months ago, not days... but the thought still counts. At 
least you remember.
I was getting stumped by the difference in comparing y
The check for seeing what the first word is made me slamp my forehead...

Thanks!
Jacob Schmidt


>
>
> On Mon, 31 Jan 2005, Jacob S. wrote:
>
>> I think this thing is screaming for better structure, but previous 
>> attempts
>> at using oop for it have failed.
>
>
> Hi Jacob,
>
>
> Ok, I see one big refactoring that should help things quite a bit.
> There's a large case-analysis off if/elif/elif statements that involves
> 'y'.  Let me just grep for the lines here:
>
>>     if y == 'clear':
>>     elif y == 'quit':
>>     elif y == 'remove lines':
>>     elif y == 'return lines':
>>     elif y.startswith('gatl'):
>>     elif y.startswith('ganl'):
>>     elif y.startswith('gotl'):
>>     elif y.startswith('gonl'):
>>     elif y.startswith('getpt'):
>>     elif y == 'regraph':
>
>
> The structure can be improves by using that dispatch-table method we
> talked about a few days ago.
>
>
> We can't directly apply the dispatch technique, because there's a little
> bit of nonuniformity.  Some of the statements compare y by equality, while
> others use 'startswith' checks.  But I think we can handle it by making
> everything a little bit more uniform: we can make everything an 'equality'
> check against the first word on the line.  Here's some pseudocode for the
> proposed fix:
>
>
> ### Pseudocode
> commandDispatchTable = {'clear'  :  clearCommand
>                        'quit'   :  quitCommand
>                        'remove' :  removeCommand
>                        'return' :  returnCommand
>                        'gatl'   :  gatlCommand
>                        'ganl'   :  ganlCommand
>                        'gotl'   :  gotlCommand
>                        'gonl'   :  gonlCommand
>                        'getpt'  :  getplCommand
>                        'regraph':  regraphCommand
>
> def evaluate(line):
>    """Evaluates the line."""
>    pieces = line.split()
>    cmd, rest = pieces[0], pieces[1:]
>    if cmd in commandDispatchTable:
>        dispatchTable[cmd](rest)
>    elif isAssignment(line):
>        ...
>    else:
>        ...
> ###
>
> The evaluate() function tries to handle the common-case stuff with a
> dispatch-table method, and otherwise follows up with special-case stuff to
> handle the rest of the case analysis.
>
>
> One other neat feature of this is that, because we split() against the
> whole line, we've broken down the line into 'cmd' and the 'rest' of the
> arguments to that command.  This might also help clean up some of the
> logic that grabbing the argument on the rest of the line,
>
>    step2 = float(y.lstrip("gatl "))
>    x = float(y.lstrip('gotl '))
>    x = float(y.lstrip('gonl '))
>    y = y.lstrip("getpt ")
>
> You can avoid doing so many lstrip()s by using the 'rest' argument list.
>
>
>
> Best of wishes to you!
>
>
> 



More information about the Tutor mailing list