如何组织我的 Java 代码?

How can I organize my Java code?

标题不是我的全部问题。从理论上讲,我知道如何组织代码,但我想要一些具体的、有用的指针。抓紧之前请继续阅读。

我是 java 和 OOP(object 面向编程)的初学者,我真的很想学习如何更好地组织我的代码!在一两个月的时间里,我制作了一个计算器程序,其中包含我在这里和那里想到的一些小功能,并在其中内置了一些小笑话。第二次查看后,我意识到它的格式非常糟糕,几乎 incomprehensible.If 我可能会,我想请一些更有经验的程序员为我指明正确的方向,告诉我应该如何修复它(例如,我可以将什么东西变成 objects,我可以在哪里划分等)。

请注意,这是我第一次在这样的论坛上发帖,所以如果我需要澄清一些事情来帮助我,我做错了什么,我要求太多了,请告诉我所以我可以解决它,我可以得到帮助。 不要只是将其标记为无效并将其归档以遗忘(这在 Whosebug 中经常发生)。另外,在有人问之前,不,这不是家庭作业,它是我自己自学的成果 java(可能是为什么它效果不太好)。

这里是源代码:

// This is the original Calculator code without objects in a single class. not really efficient...
package randomClasses;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;

@SuppressWarnings("serial")
public class CalcClass
        extends JFrame
        implements ActionListener {
    JPanel[] row = new JPanel[6];
    JButton[] button = new JButton[21];
    String[] buttonString = {"7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", ".", "/", "C", "v", "+/-", "=", "0", "Parabola", "x^y"};
    int[] dimW = {300, 45, 100, 90, 180};
    int[] dimH = {35, 40};
    Dimension displayDimension = new Dimension(dimW[0], dimH[0]);
    Dimension regularDimension = new Dimension(dimW[1], dimH[1]);
    Dimension rColumnDimension = new Dimension(dimW[2], dimH[1]);
    Dimension zeroButDimension = new Dimension(dimW[3], dimH[1]);
    Dimension parabolaDimension = new Dimension(dimW[4], dimH[0]);
    //formatting variables
    int var = 0;
    double x = 0;
    String stor = "";
    boolean initial = true;
    //variables for Parabola function
    int countEquals_parab = 0;
    double Angle = 0;
    double Vi = 0;
    double Vx = 0;
    double Vy = 0;
    double T_max = 0;
    double Y_displ = 0;
    double X_displ = 0;
    double h = 0;
    double k = 0;
    double a_parab = 0;
    boolean parabComplete = true;
    boolean parabola = false;
    DecimalFormat df = new DecimalFormat("#######.#####");
    //variables for addressing illegal typing issues
    boolean typeNum = true;
    boolean typeDot = true;
    JFrame frame; //for parabolaInstructions
    //original calculator variables
    boolean[] function = new boolean[5];
    double[] temporary = {0, 0}; //store on screen values
    double result = 0; //store result
    public JTextArea display = new JTextArea(1, 20);
    Font font = new Font("Times new Roman", Font.BOLD, 14);

    CalcClass() {
        super("CalcClass");
        setDesign();
        setSize(380, 300);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        GridLayout grid = new GridLayout(6, 5);
        setLayout(grid);
        for(int i = 0; i < 5; i++) {
            function[i] = false;
        }
        FlowLayout f1 = new FlowLayout(FlowLayout.CENTER);
        FlowLayout f2 = new FlowLayout(FlowLayout.CENTER, 1, 1);
        for(int i = 0; i < 6; i++) {
            row[i] = new JPanel();
        }
        row[0].setLayout(f1);
        for(int i = 1; i < 6; i++) {
            row[i].setLayout(f2);
        }
        for(int i = 0; i < 21; i++) {
            button[i] = new JButton();
            button[i].setText(buttonString[i]);
            button[i].setFont(font);
            button[i].addActionListener(this);
        }
        display.setFont(font);
        display.setEditable(false);
        display.setPreferredSize(displayDimension);
        for(int i = 0; i < 14; i++) {
            button[i].setPreferredSize(regularDimension);
        }
        for(int i = 14; i < 18; i++) {
            button[i].setPreferredSize(rColumnDimension);
        }
        button[18].setPreferredSize(zeroButDimension);
        button[19].setPreferredSize(parabolaDimension);
        button[20].setPreferredSize(rColumnDimension);
        row[0].add(display);
        add(row[0]);
        for(int i = 0; i < 4; i++) {
            row[1].add(button[i]);
        }
        row[1].add(button[14]);
        add(row[1]);
        for(int i = 4; i < 8; i++) {
            row[2].add(button[i]);
        }
        row[2].add(button[15]);
        add(row[2]);
        for(int i = 8; i < 12; i++) {
            row[3].add(button[i]);
        }
        row[3].add(button[16]);
        add(row[3]);
        row[4].add(button[18]);
        for(int i = 12; i < 14; i++) {
            row[4].add(button[i]);
        }
        row[4].add(button[17]);
        add(row[4]);
        row[5].add(button[19]);
        row[5].add(button[20]);
        add(row[5]);
        setVisible(true);
    }

    public void getSqrt() {
        stor = "";
        initial = true;
        try {
            double value = Double.parseDouble(display.getText());
            if(value == -100) {
                format("John's Girlfriend");
            } else {
                value = Math.sqrt(Double.parseDouble(display.getText())); //create a value for variable, and use Maths square root to find the value
                format(Double.toString(value)); //Sets display to new value
            }
        } catch(NumberFormatException e) {
        }
        typeDot = false;
        typeNum = false;
    }

    public void getPosNeg() {
        stor = "";
        initial = true;
        try {
            double value = Double.parseDouble(display.getText()); //again creating a variable for current value
            if(value != 0) { //if value is not equal to zero
                value = (-1) * value; //multiplied by -1 to change the sign
                format(Double.toString(value)); //Sets display to new value
            } else {
            }
        } catch(NumberFormatException e) {
        }
    }

    public void getResult() {
        temporary[1] = Double.parseDouble(display.getText());
        String temp0 = Double.toString(temporary[0]);
        String temp1 = Double.toString(temporary[1]);
        try {
            if(temp0.contains("-")) {
                String[] temp00 = temp0.split("-", 2);
                temporary[0] = (Double.parseDouble(temp00[1]) * -1);
            }
            if(temp1.contains("-")) {
                String[] temp11 = temp1.split("-", 2);
                temporary[1] = (Double.parseDouble(temp11[1]) * -1);
            }
        } catch(ArrayIndexOutOfBoundsException e) {
        }
        try {
            functions();
            clear();
            format(Double.toString(result));//display has a result
            for(int i = 0; i < 5; i++) {
                function[i] = false; //set all functions to false
            }
        } catch(NumberFormatException e) {
        }
        typeNum = false;
    }

    public void functions() {
        if(function[2] == true) { //multiplication 
            result = temporary[0] * temporary[1];
        } else if(function[3] == true) { //division
            result = temporary[0] / temporary[1];
        } else if(function[0] == true) { //addition
            result = temporary[0] + temporary[1];
        } else if(function[1] == true) { //subtraction;
            result = temporary[0] - temporary[1];
        } else if(function[4] == true) {
            result = Math.pow(temporary[0], temporary[1]);
        } else {
            result = temporary[1];
        }
    }

    double a_quadratic = 0;
    double b = 0;
    double c = 0;
    double x1 = 0;
    double x2 = 0;
    double discr = 0;
    int countEquals_quadratic = 0;

    public void quadraticFormula() {
        if(countEquals_parab == 0) {
            a_quadratic = Double.parseDouble(display.getText());
            clear();
            display.setText("b = ");
        }
        if(countEquals_parab == 1) {
            b = Double.parseDouble(display.getText());
            display.setText("c = ");
        }
        if(countEquals_parab == 2) {
            c = Double.parseDouble(display.getText());
            discr = (Math.pow(b, 2) - 4 * a_quadratic * c); //stores the value of the discriminant
            if(discr >= 0) {
                x1 = (-b + Math.sqrt(b * b - 4 * a_quadratic * c)) / (2 * a_quadratic);
                x2 = (-b - Math.sqrt(b * b - 4 * a_quadratic * c)) / (2 * a_quadratic);
            }
        }
    }

    public void parabolaButton() {
        double G = 9.81;
        if(countEquals_parab == 0) {
            Vi = Double.parseDouble(display.getText());
            clear();
            display.setText("Angle of release: ");
        }
        if(countEquals_parab == 1) {
            Angle = Double.parseDouble(display.getText());
            if((Angle > 90.0) || (Angle < 0.0)) {
                display.setText("Sorry, not a valid angle");
                countEquals_parab = 3;
            } else {
                Angle = (Math.PI / 180.0) * Angle;  //converting degrees into radians
                Vx = Vi * Math.cos(Angle); //Calculating x component
                Vy = Vi * Math.sin(Angle); //Calculating y component
                //Finding time
                T_max = Vy / G; //time to max height
                //Calculating vertex coordinates
                Y_displ = (Vy * Vy / (2 * G));
                X_displ = Vx * T_max;
                //finding a
                a_parab = (-Y_displ) / (X_displ * X_displ);
                display.setText("The equation of the parabola is \ny = " + df.format(a_parab) + "(x - " + df
                        .format(h) + ")^2 + " + df.format(k));
            }
        }
        if(countEquals_parab == 2) {
            display.setText("Time to get to max height = " + df.format(T_max));
        }
        if(countEquals_parab == 3) {
            clearFunction();
            countEquals_parab = -1;
            parabola = false;
            parabComplete = true;
        }
        countEquals_parab++;
    }

    public void var() {
        var++;
        if(var > 8) {
            var = 1;
        }
        if(var == 1) {
            format("x");
        }
    }

    public final void setDesign() {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch(Exception e) {
        }
    }

    public void format(String get) {
        //get stores the incoming values temporarily
        //get is transferred to a new value for permanent storage
        //print the permanent storage value
        //new number is added, stored temporarily in get
        //get is added to permanent storage
        //print permanent storage value
        double spaceFix = 0;
        if(initial == true) {
            stor = get;
            initial = false;
        } else if(initial == false) {
            stor = stor + get;
        }
        spaceFix = stor.length() / 4;
        int numberOfSpaces = 56 - stor.length() + (int) spaceFix;
        String format = String.format("%" + numberOfSpaces + "s", stor);
        display.setText(format);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if(ae.getSource() == button[0]) {
            numberButtons("7");
        }
        if(ae.getSource() == button[1]) {
            numberButtons("8");
        }
        if(ae.getSource() == button[2]) {
            numberButtons("9");
        }
        if(ae.getSource() == button[3]) {
            operatorButtons(0); //add function[0]
        }
        if(ae.getSource() == button[4]) {
            numberButtons("4");
        }
        if(ae.getSource() == button[5]) {
            numberButtons("5");
        }
        if(ae.getSource() == button[6]) {
            numberButtons("6");
        }
        if(ae.getSource() == button[7]) {
            operatorButtons(1); //subtract function[1]
        }
        if(ae.getSource() == button[8]) {
            numberButtons("1");
        }
        if(ae.getSource() == button[9]) {
            numberButtons("2");
        }
        if(ae.getSource() == button[10]) {
            numberButtons("3");
        }
        if(ae.getSource() == button[11]) {
            operatorButtons(2); //multiplication function[2]
        }
        if(ae.getSource() == button[12]) {
            if(typeDot == false) {
            } else {
                numberButtons(".");
                typeDot = false;
            }
        }
        if(ae.getSource() == button[13]) {
            operatorButtons(3); //divide function[3]
        }
        if(ae.getSource() == button[14]) {
            clearFunction();
            parabola = false;
            parabComplete = true;
        }
        if(ae.getSource() == button[15]) {
            getSqrt();
        }
        if(ae.getSource() == button[16]) {
            getPosNeg();
        }
        if((ae.getSource() == button[17]) && display.getText().equals("")) {
        } else if((ae.getSource() == button[17]) && (parabola == false)) {
            getResult();
        } else if((ae.getSource() == button[17]) && (parabola == true)) {
            parabolaButton();
        }
        if(ae.getSource() == button[18]) {
            numberButtons("0");
        }
        if(ae.getSource() == button[19]) {
            clearFunction();
            parabolaInstructions();
            parabola = true;
            parabComplete = false;
            display.setText("Initial velocity: ");
        }
        if(ae.getSource() == button[20]) {
            operatorButtons(4);//powerFunction();
        }
    }

    public void parabolaInstructions() {
        //Create the dialog.
        final JDialog dialog = new JDialog(frame, "How to use the Parabola function");
        //Add contents to it. It must have a close button,
        //since some L&Fs (notably Java/Metal) don't provide one
        //in the window decorations for dialogs.
        JLabel label = new JLabel("<html><p align=center>" + "Step 1:  Type in the initial velocity and press the \"=\" button<br>" + "Step 2:  Type in the angle of Release (make sure that it is between 0 and 90)<br>" + "Step 3:  Press the \"=\" button to scroll through the results<br>" + "Step 4:  Profit");
        label.setHorizontalAlignment(JLabel.CENTER);
        Font font = label.getFont();
        label.setFont(label.getFont().deriveFont(font.PLAIN, 14.0f));
        JButton closeButton = new JButton("Ok");
        closeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
                dialog.dispose();
            }
        });
        JPanel closePanel = new JPanel();
        closePanel.setLayout(new BoxLayout(closePanel, BoxLayout.LINE_AXIS));
        closePanel.add(Box.createHorizontalGlue());
        closePanel.add(closeButton);
        closePanel.setBorder(BorderFactory.
                createEmptyBorder(0, 0, 5, 5));
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.add(label, BorderLayout.CENTER);
        contentPane.add(closePanel, BorderLayout.PAGE_END);
        contentPane.setOpaque(true);
        dialog.setContentPane(contentPane);
        //Show it.
        dialog.setSize(new Dimension(400, 200));
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }

    public void numberButtons(String i) {
        if(typeNum == false) {
            display.setText("");
            format(i);
        } else {
            format(i);
        }
        typeNum = true;
    }

    public void operatorButtons(int funct) {
        if(display.getText().equals("")) {
        } else {
            temporary[0] = Double.parseDouble(display.getText());
            function[funct] = true;
            clear();
        }
    }

    public void clearFunction() {
        clear();
        try {
            for(int i = 0; i < 5; i++) {
                function[i] = false;
            }
            for(int i = 0; i < 2; i++) {
                temporary[i] = 0;
            }
        } catch(NullPointerException e) {
        }
        //For parabola()
        Vi = 0;
        Vx = 0;
        Vy = 0;
        T_max = 0;
        Y_displ = 0;
        X_displ = 0;
        h = 0;
        k = 0;
        a_parab = 0;
    }

    public void clear() {
        display.setText("");
        stor = "";
        typeDot = true;
        initial = true;
    }

    public static void main(String[] arguments) {
        CalcClass c = new CalcClass();
    }
}

好吧,现在你已经看到我的烂摊子了......我 sort-of 知道我应该做什么,是的,我做了一些研究,但我觉得通过例子或一个好的组织来学习组织会容易得多比阅读告诉您 ultra-hypothetical 或 loosely-analogous 示例的文章更能推动 object 是什么。注意:我尝试使用方法来组织,我的 class 看起来比它所做的要好得多(我还使整个事情成为 object 在底部调用,这几乎没用)。

如果你使用eclipse,试试:

Window > Prefferences > Java > Editor > Save Actions

选中"perform the selected actions on save"、"Additional Actions"并单击"Configure"。

使用 eclipse 的 Save Actions 在现实生活中编码非常有用,但您可能会通过 Save Actions 向导学到一些巧妙的 java 技巧。

Java 是一种面向对象的语言。你需要利用这个事实。
使用 类 将您的代码分成不同的逻辑/结构组件。了解如何使用 OOP。关注 SOLID design and use design patterns.

另一件重要的事情是了解您的语言。首先阅读基本的 类 javadoc 和 java 规范的相关部分。我将从深刻理解 java 的不同类型(classinterfaceenum 和内部/嵌套/匿名类型)和不同的修饰符(private, public, protected, static, abstract, final, default).

一些其他的 eclipse 快捷方式:

  • CTRL-A, CTRL-I ("indentation") 将修复您的代码缩进。
  • CTRL-SHIFT-O ("organize imports") 将省略多余的导入。

  • 您可能会考虑看一下 Code Complete,它处理您在这里关心的问题,否则只是我们领域中每个认真的开发人员都应该阅读的 classic。

    一般来说,组织代码时应牢记以下几点:可读性和原子性。这两个因素适用于应用程序每个级别的代码,从变量命名、例程、方法、classes、包等等。

    可读性是一个简单的概念:人类可以阅读并理解这段代码吗?要衡量代码的可读性,您所要做的就是阅读它!变量名是否有助于 reader 理解某物是什么?例程和 classes 的格式是否正确并且没有不必要的复杂性?您是否删除了所有未使用的代码?您的代码是否按逻辑顺序编写?

    原子性是指一切都应该有一个目的。一个函数或方法应该(通常)做一件事并且只做一件事。 class 通常应该是服务于某种类型的独特目的的相关方法和字段的逻辑分组,而不是不相关内容的大杂烩。一个包还应该包含一组相关文件。同一个项目,等等。

    原子性的主要好处是,一旦您涉及更多的应用程序,调试和隔离代码中的问题实际上要容易得多,因为您知道东西在哪里。例如:我有一个数据库访问错误!幸好我有一个专门为我的数据库访问对象定义的包。

    我知道当我刚开始涉足该领域时,这也让我失望。直到您在更重要的应用程序中进行大量编码,您才真正开始理解最佳实践以及人们为什么以某种方式构建东西。

    感谢所有为我的问题做出贡献的人,我彻底废弃了这个垃圾,并使它变得更好了 1000 倍。我从一开始就知道它做工很差,我想修理它,只是不知道从哪里开始。在阅读了所有给出的建议、观看了一些教程并温习了一些简单的 java 概念(修饰符、jswing 等)之后,我最终制作了一个 MVC 格式的新的(Yay、order 和效率)。现在我所有的新变量实际上都是有意义的(感谢@maaartinus 帮助我意识到我的许多变量命名不当并使我的整个程序变得不必要的复杂)。此外,我尝试在 SRP 上工作(不是 100% 确定我是否完全做到了,但随着程序的组织,更改内容将很容易)并且我计划稍后添加单元以进行良好实践(谢谢,@Robert Snyder)。这个新的 GUI 很难看,但以后总是可以更改的,因为它现在是 MVC 格式,所以工作会更容易。

    这是我所做的(尚未完成,远非完美,但朝着正确的方向迈出了一步):

    CalcGui.java

    package com.Calculator;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class CalcGui extends JFrame {
    
    private static final long serialVersionUID = 1L;
    private String[] operatorsList = { "+", "-", "*", "/", "^" };
    
    // Row 1
    private JTextField firstNumber = new JTextField(10);
    private JComboBox<String> operator = new JComboBox<>(operatorsList);
    private JTextField secondNumber = new JTextField(10);
    private JButton calculateButton = new JButton("Calculate");
    private JTextField calcSolution = new JTextField(20);
    
    // Row 2
    private JLabel sqrtSymbol = new JLabel("√");
    private JTextField sqrtNumber = new JTextField(10);
    private JButton sqrtCalcButton = new JButton("Calculate");
    private JTextField sqrtCalcSolution = new JTextField(20);
    
    // Row 3
    private JLabel quadraticLabel1 = new JLabel("A = ");
    private JTextField quadraticFirstNumber = new JTextField(5);
    private JLabel quadraticLabel2 = new JLabel("B = ");
    private JTextField quadraticSecondNumber = new JTextField(5);
    private JLabel quadraticLabel3 = new JLabel("C = ");
    private JTextField quadraticThirdNumber = new JTextField(5);
    private JButton quadraticCalcButton = new JButton("Calculate");
    private JLabel quadraticTextBefore = new JLabel("x =");
    private JTextField firstQuadraticCalcSolution = new JTextField(3);
    private JLabel quadraticTextMiddle = new JLabel("and x =");
    private JTextField secondQuadraticCalcSolution = new JTextField(3);
    
    CalcGui() {
    
        JPanel calcPanel = new JPanel(new BorderLayout());
        FlowLayout Default = new FlowLayout(FlowLayout.LEFT);
        JPanel row1 = new JPanel(Default);
        JPanel row2 = new JPanel(Default);
        JPanel row3 = new JPanel(Default);
    
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(650, 150);
    
        row1.add(firstNumber);
        row1.add(operator);
        row1.add(secondNumber);
        row1.add(calculateButton);
        row1.add(calcSolution);
    
        row2.add(sqrtSymbol);
        row2.add(sqrtNumber);
        row2.add(sqrtCalcButton);
        row2.add(sqrtCalcSolution);
    
        row3.add(quadraticLabel1);
        row3.add(quadraticFirstNumber);
        row3.add(quadraticLabel2);
        row3.add(quadraticSecondNumber);
        row3.add(quadraticLabel3);
        row3.add(quadraticThirdNumber);
        row3.add(quadraticCalcButton);
        row3.add(quadraticTextBefore);
        row3.add(firstQuadraticCalcSolution);
        row3.add(quadraticTextMiddle);
        row3.add(secondQuadraticCalcSolution);
    
        calcPanel.add(row1, BorderLayout.NORTH);
        calcPanel.add(row2, BorderLayout.CENTER);
        calcPanel.add(row3, BorderLayout.SOUTH);
        this.add(calcPanel);
    
    }
    
    // basic calculations methods
    public double getFirstNumber() {
    
        return Double.parseDouble(firstNumber.getText());
    
    }
    
    public String getOperator() {
    
        return (String) operator.getSelectedItem();
    
    }
    
    public double getSecondNumber() {
    
        return Double.parseDouble(secondNumber.getText());
    
    }
    
    public void setCalcSolution(double solution) {
    
        calcSolution.setText(Double.toString(solution));
    
    }
    
    void addCalculateListener(ActionListener listenForCalcButton) {
    
        calculateButton.addActionListener(listenForCalcButton);
    
    }
    
    void displayErrorMessage(String errorMessage) {
    
        JOptionPane.showMessageDialog(this, errorMessage);
    
    }
    
    // Square root function methods
    public double getSqrtNumber() {
    
        return Double.parseDouble(sqrtNumber.getText());
    
    }
    
    public void setSqrtCalcSolution(double solution) {
    
        sqrtCalcSolution.setText(Double.toString(solution));
    
    }
    
    void addSqrtCalcListener(ActionListener listenForSqrtCalcButton) {
    
        sqrtCalcButton.addActionListener(listenForSqrtCalcButton);
    
    }
    
    // Quadratic formula Methods
    public double getQuadraticFirstNumber() {
    
        return Double.parseDouble(quadraticFirstNumber.getText());
    
    }
    
    public double getQuadraticSecondNumber() {
    
        return Double.parseDouble(quadraticSecondNumber.getText());
    
    }
    
    public double getQuadraticThirdNumber() {
    
        return Double.parseDouble(quadraticThirdNumber.getText());
    
    }
    
    public void setFirstQuadraticCalcSolution(double solution) {
    
        firstQuadraticCalcSolution.setText(Double.toString(solution));
    
    }
    
    public void setSecondQuadraticCalcSolution(double solution) {
    
        secondQuadraticCalcSolution.setText(Double.toString(solution));
    
    }
    
    void addQuadraticCalcListener(ActionListener listenForQuadraticCalcButton) {
    
        quadraticCalcButton.addActionListener(listenForQuadraticCalcButton);
    
    }
    }
    

    CalcModel.java

    package com.Calculator;
    
    public class CalcModel {
    
    private double calcValue;
    
    public void calculate(double firstNumber, double secondNumber,
            String operator) {
    
        if (operator.equals("+")) {
    
            calcValue = firstNumber + secondNumber;
    
        }
    
        if (operator.equals("-")) {
    
            calcValue = firstNumber - secondNumber;
    
        }
        if (operator.equals("*")) {
    
            calcValue = firstNumber * secondNumber;
    
        }
        if (operator.equals("/")) {
    
            calcValue = firstNumber / secondNumber;
    
        }
    
        if (operator.equals("^")) {
    
            calcValue = Math.pow(firstNumber, secondNumber);
    
        }
    }
    
    public double getCalcValue() {
    
        return calcValue;
    
    }
    
    }
    

    平方CalcModel.java

    package com.Calculator;
    
    public class SqrtCalcModel {
    
    private double sqrtCalcValue;
    
    public void sqrt(double number) {
    
        sqrtCalcValue = Math.sqrt(number);
    
    }
    
    public double getSqrtCalcValue() {
    
        return sqrtCalcValue;
    
    }
    }
    

    二次CalcModel.java

    package com.Calculator;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    public class QuadraticCalcModel {
    
    private double firstQuadraticCalcValue;
    private double secondQuadraticCalcValue;
    
    public void quadraticFormula(double a, double b, double c) {
    
        double discriminant = (b * b) - (4 * a * c);
    
        if (discriminant >= 0) {
    
            firstQuadraticCalcValue = (Math.sqrt((b * b) - (4 * a * c)) + (-b))
                    / (2 * a);
    
            secondQuadraticCalcValue = (Math.sqrt((b * b) - (4 * a * c)) - (-b))
                    / (2 * a);
    
        }
    
        else {
    
            JFrame parent = new JFrame();
            JOptionPane.showMessageDialog(parent,
                    "This function has no real roots.");
    
        }
    
    }
    
    public double getFirstQuadraticValue() {
    
        return firstQuadraticCalcValue;
    
    }
    
    public double getSecondQuadraticValue() {
    
        return secondQuadraticCalcValue;
    
    }
    
    }
    

    CalculatorControler.java

    package com.Calculator;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class CalculatorController {
    
    private CalcGui theGui;
    private CalcModel theCalcModel;
    private SqrtCalcModel theSqrtCalcModel;
    private QuadraticCalcModel theQuadraticCalcModel;
    
    public CalculatorController(CalcGui theGui, CalcModel theCalcModel,
            SqrtCalcModel theSqrtCalcModel,
            QuadraticCalcModel theQuadraticCalcModel) {
        this.theGui = theGui;
        this.theCalcModel = theCalcModel;
        this.theSqrtCalcModel = theSqrtCalcModel;
        this.theQuadraticCalcModel = theQuadraticCalcModel;
    
        this.theGui.addCalculateListener(new CalcListener());
        this.theGui.addSqrtCalcListener(new SqrtCalcListener());
        this.theGui.addQuadraticCalcListener(new QuadraticCalcListener());
    }
    
    class CalcListener implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
    
            double firstNumber, secondNumber = 0;
            String operator;
    
            try {
    
                firstNumber = theGui.getFirstNumber();
                operator = theGui.getOperator();
                secondNumber = theGui.getSecondNumber();
    
                theCalcModel.calculate(firstNumber, secondNumber, operator);
    
                theGui.setCalcSolution(theCalcModel.getCalcValue());
    
            }
    
            catch (NumberFormatException ex) {
    
                System.out.println(ex);
    
                theGui.displayErrorMessage("You Need to Enter 2 Numbers");
    
            }
        }
    }
    
    class SqrtCalcListener implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
    
            double number = 0;
    
            try {
    
                number = theGui.getSqrtNumber();
    
                theSqrtCalcModel.sqrt(number);
    
                theGui.setSqrtCalcSolution(theSqrtCalcModel.getSqrtCalcValue());
    
            }
    
            catch (NumberFormatException ex) {
                System.out.println(ex);
    
                theGui.displayErrorMessage("You Need to enter a Number");
            }
        }
    }
    
    class QuadraticCalcListener implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
    
            double a, b, c = 0;
    
            try {
    
                a = theGui.getQuadraticFirstNumber();
                b = theGui.getQuadraticSecondNumber();
                c = theGui.getQuadraticThirdNumber();
    
                theQuadraticCalcModel.quadraticFormula(a, b, c);
    
                theGui.setFirstQuadraticCalcSolution(theQuadraticCalcModel
                        .getFirstQuadraticValue());
    
                theGui.setSecondQuadraticCalcSolution(theQuadraticCalcModel
                        .getSecondQuadraticValue());
    
            }
    
            catch (NumberFormatException ex) {
    
                System.out.println(ex);
    
                theGui.displayErrorMessage("You need to enter 3 numbers.");
            }
    
        }
    }
    
    }
    

    MVCCalculator.java

    package com.Calculator;
    
    public class MVCCalculator {
    
    public static void main(String[] args) {
    
        CalcGui theGui = new CalcGui();
    
        CalcModel theCalcModel = new CalcModel();
    
        SqrtCalcModel theSqrtCalcModel = new SqrtCalcModel();
    
        QuadraticCalcModel theQuadraticCalcModel = new QuadraticCalcModel();
    
        new CalculatorController(theGui, theCalcModel, theSqrtCalcModel,
                theQuadraticCalcModel);
    
        theGui.setVisible(true);
    
    }
    }