Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^2: Is modifying the symbol table to redefine subroutines evil?

by dewey (Pilgrim)
on Apr 11, 2007 at 22:39 UTC ( #609514=note: print w/ replies, xml ) Need Help??


in reply to Re: Is modifying the symbol table to redefine subroutines evil?
in thread Is modifying the symbol table to redefine subroutines evil?

I object to that "easier" approach because it confuses the intent of the code; data which should be hidden from the rest of the program is revealed when you use global state this way.

A function is a piece of code lumped together to serve some purpose; the function name represents this purpose in your code. I've been influenced heavily by functional programming, but I think that programs are the most readable when functions "do the same thing" with respect to the rest of the program each time they are called; that way, when reading code you don't have to maintain a lot of state in your head to predict behavior.
There are two possibilities for the "evil" code:
  • The first call and the subsequent call "do different things" with respect to the rest of the program, in which case they should NOT be done by the same function. Two different tasks, two different functions.
  • The first and subsequent calls "do the same thing" with respect to the rest of the program. For example, Re: Is modifying the symbol table to redefine subroutines evil? shows a function which seems to do the same thing each time from outside the function, but uses the "evil" construct. In this case, putting them both in the same function is appropriate, but your solution of having global state means that you have some information which is not useful to you and which should really be hidden from the rest of the program (since all calls "do the same thing").

Update: Re^3: Is modifying the symbol table to redefine subroutines evil? suggests using a lexical closure. That seems fine to me too, I just don't like the globals much.
~dewey


Comment on Re^2: Is modifying the symbol table to redefine subroutines evil?
Re^3: Is modifying the symbol table to redefine subroutines evil?
by perrin (Chancellor) on Apr 11, 2007 at 23:17 UTC
    Here it is without globals:
    { my $foo_has_been_called; sub foo { if (not $foo_has_been_called) { call_me_only_once(); $foo_has_been_called = 1; } } }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://609514]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (10)
As of 2014-08-20 15:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (118 votes), past polls