SPUG:Designing Programs
Jonathan Gardner
jgardn at alumni.washington.edu
Mon Jan 13 10:31:52 CST 2003
On Friday 10 January 2003 19:20, Asim Jalis wrote:
> I have a question. How do people design large programs with Perl?
> Do you start typing code? Or do you spend some time designing it
> on paper?
>
I'm going to be the troll today. ;-)
When writing large programs, I often reconsider when I conclude perl is the
best tool for the job. In my experience, perl is difficult to document, too
flexible, and not a good solution when you may end up having several people
working on the same thing.
Most big perl programs I see have all evolved that way. They started small,
and gradually grew until they became the big program they were never intended
to be. Some big perl programs are really several separate programs that run
together. Otherwise, it is probably a website.
Now here comes the trollish part. I would rather use Python than perl for
large projects. I think Python matches my style in more ways than one:
- Like perl, it has weak typing. Think of perl with everything as a scalar,
and you'll get Python. You still have hashes and arrays, but they are really
hashrefs and arrayrefs.
- Unlike perl, documentation is so easy to incorporate it is foolish not to.
In fact, for a large project, you are shooting yourself in the foot when you
supply poor or no documentation, because you will forget how you were
supposed to use the objects you just wrote.
- Unlike perl, refactoring seems to be easier, and is a much better solution
than devising a hack to get things to work. I find that because there are
only two ways to access the attributes of an object, writing regular
expressions to find all access to attributes is incredibly easy and mindless.
This is not so true for perl.
Now, I don't want to sound as if I don't like perl. I love perl, almost as
much as I love Python. In fact, I use perl as often as I can for things it is
very good at doing - handling input and formatting output, and the occasional
script, not to mention the glue to bind all you unix command line utilities
together.
Right now, I am putting together a solution for an optometrist. I am using
Python for the GUI interface. GUI interfaces always turn into huge projects,
no matter how small the intention was, so Python always wins in my mind. I
use perl for the backend data processing. It is powerful and allows me to get
to the point much quicker. Between the two, I use a database to store the
data.
As far as I how I do design work for perl, I said above that I like to use OO
to do everything. However, OO and perl are really not comfortable with each
other, so I try to use perl's strengths and avoid its weaknesses. I break
things up into objects, and then spend the rest of the time deciding how to
break up tasks among the objects. I look for tasks that are general enough
that they can be reused, and start fleshing out the program in code. I leave
stubs with comments or perldoc describing what the task is supposed to do and
flesh it out when I really need it.
I usually end up programming for thirty minutes, then tinkering to get the
code to work, and then testing the code I just wrote until I am satisfied I
got it right. Then I go on to another task and work on that one for a while.
I try to keep the test code around so I can run it again later.
This iterative approach doesn't fare well with a solid design. I have to be
able to revise the design as I go, changing the tasks and moving things from
one object to another on a whim, especially in the early stages. I find that
rather than thinking really hard about what it is going to look like, and
writing it out on paper, it is better to actually do it and then assess
whether it is a viable solution or not.
--
Jonathan Gardner
jgardn at alumni.washington.edu
Python Qt perl apache and linux
More information about the spug-list
mailing list