首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >calculator.java

calculator.java
EN

Code Review用户
提问于 2018-01-22 11:40:31
回答 2查看 232关注 0票数 0

calc.java

代码语言:javascript
复制
import java.awt.*;

public class calc extends Frame {

    Button[] b = new Button[25];
    Pan tf = new Pan(1);
    Font f = new Font("TimesRoman", Font.BOLD, 14);
    double n = 0;
    int op;
    boolean flag = false;
    Toolkit tool;

    public static void main(String[] args) {
        new calc();
    }

    public calc() {
        setTitle("Calculator");
        tool = getToolkit();
        setBackground(new Color(38, 104, 165));
        setForeground(new Color(255, 255, 255));
        setResizable(false);
        setIconImage(tool.getImage(GetResources("ico.gif")));
        resize(350, 400);
        setLayout(null);
        add(tf);
        tf.setBounds(50, 50, 240, 25);
        tf.setFont(f);
        tf.setForeground(new Color(0, 0, 0));
        tf.setBackground(new Color(150, 150, 255));
        tf.setText("0");
        for (int i = 0; i < 25; i++) {
            String s = "" + i;
            if (i >= 10) {
                switch (i) {
                    case 10:
                        s = "+";
                        break;
                    case 11:
                        s ="-";break;
         case 12:
                        s = "*";
                        break;
                    case 13:
                        s = "/";
                        break;
                    case 14:
                        s = "=";
                        break;
                    case 15:
                        s = "C";
                        break;
                    case 16:
                        s = "sqrt";
                        break;
                    case 17:
                        s = "%";
                        break;
                    case 18:
                        s = "sin";
                        break;
                    case 19:
                        s = "cos";
                        break;
                    case 20:
                        s = "tan";
                        break;
                    case 21:
                        s = "Exp";
                        break;
                    case 22:
                        s = "Log";
                        break;
                    case 23:
                        s = "";
                        break;
                    case 24:
                        s = "";
                        break;
                }
            }
            b[i] = new Button(s);
            b[i].setFont(new Font("TimesRoman", 1, 20));
            b[i].setForeground(new Color(0, 0, 0));
            b[i].setBackground(new Color(255, 255, 222));
            add(b[i]);
            if (i < 5) {
                b[i].setBounds(50 + 50 * i, 100, 40, 40);
            } else if (i < 10) {
                b[i].setBounds(50 + 50 * (i - 5), 150, 40, 40);
            } else if (i < 15) {
                b[i].setBounds(50 + 50 * (i - 10), 200, 40, 40);
            } else if (i < 20) {
                b[i].setBounds(50 + 50 * (i - 15), 250, 40, 40);
            } else {
                b[i].setBounds(50 + 50 * (i - 20), 300, 40, 40);
            }
        }
        Dimension res = tool.getScreenSize();
        move((int) ((res.width - 400) / 2 + 100), (int) ((res.height - 400) / 2 + 100));
        setVisible(true);
    }

    public java.net.URL GetResources(String s) {
        return this.getClass().getResource(s);
    }

    public boolean handleEvent(Event e) {
        if (e.id == Event.WINDOW_DESTROY) {
            dispose();
        }
        if (e.id == Event.ACTION_EVENT) {
            for (int i = 0; i < 10; i++) {
                if ((e.target).equals(b[i])) {
                    String s = tf.getText();
                    if (s.equals("0")) {
                        s = "" + i;
                    } else if (flag) {
                        s = "" + i;
                        flag = false;
                    } else {
                        s += i;
                    }
                    tf.setText(s);
                    return true;
                }
            }
            if ((e.target).equals(b[10])) {
                n = Double.parseDouble(tf.getText());
                op = 10;
                flag = true;
                return true;
            }
            if ((e.target).equals(b[11])) {
                n = Double.parseDouble(tf.getText());
                op = 11;
                flag = true;
                return true;
            }
            if ((e.target).equals(b[12])) {
                n = Double.parseDouble(tf.getText());
                op = 12;
                flag = true;
                return true;
            }
            if ((e.target).equals(b[13])) {
                n = Double.parseDouble(tf.getText());
                op = 13;
                flag = true;
                return true;
            }
            if ((e.target).equals(b[14])) {
                switch (op) {
                    case 10:
                        n += Double.parseDouble(tf.getText());
                        break;
                    case 11:
                        n -= Double.parseDouble(tf.getText());
                        break;
                    case 12:
                        n *= Double.parseDouble(tf.getText());
                        break;
                    case 13:
                        n /= Double.parseDouble(
                                tf.getText());
                        break;
                    case 17:
                        n %= Double.parseDouble(tf.getText());
                        break;
                }
                String ss = "" + n;
                if (ss.endsWith(".0")) {
                    ss = ss.substring(0, ss.length() - 2);
                }
                tf.setText(ss);
                return true;
            }
            if ((e.target).equals(b[15])) {
                tf.setText("0");
                flag = false;
                return true;
            }
            if ((e.target).equals(b[16])) {
                double d = Double.parseDouble(tf.getText());
                if (d >= 0) {
                    n = Math.sqrt(d);
                    String ss = "" + n;
                    if (ss.endsWith(".0")) {
                        ss = ss.substring(0, ss.
                                length()
                                - 2);
                    }
                    tf.setText(ss);
                }
                return true;
            }
            if ((e.target).equals(b[17])) {
                n = Double.parseDouble(tf.getText());
                op = 17;
                flag = true;
                return true;
            }
            if ((e.target).equals(b[18])) {
                double d = Double.parseDouble(tf.getText());
                n = Math.sin(d);
                String ss = "" + n;
                if (ss.endsWith(".0")) {
                    ss = ss.substring(0, ss.length()
                            - 2);
                }
                tf.setText(ss);
                return true;
            }
            if ((e.target).equals(b[19])) {
                double d = Double.parseDouble(tf.getText());
                n = Math.cos(d);
                String ss = "" + n;
                if (ss.endsWith(".0")) {
                    ss = ss.substring(0, ss.length()
                            - 2);
                }
                tf.setText(ss);
                return true;
            }
            if ((e.target).equals(b[20])) {
                double d = Double.parseDouble(tf.getText());
                n = Math.tan(d);
                String ss = "" + n;
                if (ss.endsWith(".0")) {
                    ss = ss.substring(0, ss.length() - 2);
                }
                tf.setText(ss);
                return true;
            }
            if ((e.target).equals(b[21])) {
                double d = Double.parseDouble(tf.getText());
                n = Math.exp(d);
                String ss = "" + n;
                if (ss.endsWith(".0")) {
                    ss = ss.substring(0, ss.length() - 2);
                }
                tf.setText(ss);
                return true;
            }
            if ((e.target).equals(b[22])) {
                double d = Double.parseDouble(tf.getText());
                if (d > 0) {
                    n = Math.log(d);
                    String ss = "" + n;
                    if (ss.endsWith(".0")) {
                        ss = ss.substring(0, ss.length() - 2);
                    }
                    tf.setText(ss);
                }
                return true;
            }
        }
        return false;
    }
}

Pan.java

代码语言:javascript
复制
class Pan extends Panels {

    public Font f = new Font("Helvetica", 1, 18);
    FontMetrics fm = getFontMetrics(f);
    public String s = "";
    private int tip;

    public Pan() {
        super();
    }

    public Pan(int tip) {
        this();
        this.tip = tip;
    }

    public void setText(String s) {
        this.s = s;
        repaint();
    }

    public String getText() {
        return s;
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setFont(f);
        if (tip == 1) {
            g.setColor(Color.white);
            g.drawString(s, size().width - fm.stringWidth(s) - 6, 20);
        } else {
            g.setColor(Color.black);
            g.drawString(s, 10, 20);
        }
    }
}

Panels.java

代码语言:javascript
复制
class Panels extends Panel {

    public Image im, im1;

    public Panels(Image im) {
        this.im = im;
    }

    public Panels() {
    }

    public void update(Graphics g) {
        paint(g);
    }

    public void paint(Graphics g) {
        super.paint(g);
        Dimension dimension = size();
        im1 = createImage(dimension.width, dimension.height);
        pan(im1.getGraphics());
        g.drawImage(im1, 0, 0, this);
    }

    public void pan(Graphics g) {
        Dimension dimension = size();
        int w = dimension.width;
        int h = dimension.height;
        Color color = getBackground();
        g.setColor(color);
        g.fillRect(0, 0, w, h);
        if (im != null) {
            for (int k = 0; k < w; k += im.getWidth(this)) {
                for (int l = 0; l < h; l += im.getHeight(this)) {
                    g.drawImage(im, k, l, this);
                }
            }
        }
        g.setColor(color.brighter());
        g.drawRect(1, 1, w - 2, h - 2);
        g.setColor(color.darker());
        g.drawRect(0, 0, w - 2, h - 2);
    }
}
EN

回答 2

Code Review用户

发布于 2018-01-22 11:59:52

  • 类名应该用大写字母拼写(也称为PascalCase,或UpperCamelCase)。您的calc类以小写字母开头。与所有类名大写的一致性对于可读性很重要,并且能够区分类和变量。
  • 你的代码中有很多缩写。在编写一个较长的程序时,缩写类和变量名(或者更糟的是:使用单个字母)可能很诱人,这样就必须编写更少的代码,但特别重要的是要写出更长的名称,告诉您它们的意思。变量名应该告诉您它包含了什么。例如,Button[] b = new Button[25];应该是Button[] buttons = new Button[25];
  • 您的缩进在几个地方关闭,特别是在您的开关语句。在阅读代码时,这可能会非常令人困惑。如果使用IDE编辑代码,它可能会自动为您格式化代码。
  • 您有一个非常混乱的类层次结构。类名都是彼此的不同版本,有时是单数,有时是复数,有时是缩写。(Pan扩展了Panels,扩展了Panel。)要么试着想出更好的名字,要么重新考虑它们是否真的应该互相延伸。问问自己:Is a Pan也是Panels的一种吗?PanelsPanel的一种吗?
  • 您正在使用硬编码界( for (int i = 0; i < 25; i++) { ... } )迭代数组。简单地删除一个按钮并将数组缩减到24长度将导致您的程序与IndexOutOfBoundsException崩溃。相反,动态访问数组的长度:myArray.length会给出它的长度。所以循环应该如下所示:for (int i = 0; i < b.length; i++) { ... }
  • 您在构造函数中做了很多事情,包括启动程序(即实际的计算器GUI)。最好将代码移动到方法中(或者更好地说:多个方法,分为逻辑相关代码的一部分),并从构造函数中调用该方法(S)。此外,使用公共方法在创建实例后初始化和启动程序。如果代码只是通过执行new calc();启动GUI,这是意外的。相反,可以这样做:new calc().show();或类似的东西,这样您就可以始终知道它不仅会创建一个对象,而且还会显示GUI。
票数 5
EN

Code Review用户

发布于 2018-01-22 13:02:58

因为它看起来像是‘第五课’,我将在此基础上复习。

缩略语

95%的时间使用缩写会降低代码的可读性。例如"tf“、"b”、"n“、"op”。如果我正在阅读代码,并不得不滚动以了解什么是'tf‘的实际含义,它禁止’阅读流程‘。

另外:类名应该是名词--正如在另一篇文章中已经提到的:它们应该是单数。方法应该包含一个动词。

命名资料

总是给“事物”一个恰当的名字,越清晰越好。您有一个方法calc()。首先,我想,事情将在这里计算。但它实际上初始化了gui。所以,initializeGUI会帮上忙的。

为什么这很重要:根据你必须完成的任务,你花更多的时间阅读代码而不是编写代码。

做了一件事

重要的是,一种方法能做一件事。它做得越多,理解起来就越复杂。例如,handleEvent()方法会关闭窗口并执行计算。

Java编码约定

http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

雷蒙德已经提到了像PascalCase这样的东西。很多事情都是自然发生的,但我认为这是一种很好的阅读方式,你可以避免养成非常规的习惯。

主要方法

通常,主要的方法放在类的末尾。

作用域

99%的情况下,成员变量应该声明为私有变量。我建议养成一种习惯。如果您决定让变量更公开,您需要有一个很好的理由。

@重写

您已经重写了超类中的一些方法,始终用@Override注释对它们进行注释。首先,这向读者显示,它是从超类或接口中重写的,但如果您以某种方式破坏了重构,编译器将告诉您“您得到了一个@重写注释,但实际上,它没有被重写”。

希望这能帮上忙

慢慢来

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/185679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档