[Tutor] How to design the structure of multi-steps(and substeps) scripts

Steven D'Aprano steve at pearwood.info
Mon Apr 11 07:23:59 CEST 2011


On Mon, Apr 11, 2011 at 08:43:25AM +0800, leechau wrote:
> Hi everybody. I wrote a script to run BVT and it's code structure like this:

What's BVT?


> def step1:
>     local_var1 = ...
>     # some other variable definitions for step1
>     def substep11:
>         pass
>     def substep12:
>         pass
>     # more substeps
[...]
> # more steps ...

> global_var1 = ...
> # more global var definitions...

Using global variables is generally considered an anti-pattern and 
poor design. You should rethink your design and try to avoid globals.


> if step1.return_success:
>     step2
>     step3
>     ...
>     stepN

This doesn't work with the skeleton you provide. In the skeleton provided,
step1 is a function object. Since you never call the function, it doesn't
do anything. 

Likewise, it doesn't have an attribute called "return_success".


> As you see, this script consists of serveral steps(a list of commands),
> and a step often consists of several substeps. I used to put all the
> steps in one module, where one step corresponding to one funciton and
> one substep corresponding to one nested function. It's now a headache to
> maintain this script because of totally 1000+ lines of code.

1000 lines of code isn't much. If it's a headache, that's more likely due
to poor design (globals?) than volume.


> Meanwhile
> when I manipulate different projects with this script I need to modify
> the value of some variables and detailed task logic.

Exactly! And now you know why global variables are frowned on.


> Obviously it's a
> dirty work to modify the source code directly for different projects. So
> I wonder if I should put different steps in different modules to shorten
> the length of each module? If I should put the default value of a
> variable and high level task logic in a abstract class, and define
> specific value and detailed task logic in concrete subclass? Is there
> any design patterns available for this kind of multi-steps scripts?

Except the most trivial scripts, all scripts are multi-step.

You should use argument passing instead of globals. Your functions should 
take arguments, and return results, instead of reading and setting globals.



-- 
Steven



More information about the Tutor mailing list