Moduler
I rpncalc2 gjorde vi koden ryddigere ved å definere funksjoner, men etterhvert som programmer blir større, er det en fordel å kunne dele opp koden i flere filer, som ofte kalles moduler. En av filene inneholder hovedprogrammet (f.eks. med main-funksjonen) som startes av brukeren, og denne vil bruke funksjoner (og variabler) definert i de andre modulene. Med en fornuftig oppdeling, kan selv store program bli oversiktlige og greie å håndtere. Moduler har på en måte samme rolle som funksjoner, men i større skala.
En vanlig måte å dele opp et program på er i en eller flere moduler som håndterer interaksjon med brukeren, og en eller flere støtte-moduler som inneholder kjernelogikken, f.eks. håndtering av komplekse datastrukturer. Fordelen er 1) at det er forutsigbart hvor ulike funksjoner er, og 2) at det gir økt gjenbruk. Siden vårt program er såpass lite, så holder det med to moduler:
- rpncalc4core: inneholder kjernelogikken som håndterer operand-stacken
- rpncalc4ui: inneholder koden som håndterer interaksjon med brukeren (ui-endelsen står for user interface, som vi på norsk kaller brukergrensesnitt)
rpncalc4core-modulen
Denne modulen inneholder alle variabler og funksjoner knyttet til håndtering av operand-stacken, først og fremst operands-variablen og i tillegg funksjonene som direkte leser og endrer den. I praksis er dette første del av koden fra rpncalc3.py.
# rpncalc4core.py operands = [] def isOperand(token): try: float(token) return True except ValueError: return False def printOperands(): print(operands) def popOperands(n): size = len(operands) if size >= n: result = operands[size - n : size] global operands operands = operands[0 : size - n] return result else: return None def pushOperand(operand): operands.append(operand) def plus(): ops = popOperands(2) if not (ops is None): pushOperand(ops[0] + ops[1]) def minus(): ops = popOperands(2) if not (ops is None): pushOperand(ops[0] - ops[1])
Det "eneste" denne modulen gjør er å deklarere og initialisere operands-variablen og tilhørende funksjoner. Ingen av funksjonene blir kjørt av modulen selv, de må kalles utenfra, av kode i andre moduler.
rpncalc4ui-modulen
Denne modulen er
def main(): while (True): printOperands() token = raw_input(" > ") if isOperand(token): operand = float(token) pushOperand(operand) elif token == "exit": break elif token == "+": plus() elif token == "-": minus() else: print("Unsupported operator: " + token) print("program exited") main()