Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

PlantUML Macro
object rpncalc2 {
	operands = []
	hasOperands(n)
	plus()
	token = "+"
	operand = ...
}

object "1: plus" as plus1 {
}

rpncalc2 <-left- plus1
plus-funksjonen er akkurat kalt fra elif-grenen i while-løkka. plus-arket refererer til rpncalc2-arket, fordi plus-funksjonen selv er definert i rpncalc2-arket. Dermed kan koden i plus-funksjonen referere til variabler (og funksjoner) i rpncalc2-arket.
PlantUML Macro
object rpncalc2 {
	operands = []
	hasOperands(n)
	plus()
	token = "+"
	operand = ...
}

object "1: plus" as plus1 {
}
object "1: hasOperandhasOperands" as hasOperand1hasOperands1 {
	n = 2
}

rpncalc2 <-- plus1
rpncalc2 <-- hasOperand1 hasOperands1

plus1 ..> hasOperands1
plus-funksjonen har akkurat kalt hasOperands. Vi har nå to aktive funksjonsark, og merk den stiplete linjen angir at plus-arket har aktivert hasOperands-arket. Merk hvordan begge refererer til rpncalc2-arket, fordi både plus- og hasOperands-funksjonene selv er definert der. Men selv om hasOperands-arket ble aktivert av plus-funksjonen, så refererer det ikke til plus-arket.

...

Selv om programmet nå virker som det skal og er forholdsvis ryddig, så skal vi gjøre en viktig endring til. Som figurene over viser, så er token- og operand-variablene som brukes inni while-løkka, like globale og synlige for andre funksjoner som operands-lista, selv om det kun er operands-lista som det er meningen at andre funksjoner skal kunne lese og endre. En måte å gjøre løse det på er å legge while-løkka i en egen funksjon, slik at token og operand blir lokale for denne funksjonen. Siden dette er hovedfunksjonen til programmet kalles den gjerne main. Den eneste koden som da til syvende og sist ligger utenfor en funksjon er initialiseringen av operands og et enkelt kall til main(), som vist til venstre under. Til høyre for koden er det illustrert hvordan "arkene" vil se ut når plus-funksjonen har kalt hasOperands, tilsvarende figuren over. Vi ser at token- og operand-variablene nå ligger inni main-arket, som er utilgjengelig for plus- og hasOperands-arkene.

Code Block
languagepython
operands = []

def isOperand(token): ...
def hasOperands(n): ...

def plus(): ...
def minus(): ...

def main():
	while (True):
    	...
	print("program exited")

main()
PlantUML Macro
object rpncalc2 {
	operands = []
	hasOperands(n)
	plus()
	main()
}

object "1: main" as main1 {
	token = "+"
	operand = ...
}

object "1: plus" as plus1 {
}
object "1: hasOperandhasOperands" as hasOperand1hasOperands1 {
	n = 2
}

rpncalc2 <-- main1
rpncalc2 <-- plus1
rpncalc2 <-- hasOperand1

 

 

...

hasOperands1

main1 ..> plus1
plus1 ..> hasOperands1

Hele rpncalc2.py

For ordens skyld, nedenfor er hele rpncalc2-koden. Kjør den gjerne og sjekk at den virker! Har vi plantet noen feil i koden denne gangen?

...