Language mavens: Is there a programming with "if then else ENDIF" syntax?
Steven D'Aprano
steven at REMOVE.THIS.cybersource.com.au
Wed Nov 18 20:42:44 EST 2009
On Wed, 18 Nov 2009 17:14:27 -0800, Steve Howell wrote:
> In my rewritten code, here is the smell:
>
> dispatches = {
> 'dict': _dict,
> 'list': _list,
> 'attr': _attr,
> 'key': _key,
> 'as': _as,
> 'call': _call,
> 'recurse': _recurse,
> }
> if kind in dispatches:
> return dispatches[kind](ast)
> else:
> raise Exception('unknown kind!')
>
>
> There is nothing wrong with the code taken out of context, but one of
> the first things that lexical duplication should alert you to is the
> fact that you are creating code that is brittle to extension.
Really? It is very simple to extend it by adding another key:item to the
dict.
> In my
> example, the reference to _dict is 36 lines of code away from its
> implementation, which forces indirection on the reader.
It gets worse -- the reference to the in operator is in a completely
different module to the implementation of the in operator, which may be
in a completely different language! (C in this case.)
I'm being sarcastic, of course, but I do have a serious point. I'm not
impressed by complaints that the definition of the function is oh-so-very-
far-away from where you use it. Well duh, that's one of the reasons we
have functions, so they can be used anywhere, not just where they're
defined.
If a function *only* makes sense immediately where you use it, then the
level of coupling is too great and you should either reduce the coupling
or bite the bullet and live with all the hassles of inline code. (Code
duplication, difficulty in testing, etc.)
Of course it would be convenient if, having noticed the reference to
(say) function _recurse, you could see its definition without needing to
do more than just glance up a line or two. But you should rarely need to
care about the implementation -- that's another point of functions. You
should be able to treat _recurse as a black box, just as you use the
built-in function len as a black box without needing to see its
implementation every time you use it.
--
Steven
More information about the Python-list
mailing list