[Tutor] code structure terminology and advice
Alan Gauld
alan.gauld at btinternet.com
Wed Jul 22 09:46:04 CEST 2009
"Che M" <pine508 at hotmail.com> wrote
You pretty much answered your own question.
The ultimate answer depends on a few other contextual issues.
> Q1) Generally, what is the best structure for when there are
> a number of steps/actions that need to be taken?
A sequence! :-)
> Q2) Is there a term/some jargon in programming that
> refers to the difference between examples 1-3 below?
Not that I'm aware of.
> wish to perform four related sequential actions--steps,
> let's call them--in some part of the program.
If the entire program consists of those 4 steps (as in a batch
data processing program, say) then you might structure things
differently than if the 4 steps are only part of a bigger
program - one menu option out of several, say.
In the former you would perform the steps in sequence and
may or may not put them in functions.depending on whether
they would ever be reused and how long the code was per step.
In most cases the steps are likely to be reusable or of significant
length so you would put each one in its own function.
> 1. Do the steps all in one function:
>
> def Function(self):
> do step1 action
> do step2 action
> do step3 action
> do step4 action
This would be sensible in the menu selection context.
> 2. Have each step be a function, and have each function
> call the next function in the chain:
No, this is terrrible from every point of view. It removes any
opportunity of reuise of individual steps and builds up a deep
call stack which makes debugging harder and the coupling
between functions makes maintenance harder (for example
swapping two steps around in the sequence)
> def StepOne(self):
> do step1 action
> StepTwo()
> 3. Make each step a function, but call all of them in order in
> one master function:
>
> def MasterFunction(self):
> self.StepOne()
> self.StepTwo()
This is just a variation on option 1 and the same applies.
The fourth option you do not consider but which could be the
best solution for the batch program I discussed is just to perform
each step from the top klevel of the program, ie no
enclosing function
StepOne()
StepTwo()
StepThree()
StepFour()
> It seems to me that example 3 is the most sensible.
In general yes.
> 1 is bad because the steps should be functions, because then they
> can be easily reused, seen from an IDE explorer, etc.
> (I guess if they are really minor things it isn't necessary).
This depends on the size of the steps and the nature of the overall
programme, but functions would usually be best.
> 2 is terrible
Yes.
> Maybe there are other and better ways to think about organizing
> a sequence of steps, and if so I'd love to hear them.
For longer and more complex processes you could use a table
or list of functions and step through them in a loop
process = [StepOne, StepTwo,...., stepN]
for step in process:
step()
Or for dynamically changing sequences you can create or hold
a sequence list and use that to index a list of steps:
steps = [StepOne, StepTwo,...., stepN]
sequence = [1,2,3,4]
def do Process(sequence)
for step in sequence:
steps[step]()
This allows you to selectively peform some of the steps:
sequence = [1,3,4,N]
doProcess(sequence)
Finally for very complex scenarios you might implement a
state machine where the return value of each step controls
the next step in the sequence. That can be done by building
a set of state objects or using a data driven approach with
a table
You can read about state machines in several places,
I'd start with Wikipedia.
You might also find that reading about business process execution
languages gives you some ideas about how to structure and
represent complex processes. BEPL would be a good
starting point, again try Wikipedia.
HTH,
--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/
More information about the Tutor
mailing list