Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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 viktigevesentlige.

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

...

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

...

PlantUML Macro
object RPNCalc4UI {
}

object RPNCalc4Core {
	List<Double> operands = ...
}

RPNCalc4UI -> RPNCalc4Core: rpnCalc4Core

...

Code Block
languagejava
package python;

import java.util.ArrayList;
import java.util.List;

public class RPNCalc4Core {

    // deklarerer lista og setter den til en tom lista
    List<Double> operands = new ArrayList<Double>();

    boolean isOperand(String token) {
        // bruker samme teknikk som i Python:
        // kall konverteringsmetoden for String til desimaltall og returner true hvis det går
        try {
            Double.valueOf(token);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }

    List<Double> popOperands(int n) {
        if (operands.size() < n) {
            return null;
        }
        // må lage en ny liste, som fylles med de bakerste elementene i operands-lista
        List<Double> result = new ArrayList<Double>(n);
        while (n > 0) {
            // remove med angitt indeks fjerner og returnerer siste element
            double lastElement = operands.remove(operands.size() - 1);
            // elementet må legges først i lista, for å unngå å snu rekkefølgen
            result.add(0, lastElement);
            n = n - 1;
        }
        return result;
    }

    void plus() {
        // pop to operander, hvis mulig
        List<Double> ops = popOperands(2);
        // hvis det fantes to operander, så summeres de og push-es tilbake
        if (ops != null) {
            pushOperands(ops.get(0) + ops.get(1));
        }
    }

    void minus() {
        // pop to operander, hvis mulig
        List<Double> ops = popOperands(2);
        // hvis det fantes to operander, så beregnes differansen de og push-es tilbake
        if (ops != null) {
            pushOperands(ops.get(0) - ops.get(1));
        }
    }
    
    void printOperands() {
        System.out.println(operands);
    }

    void pushOperands(double operand) {
        // legg til bakerst
        operands.add(operand);
    }
}
Code Block
languagejava
package python;

import java.util.Scanner;

public class RPNCalc4UI {

    // oppretter en instans, som har en operands-liste inni seg
    RPNCalc4Core rpnCalc4Core = new RPNCalc4Core();

    void run() {
        // en Scanner hjelper oss å lese inn og tolke tekst
        // System.in dvs. konsollet, brukes som datakilde for Scanner-objektet
        Scanner scanner = new Scanner(System.in);
        while (true) {
            rpnCalc4Core.printOperands();
            System.out.print(" > ");
            String token = scanner.next();
            if (rpnCalc4Core.isOperand(token)) {
                double operand = Float.valueOf(token);
                rpnCalc4Core.pushOperands(operand);
            } else if (token.equals("exit")) {
                break;
            } else if (token.equals("+")) {
                rpnCalc4Core.plus();
            } else if (token.equals("-")) {
                rpnCalc4Core.minus();
            } else {
                System.out.println("Unsupported operator: " + token);
            }
        }
        // en Scanner må lukkes når vi er ferdig med den
        scanner.close();
        System.out.println("program exited");
    }

    // den obligatoriske oppstartsmetoden for programklasser
    public static void main(String[] args) {
        // vi lager en instans av program-klassen og lar den ta over
        new RPNCalc4UI().run();
    }
}