• 结对项目-小学生四则运算系统(GUI)


    Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git

    伙伴博客:http://www.cnblogs.com/wangyy39/p/8763244.html

    目录:

    一、前言

    二、计划时间——PSP

    三、接口设计

    四、接口实现

    五、性能分析

    六、单元测试

    七、异常处理

    八、模块设计

    九、模块对接

    十、她

    十一、结对编程思考

    十二、实际时间——PSP

    十三、关于柱状图的实现

    一、前言

    首先我很感谢我的队友——王玥莹,谢谢她的努力,放弃自己休息的时间。

    二、PSP

    PSP

    任务内容

    计划时间(min)

    Planning

    计划

    30

         Estimate

        估计这个任务需要多少时间,并规划大致工作步骤

    30

    Development

    开发

    35*60+25

        Analysis

        需求分析

    60

        Design Spec

        生成文档

    0

        Design Review

        设计复审

    2*60

        Coding Standard

        代码规范

    10

        Design

        具体设计

    12*60

        Coding

        具体编码

    2*8*60

        Code Review

        代码复审

    4*60

        Test

        测试

    15

    Reporting

    报告

    5.5*60

        Test Report

        测试报告

    60

        Size Measurement

        计算工作量

    30

       Postmortem& ProcessImprovement Plan

        事后总结, 并提出过程改进计划

    4*60

    三、接口设计

    信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。

      在结对项目中,使用命令行模式执行和使用GUI界面执行出题部分时调用了同一部分核心代码,在这里我将出题这一部分信息隐藏,当改变人机交互模式的时候就不会给系统带来全局性的影响。在我的程序中避免了A类调用B类的程序,B类有调用A类的程序这种情况,这也是所谓的“循环依赖”,这种情况会阻碍信息隐藏。

    接口设计(Interface Design)

      在本项目设计接口过程中,使用有意义的命名方式使接口的功能一目了然,增强了可读性;类名和方法名也都使用了有意义的命名方式;在开发过程中加好了注释,方便自己和他人看懂代码;在接口设计过程中对相关原则也有了一些体会,主要参考以下内容:

    https://blog.csdn.net/blueangle17/article/details/55049858

    https://jingyan.baidu.com/article/066074d626ea09c3c21cb0b9.html

    四、接口实现

    我们用到了按钮监听器和复选框监听器以及文件监听器,对于时间计算方面我们选择的是比较简单但是简陋的计时器。

    五、性能分析

    讲真,这个项目对于我们来说,能完成已经是竭尽全力,在优化性能时尽管有些抵触,但也算尽力,尽量减少内存占用率,减少嵌套循环和数组过大带来的资源浪费。在生成计算式时,不符合要求的计算式需要舍弃,在数值较大时,十分容易造成资源的浪费,因此我们在数值较大时,尽量限制了乘法时数的大小,尽量避免连续多次弃用。

    六、单元测试

    测试Command类

    设计思路:

      在main方法中实现了对输入参数的解析和对输入参数异常的报错,所以测试这个部分的函数最主要的就是构造不同的异常情况,同时也不要忘记测试参数正确时的情况,因为这也是代码的一部分(单元测试中第一次就是因此覆盖率较低)。

    单元测试代码展示(测试Command.java):

    import static org.junit.Assert.*;
    
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    
    public class CommandTest {
    
        @BeforeClass
        public static void setUpBeforeClass() throws Exception {
        }
    
        @AfterClass
        public static void tearDownAfterClass() throws Exception {
        }
    
        @Before
        public void setUp() throws Exception {
        }
    
        @After
        public void tearDown() throws Exception {
        }
    
        @Test
        public void testNewExpSome() {
            for(int i=0;i<6;i++){
                Command.expression(false, 200, 20, 6);
            }
            for(int i=0;i<24;i++){
                Command.expression1(true, 200, 20, 4);
                Command.exprission2(true, 200, 20, 4);
                Command.expression3(true, 200, 20, 4);
            }
    
            System.out.println("Command程序正常!");
        }
    
        @Test
        public void testDivideExactly() {
    
        }
    
    }
    
    CommandTest

    七、异常处理:

    if(radioButtonMenuItem01.isSelected()){flag='a';}
                            if(radioButtonMenuItem02.isSelected()){flag='b';}
                            if(radioButtonMenuItem03.isSelected()){flag='c';}
                            String n = JOptionPane.showInputDialog(
                                    frame,
                                    "输入题目的数量(1-1000):"
                            );
                            String m = JOptionPane.showInputDialog(
                                    frame,
                                    "输入数值范围(1-10000):"
                            );
                            String z = JOptionPane.showInputDialog(
                                    frame,
                                    "输入符号数量(1-10):"
                            );
                            if(n==null||n.equals("")&&m==null||m.equals("")&&z==null||z.equals("")){
                                textArea.append("取消生成,请检查数值
    ");
                            }
    if(arithExpress.isEmpty()){
                                JOptionPane.showMessageDialog(
                                        frame,
                                        "没有读取到默认题库,请先生成或者打开本地题库",
                                        "消息标题",
                                        JOptionPane.WARNING_MESSAGE
                                );

     

    八、模块设计

     导航页和获得出题参数页使用了同种方式来生成用户界面,代表导航页和出题参数页的类继承了JFrame类,在内部类中加入页面需要的各种组件,并将这个内部类的对象加入到外部类的实例中,在这里以导航页的代码为例展示这种方式(因代码太长所以只展示一部分):

    CalFrame frame=new CalFrame();
                    DoFile doFile=new DoFile();
                    StrPro strPro=new StrPro();
                    Expression expression=new Expression();
                    arithExpress=doFile.ReadFile("./result.txt");//默认从当前目录读取题库
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                    frame.setLocationRelativeTo(null);
                    frame.setTitle("小学四则运算测试");
    
                    JMenuBar menuBar = new JMenuBar();
    
                    JMenu sysMenu = new JMenu("系统");
                    JMenu chooseMenu = new JMenu("题型选择");
                    JMenu aboutMenu = new JMenu("关于");
    
                    menuBar.add(sysMenu);
                    menuBar.add(chooseMenu);
                    menuBar.add(aboutMenu);
    
                    JPanel panel = new JPanel(new BorderLayout());
    
                    JPanel centerPanel = new JPanel(new BorderLayout());
                    panel.add(centerPanel,BorderLayout.CENTER);
    
                    // 创建文本区域组件
                    JTextArea textArea = new JTextArea();
                    textArea.setLineWrap(true);
                    textArea.setFont(new Font(null, Font.PLAIN, 18));
                    JScrollPane scrollPane = new JScrollPane(
                            textArea,
                            ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
                    );
    
                    JPanel rightPanel = new JPanel();
                    rightPanel.setLayout(null);
    
                    JLabel arithLabel=new JLabel("点击开始答题按钮,开始答题");
                    arithLabel.setBounds(30,80,250,50);
                    arithLabel.setFont(new Font(null, Font.PLAIN, 20));
                    JLabel helloLabel=new JLabel("请仔细查看算式后得出计算结果!");
                    helloLabel.setBounds(20,10,500,50);
                    helloLabel.setFont(new Font(null, Font.PLAIN, 20));
    
                    JTextField textField = new JTextField(8);
                    textField.setBounds(330, 80, 200, 40);
                    textField.setFont(new Font(null, Font.PLAIN, 20));
                    JButton btn = new JButton("确定");
                    btn.setFont(new Font(null, Font.PLAIN, 20));
                    btn.setBounds(340, 160, 180, 40);
    
                    rightPanel.add(helloLabel);
                    rightPanel.add(arithLabel);
                    rightPanel.add(textField);
                    rightPanel.add(btn);
    
                    JSplitPane splitPane = new JSplitPane();
                    splitPane.setLeftComponent(scrollPane);
                    splitPane.setRightComponent(rightPanel);
                    splitPane.setOneTouchExpandable(true);
                    splitPane.setContinuousLayout(true);
                    splitPane.setDividerLocation(300);
    
                    centerPanel.add(splitPane,BorderLayout.CENTER);

    九、模块对接

    1、参数传递功能

    String n = JOptionPane.showInputDialog(
                                    frame,
                                    "输入题目的数量(1-1000):"
                            );
                            String m = JOptionPane.showInputDialog(
                                    frame,
                                    "输入数值范围(1-10000):"
                            );
                            String z = JOptionPane.showInputDialog(
                                    frame,
                                    "输入符号数量(1-10):"
                            );

    2、选择计算方式功能

    switch(flag){
                                        case 'a':
                                            expression.generateExpressionA(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
                                            break;
                                        case 'b':
                                            expression.generateExpressionB(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
                                            break;
                                        case 'c':
                                            expression.generateExpressionC(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
                                            break;
                                    }

    3、做题功能

    public void actionPerformed(ActionEvent e) {
                            if(!doFlag){
                                JOptionPane.showMessageDialog(frame,"请点击开始答题按钮,进行测试!","消息标题",JOptionPane.WARNING_MESSAGE);
                            }
                            else{
                                textArea.append("上一题
    ");
                                textArea.append("算式:"+strPro.StrSplitBefore(arithExpress.get(index))+"="+textField.getText()+"
    ");
                                if(!textField.getText().equals("")||textField.getText()!=null){
                                    ansHash.put(index, strPro.StrSplitAfter(arithExpress.get(index)));
                                    resHash.put(index, textField.getText());
                                }

    4、统计分析功能

    使用了绘制柱状图工具类,从一篇博客中学习找到的灵感 链接:http://www.jb51.net/article/73346.htm

    ChartPanel frame1;
        static StrPro strPro=new StrPro();
        static DoFile doFile=new DoFile();
        public  BarChart(){
            CategoryDataset dataset = getDataSet();
            JFreeChart chart
                    ;
            chart = ChartFactory.createBarChart3D(
                    "四则运算测试结果图表", // 图表标题
                    "测试轮/次", // 目录轴的显示标签
                    "题数", // 数值轴的显示标签
                    dataset, // 数据集
                    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                    true,           // 是否显示图例(对于简单的柱状图必须是false)
                    false,          // 是否生成工具
                    false           // 是否生成URL链接
            );
    
            //从这里开始
            CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
            CategoryAxis domainAxis=plot.getDomainAxis();         //水平底部列表
            domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14));         //水平底部标题
            domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));  //垂直标题
            ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
            rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
            chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
            chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
    
            //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题
    
            frame1=new ChartPanel(chart,true);        //这里也可以用chartFrame,可以直接生成一个独立的Frame

    十、结对成员

    1、我:优点:技术较强,善于思考 缺点:态度有时不够端正,不认真。

    2、她:优点:认真,上进,积极活泼,又带动性。缺点:技术稍差。

    十一、对编程思考

    结对编程有好处:

    一、结对编程可以相互学习互相鼓励

    二、分工明确,可以提高做事效率

    三、增强两个人的关系,增强合作能力、增强代码理解能力。

    四、在出现错误时,伙伴可以及时发现并且指出,少走弯路

    结对编程有坏处:

    一、需要大量的交流,如果交流沟通不到位,项目将寸步难行。

    二、可能会出现思路的分歧,导致两人代码出现分歧,难以结合。

    三、两人分工的不均匀,有可能出现技术强带技术弱做项目的情况。

    十二、PSP

    PSP

    任务内容

    完成时间(min)

    Planning

    计划

    60

         Estimate

        估计这个任务需要多少时间,并规划大致工作步骤

    60

    Development

    开发

    45*60

        Analysis

        需求分析

    45

        Design Spec

        生成文档

    0

        Design Review

        设计复审

    3*60

        Coding Standard

        代码规范

    15

        Design

        具体设计

    12*60

        Coding

        具体编码

    3*8*60

        Code Review

        代码复审

    4*60

        Test

        测试

    60

    Reporting

    报告

    9*60

        Test Report

        测试报告

    0

        Size Measurement

        计算工作量

    60

       Postmortem& ProcessImprovement Plan

        事后总结, 并提出过程改进计划

    8*60

    十三、柱状图的实现

      相关实现代码如图,主要借用了jfreechart的工具类,jfreechart是一个图标绘制类库,通过对jfreechart的引用,实现了项目中的柱状图。在下面的博客中具体的讲解了jfreechart的使用方法,包括了柱状图、饼图、折线图等。

    相关参考博客:https://blog.csdn.net/pzhtpf/article/details/7600100/

     

    参考博客:https://www.cnblogs.com/xdp-gacl/p/3633744.html(GUI的使用)

  • 相关阅读:
    requets中urlencode的问题
    洛谷$P4503 [CTSC2014]$企鹅$QQ$ 哈希
    洛谷$P5446 [THUPC2018]$绿绿和串串 $manacher$
    洛谷$P5329 [SNOI2019]$字符串 字符串
    洛谷$P1390$ 公约数的和 欧拉函数
    洛谷$P4318$ 完全平方数 容斥+二分
    入门懵逼钨丝繁衍
    $ CometOJ-Contest#11 D$ $Kruscal$重构树
    洛谷$P4884$ 多少个1? 数论
    入门数论简单总结
  • 原文地址:https://www.cnblogs.com/FrrLolix/p/8763072.html
Copyright © 2020-2023  润新知