How can I organize Java code?

The title is not my whole question. I know HOW to organize theoretical code, but I would like some specific, helpful pointers. Please read before clicking.

I'm new to Java and OOP (Object Oriented Programming) and I'd really like to know how best to organize my code! Within a month or two, I made a calculator program with little functions that I thought of here and there with little jokes built into it. Looking at it a second time, I realized that it was extremely poorly formatted and almost misunderstood. If I can, I would like to ask some more experienced programmers to point me in the right direction on what I should do to fix this (like what things can I turn into objects, where I can split, etc.).

Please note that this is my first presentation on a forum like this, so if I need to clarify something for you to help me, I did something wrong, I am asking too much, please tell me so that I can resolve it and i can get help. Please just don't mark it as invalid and put it off until forgotten (as is often the case on stackoverflow). Also, before anyone asks, NO this is NOT homework, this is a product of my own crack in teaching myself java (maybe why it doesn't work too well).

Here is the source code:

// 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 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();
    }
}

      

Ok, now you've seen my mess ... I kind of know what I should be doing and YES I've done some research, but I feel like it would be much easier to learn an organization by example or a nice nudge than it would be from reading articles telling you about ultra-hypothetical or loosely analogous examples of what objects are. Note. I tried using methods for ordering, and my class looks much better than what it did (I also did everything that would need to be put to the bottom, which is practically useless).

+3


source to share


3 answers


Thanks to everyone who contributed to my problem, I completely ditched this garbage and made it 1000 times better. I knew it was badly done from the start and I wanted to fix it, I just didn't know where to start. After reading all the advice that was given, looking at a few tutorials, and cleaning up some simple java concepts (modifiers, jswing, etc.), I ended up creating a new one that is in MVC format (Yay, order and efficiency). Now all my new variables are really meaningful (thanks to @maaartinus for helping me figure out that many of my variables were badly named and made my whole program unnecessarily complex). Also, I tried to work on SRP (not 100% sure if I did it completely, but with an organized program it will be easy to make a difference),and I plan on adding units later for good practice (thanks @Robert Snyder). This new GUI is ugly, but you can always change it later, and since it is now in MVC format, the task will be easier.

Here's what I did (not finished and far from perfect, but a step in the right direction):

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);

}
}

      

+2


source


If you are using eclipse try:

Window> Preferences> Java> Editor> Save Actions

Check "perform selected actions on save", "Additional actions" and click "Configure".

Using eclipse Save Actions

can be really helpful in actual coding, but you will probably learn some neat java tricks going through the wizard Save Actions

.

Java is an object oriented language. You need to take advantage of this fact.
Use classes to separate your code into different logical / structural components. Learn how to use OOP. Follow SOLID and use design patterns .

Another important thing is knowing your language. Start by reading the base classes javadoc

and the relevant sections of the java specification. I would start with a deep understanding of the various types of java ( class

, interface

, enum

and internal / embedded / anonymous types) and various modifiers ( private

, public

, protected

, static

, abstract

, final

, default

).



Some other short eclipses:

CTRL-A

, CTRL-I

("indentation") will fix your code indentation. CTRL-SHIFT-O

("arrange imports") will not contain redundant imports.
+3


source


You might want to take a look at Code Complete, which tackles the questions that interest you and otherwise, it's just a classic in our field that every serious developer should read.

In general, when you organize your code, you should do it with a few things in mind: readability and atomicity. These two factors apply to code at every level of the application, from variable names, subroutines, methods, classes, packages, and more.

Readability is a simple idea: can a person read this code and understand it? To appreciate the readability of your code, all you have to do is read it! Do variable names help the reader understand that something is there? Are subroutines and classes well formatted and not necessarily complex? Have you removed all the code that is not in use? Is your code written in a logical progression?

Atomicity is the idea that everything should have one goal. A function or method should (usually) do one thing and only one thing. Typically a class should be a logical grouping of related methods and fields serving a specific type of unique purpose, NOT a jumble of unrelated things. The package should also contain a set of related files. It's the same with the project, etc.

The main benefit of atomicity is that once you get into more involved applications, it is actually much easier to debug and isolate problems in your code because you know where it is going. For example: I have a database access error! It's good that I have a package specifically defined for database access objects.

I know when I first started in this field, it also threw me away. This may not be the case until you do a lot of coding in larger applications that really start to understand best practices and why people create stuff in a certain way.

+2


source







All Articles