Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: using eval or equivalent to automatically generate my statements

by Athanasius (Monsignor)
on Dec 13, 2012 at 14:17 UTC ( #1008664=note: print w/ replies, xml ) Need Help??


in reply to using eval or equivalent to automatically generate my statements

Hello ISAI student,

To expand a little on tobyink’s answer:

My reaction to your question is: Take a step back, and look at the wider picture. Modularity is an excellent goal, but why? Because a script composed of self-contained modules, loosely coupled together, is easier to debug/maintain/enhance than a monolithic script “riddled with global variables” (to use your words). But conversion of global variables into lexical variables is a means to this end, not a goal in itself. The aim is to produce modularity and loose coupling: global variables shared across a script entail tight coupling.

Now, I could be wrong, but it seems to me that your proposed solution is to retain global variables in all but name — to have the same variables shared across the whole script, but to make these variables lexical via a monster hash which is passed by reference to all the subroutines. The likely result is that you will end up with the same tight coupling as before, but implemented in a more complicated syntax which is even harder to debug/maintain/enhance than the original.

The bottom line is this: If you want the benefits of modularity, you must have loose coupling. And to achieve loose coupling, you must identify which variables need to be shared between modules, and refrain from sharing any which do not. For this, there is, alas!, no easy fix — you have to re-design and re-factor before you can re-code. And the measure of success is this: the end result must be simpler and clearer than the original.

I know this advice is not what you were hoping to hear, but I think it’s good advice all the same. I hope it helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,


Comment on Re: using eval or equivalent to automatically generate my statements
Re^2: using eval or equivalent to automatically generate my statements
by ISAI student (Scribe) on Dec 14, 2012 at 07:30 UTC
    The answer is yes and no. refractoring the entire script is not an option for me right now. The script is with some bugs and not all that stable. The coupling may not be made looser for the global variables, but still, fixing bugs and adding functionality is easier on the human mind when the code is broken into many files, and use strict is applied. Although actually two monster hashes are used, the rest is very loosely coupled, instead of having almost everything coupled. The added complexity due to a few hash deferencing is linear. The added complexity of a multitude of lines of code and not using use strict is exponential (at least to me, I am an EE, not CS person). Even in Ruby, the self proclaimed OO queen, one can still globally loop on all instances of a certain class. This is a lexical analog , in a sense, that I have just 1 instance of this 1 "class". Some things, in any script that I know, are global (environment variables, for instance), this is, in a way for the usage fo these two hashes, similar. I need the management buy in to do what you suggest, and not w/o reason, I do not have it. I do understand where you come from, and would very much like to accept your offer, but it's not just up to me. Thank you for time.

      Yes, I can see that re-design is not an option for you at the moment, and I agree that modularising and adding use strict will aid both debugging and enhancement.

      But why make it all so complicated? You can have lexical variables which are strict-compliant and still package-global — just use our instead of my:

      # File: main.pl #! perl use Modern::Perl; use Foo; our $Id = 42; Foo::foo_id(); say 'In main, $Id is ', $Id; ... # File: Foo.pm package Foo; use Modern::Perl; sub foo_id { say 'In Foo, $main::Id is ', $main::Id; $main::Id = 17; } 1;

      Output:

      In Foo, $main::Id is 42 In main, $Id is 17

      You can of course get fancier with @EXPORT, @EXPORT_OK, etc., but using the fully-qualified package names is probably a better strategy as it makes the trail of the global variables self-documenting.

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

        I didn't use PERL's our becaue I know PERL not as well as you do.

        That's the root cause of me being on this site, asking nebiew's questions... Thanks for the lead.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (7)
As of 2014-09-21 20:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (175 votes), past polls