如何组织我的Java代码?

时间:2015-05-31 19:24:31

标签: java organization code-organization

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

我是Java和OOP(面向对象编程)的初学者,我真的想学习如何更好地组织我的代码!在一两个月的时间里,我制作了一个计算器程序,其功能很少,我想到这里有一些小的笑话。在第二次看到它后,我意识到它的格式非常糟糕,几乎无法理解。如果可以,我想请一些更有经验的程序员指出我应该做些什么来解决它(例如,我可以将什么东西变成对象,我可以在哪里划分等等。

请注意,这是我第一次在这样的论坛上发帖,所以如果我需要澄清一些事情来帮助我,我做错了什么,我要求的太多了,请告诉我,我可以解决它,我可以得到帮助。 不要将此标记为无效并将其归档至遗忘(通常在stackoverflow中发生)。此外,在任何人问之前,不,这不是家庭作业,它是我自己教导自己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();
    }
}

好的,现在你已经看到了我的烂摊子......我知道我应该做些什么,是的,我做了一些研究,但我觉得通过实例或推动比学习组织更容易它来自阅读文章,告诉你什么是对象的超假设或松散类似的例子。注意:我尝试使用方法进行组织,我的类看起来比它做的要好得多(我还把整个事情做成了一个在底部被调用的对象,这几乎没用)。

3 个答案:

答案 0 :(得分:3)

如果您使用eclipse,请尝试:

  

窗口&gt; prefferences&gt; Java&gt;编辑&gt;保存操作

选中“在保存时执行所选操作”,“其他操作”,然后单击“配置”。

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

Java是一种面向对象的语言。你需要利用这个事实。
使用类将代码分成不同的逻辑/结构组件。学习如何使用OOP。按照SOLID设计并使用design patterns

另一个重要的事情是了解您的语言。首先阅读基本类javadoc和java规范的相关部分。我将首先深入理解不同类型的java(classinterfaceenum和内部/嵌套/匿名类型)和不同的修饰符(private,{{ 1}},publicprotectedstaticabstractfinal)。

其他一些日食的捷径:

  • defaultCTRL-A(“缩进”)将修复您的代码缩进。
  • CTRL-I(“组织导入”)将省略冗余导入。

  • 答案 1 :(得分:2)

    您可以考虑查看代码完成,它处理您在此处关注的问题,否则只是我们领域的经典,每个认真的开发人员都应该阅读。

    一般而言,当您组织代码时,您应该考虑以下几点:可读性和原子性。这两个因素适用于应用程序的每个级别上的代码,包括变量命名,例程,方法,类,包等。

    可读性是一个简单的想法:人类可以阅读这些代码并理解它吗?要衡量代码的可读性,您只需阅读即可!变量名是否有助于读者理解什么是什么?例程和类是否正确格式化并且不是不必要的复杂?您是否删除了所有未使用的代码?您的代码是按逻辑进程编写的吗?

    原子性是一切都应该有一个目的的想法。一个函数或方法应该(通常)只做一件事和一件事。一个类通常应该是相关方法和字段的逻辑分组,这些方法和字段服务于某种类型的独特目的,而不是一堆不相关的东西。包还应包含一组相关文件。与项目相同,等等。

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

    我知道当我刚刚开始在野外开始时,这也是让我失望的事情。它可能直到您在更重要的应用程序中进行大量编码才真正开始理解最佳实践以及人们为什么以某种方式构建内容。

    答案 2 :(得分:2)

    感谢所有为我的问题做出贡献的人,我完全废弃了这些垃圾并使它变好了1000倍。我从一开始就知道它制作很差,我想解决它,我只是不知道从哪里开始。在阅读了所有给出的建议,观看了一些教程并了解了一些简单的java概念(修饰符,jswing等)之后,我最终创建了一个MVC格式的新方法(Yay,order and efficiency)。现在我所有的新变量实际上都是有意义的(感谢@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;
    
    }
    
    }
    

    SqrtCalcModel.java

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

    QuadraticCalcModel.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);
    
    }
    }