I am a strong proponent of the "top-down" approach.....I feel it makes my
Perl code easier to read/follow.
I quote from "Learning Perl" that "[The subroutine] definition can go
anywhere in the program file, though 
most people put it at the end".

:-)

> Anthony (Tony) Esposito
> Senior Technical Consultant 
> Inovis(tm), formerly Harbinger and Extricity
> 2425 N. Central Expressway, Suite 900 
> Richardson, TX  75080 
> (972) 643-3115 
> [EMAIL PROTECTED] 
> 


-----Original Message-----
From: R. Joseph Newton [mailto:[EMAIL PROTECTED]
Sent: Tuesday, April 01, 2003 1:31 PM
To: Aim
Cc: [EMAIL PROTECTED]
Subject: Re: Problem with script.


Aim wrote:

> Hi,
>
> Thanks for your input. I thought my script was neat and organised and
utilised subs, I guess my standard is much lower than yours.

It's not really an issue of lower or higher standards.  When we are in the
thick of it, it all makes sense.  We have a few million neural circuits
patterned to the elements of the problem, and the context seems quite clear.

While we are in the thick of it.

> I try not to use too many subs as most of my scripting is short and
simple, and I fear overkill if I do use subs. But your advice on mental
powers seems to be true, I am now finding it difficult to cure what can only
be a simple bug.

This is what they call the "teaching moment."

> Going back to the drawing board may be inefficient in this case as the
script is almost there, I can feel it. The mistake I made was pausing from
the work for a few days and then to come back to it scratching my head.

If you feel that this stage of your project is very close to completion, it
might be wrth the digging just to get a prototype up.  Bjarne Stroustrup,
the creator of C++, made a very good popint about prototypes:
"Prototypes are to be used, then thrown away."

There have been a few times that disaster--having days worth of work go up
in a flash because I had failed to save and then had my IDE crash--turned
out to be of benefit.  Usually, I could reconstruct the work in a fraction
of the time it took first time around.  I could also reformulate from the
base some awkward constructs that had been crwling under my skin.

> I will await further responses at the same time give debugging another
shot and if it does not work I will have to follow your advice.
>
> Many thanks.

I would leave it to your judgement whether you can make use of the existing
structure for your immediate phase.  If you want to do this, I would
strongly recommend adding documentation to your script.  Do perldoc perlpod
for the reference on inline documentation.  You can scan through you lib
directoies and read some *.pm files to get an idea of how the protocol is
used.  This at least is critical.

You need some plain-language description of the fuctionality expected, and
what part the various sections of code are meant to play in it, in order to
have context in which to evaluate whether the code is working, or do decide
what needs to be done to make it work better.

I'm actually moving back towards the elimination of scripting content from
my Perl.  This doesn't apply so much to the short sample scripts I use to
test isolated concepts, but I don't think I would start a new real-life
program with any critical data declared in the global namespace.  One
advantage to this approach is self-commenting--an appropriately chosen name
for the driver routine communicates the overall purpose of the process

#!perl -w

# payroll.pl
#  Processes periodic payroll

use strict;
use warnings;
use This;
use That::TheOther;

# Global information up here as constants, easily locatable for modification
use constant PAYROLL_FILE = 'localpath/filename.ext';
use constant HOURS_TABLE = '"MySQL", "PROD", "HOURS"';
use constant EMPLOYEE_TABLE = '"MySQL", "HR", "EMPLOYEE"';

sub generate_payroll();
  sub get_employee_info();
  sub process_payroll_info($);
    sub extract_employee_key($_);  # indents may not communicate that well
                                                    # if functions are
called from different nesting levels

generate_payroll();

sub generate_payroll () {
  my $employees = get_employee_info() or die "Could not retrieve employee
information\n" .
  "  This process cannot initialize\n";
  foreach (@{$employees}) {
   process_payroll_info($_);
  }
}

sub get_employee_info() {
  return 0;
}

process_payroll_info($) {
  my $profile_ref = $_;
  my $employee_key = extract_employee_key($profile_ref ) or {
    warn "could not find employee ID";
    return 0;
  };
  print "Processing payroll for employee with ID $employee_key\n";
  my $hours = get_current_hours($employee_key);
}

extract_employee_key($_) {
  return 0;
}

At this stage of development, I don't know a thing about the internal
organization of many of the processes called.  It doesn't matter.  I can
deal with each as I get to it.  Even with totally empty code, I can see the
overall process carried out.  Once the details of each subprocedure come
into play, they have a context in which to fit.  That context will be
invaluable as the program grows in scale.

Try playing around with the top-down approach a little, and see how it works
for you.

Joseph


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to