You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

Her vises det hvordan en "oversetter" Python-programmer med flere moduler (filer)

Etterhvert som programmer vokser i størrelse, så er det naturlig å fordele koden på flere filer. Python kaller slike filer for moduler, og ved å bruke import-setninger kan én modul referere til og aktivere andre moduler. Java har en lignende mekanisme og også en import-setning, men forskjellene er viktige.

Python-moduler

Forskjellen har primært med hva det vil si å aktivere en modul. Ved bruk av import i Python, vil modulen det refereres til bli utført, med mindre den allerede er det. I vårt tilfelle er det rpncalc4ui som importerer rpncalc4core med setningen

import rpncalc4core

Resultatet er uansett at navnene i den importerte modulen er tilgjengelig, altså at notatarket tilsvarende modulen er opprettet. Det kan bare være ett slikt ark pr. modul, og det er derfor import-setningen bare kjører modulen hvis den ikke allerede er blitt utført. Når en siden ønsker å referere til funksjoner inni modulen, så bruker en metodenavnet og punktum som prefix foran funksjonsnavnet, f.eks.

if rpncalc4core.isOperand(token): 
	...

Java-klasser

Java sine moduler kalles klasser, og er lik moduler på den måten at de deklarerer variabler og funksjoner (kalles metoder i Java), og kjører metodene i kontekst av et notatark med variablene i. En viktig forskjell er imidlertid at en kan ha mange slik notatark med de samme variablene i (men selvsagt forskjellige verdier) og at alle disse må opprettes manuelt. Som regel vil en lagre referanser til disse, slik at en kan referere til dem siden, og f.eks. kalle metodene, omtrent på samme måte som en i Python kaller funksjoner i moduler.

Når rpncalc5ui-modulen over bruker rpncalc4core-navnet direkte, så må en i Java istedet lage en instans av klassen og lagre denne i en variabel, for så å referere vha. denne:

RPNCalcCore rpnCalcCore = new RPNCalcCore();
...
if (rpnCalcCore.isOperand(token)) {
	...
}
  • No labels