• 结对编程1-模块化


    一、结对成员介绍及coding.net 地址

    (本人)魏修祺 201421122008 coding.net地址:[https://coding.net/u/weixuiqi/p/Pair-programing-one/git];

    (成员)吴吉键 201421122007 博客地址:[http://www.cnblogs.com/blogWU/].

    演示视频(优酷网):[http://v.youku.com/v_show/id_XMzEwMDU5NDM0MA==.html?spm=a2h3j.8428770.3416059.1].

    二、题目描述:

    在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI,成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:

    1. 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。

    2. 有计时功能,能显示用户开始答题后的消耗时间。

    3. 界面支持中文简体/中文繁体/英语,用户可以选择一种;

    三、项目实现:

    1、需求分析

    • 在题目描述3个功能中,我和队友分工完成,我完成的是界面语言选择和错题记录;
    • 针对于所要完成的功能,首先要设计一个GUI,友好的界面,方便用户体会各种功能;
    • 对于不同地区,可以有不同语言的选择,按要求只完成3个语言选择;
    • 错题记录,记录用户使用过程产生的错题,方便用户学习。

    2、程序设计

    说明:四则远算主要功能分为,计算、语言选择、计时、记录。其中计算是最核心最重要的部分,但在个人作业1中已经有过详细说明,这里不再细说。语言选择提高三种语言选择,初始默认为简体中文。计时功能,记录用户在开始答题直到答题结束消耗时间。记录主要是对答题结束之后,将对错总数和错题写到文件里。

    3、代码展示

    1.主界面

        public MainFrame(int oper) {
            // 创建组件
            jb1 = new JButton(Lovo.locale(oper).getString("jb1"));
            jb2 = new JButton(Lovo.locale(oper).getString("jb2"));
            jb3 = new JButton(Lovo.locale(oper).getString("jb3"));
            // 设置监听
            jb1.addActionListener(this);
            jb2.addActionListener(this);
            jb3.addActionListener(this);
    
            jmb = new JMenuBar(); // JMenuBar指菜单栏
            jm1 = new JMenu(Lovo.locale(oper).getString("jm1")); // JMenu是菜单栏中的选项栏
            jm2 = new JMenu(Lovo.locale(oper).getString("jm2"));
            jm3 = new JMenu(Lovo.locale(oper).getString("jm3"));
    
            jmi1 = new JMenuItem(Lovo.locale(oper).getString("jmi1")); // JMenuItem指选项栏中的选项
            jmi1.addActionListener(this);
            jmi2 = new JMenuItem(Lovo.locale(oper).getString("jmi2"));
            jmi2.addActionListener(this);
    
            jmi3 = new JMenuItem("简体中文");
            jmi3.addActionListener(this);
            jmi4 = new JMenuItem("繁體中文");
            jmi4.addActionListener(this);
            jmi5 = new JMenuItem("English");
            jmi5.addActionListener(this);
    
            jmi6 = new JMenuItem(Lovo.locale(oper).getString("jmi6"));
            jmi6.addActionListener(this);
            jmi7 = new JMenuItem(Lovo.locale(oper).getString("jmi7"));
            jmi7.addActionListener(this);
    
            jm1.add(jmi1);
            jm1.add(jmi2);
    
            ...
    
            jp1 = new JPanel();
    
            ...
    
            jlb1 = new JLabel(Lovo.locale(oper).getString("jlb1"));
    
            ...
    
            jtf1 = new JTextField(20);
            jtf2 = new JTextField(20);
    
            ...
     
            // 加入到JPanel中
            jp1.add(jlb1);
            jp1.add(jtf1);
    
            ...
    
            // 加入JFrame中
            this.setJMenuBar(jmb);
            this.add(jp1);
    
            ...
    
            // 设置布局管理器
            this.setLayout(new GridLayout(7, 1));
            // 给窗口设置标题
            this.setTitle(Lovo.locale(oper).getString("jf"));
            // 设置窗体大小
            this.setSize(500, 300);
            // 设置窗体初始位置
            this.setLocationRelativeTo(null);
            // 设置当关闭窗口时,保证JVM也退出
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 显示窗体
            this.setVisible(true);
            this.setResizable(false);
    
        }

    2.语言选择实现 参考博客:[http://blog.csdn.net/wendy432/article/details/52494064]

    2.1语言选择监听

     1         // 切换到中文
     2         if (e.getSource().equals(jmi3)) {
     3             this.dispose();
     4             new MainFrame(0);
     5         }// 切换到英文
     6         else if (e.getSource().equals(jmi4)) {
     7             this.dispose();
     8             MainFrame mf = new MainFrame(2);
     9             mf.setOper(2);
    10         }// 切换到繁体
    11         else if (e.getSource().equals(jmi5)) {
    12             this.dispose();
    13             MainFrame mf = new MainFrame(1);
    14             mf.setOper(1);
    15         }

    2.2根据不同参数获取地区

     1     public static ResourceBundle locale(int m) {
     2         ResourceBundle bundle = null;
     3         switch (m) {
     4         case 0:
     5             bundle = ResourceBundle.getBundle("mess", Locale.CHINESE);
     6             break;
     7         case 1:
     8             bundle = ResourceBundle.getBundle("mess", Locale.US);
     9             break;
    10         case 2:
    11             bundle = ResourceBundle.getBundle("mess", Locale.TAIWAN);
    12         }
    13         return bundle;
    14     }
    15 }

    2.3根据获取的地区语言调用不同资源文件,实现语言替换

    3.错题集的实现

    3.1每次答错会将错误的题目、正确答案和答错的答案存到一个List中。err为错误个数,question为题目,message为错误答案,answer为正确答案。

    1 errList.add(err + ":  " + question + "=" + message +"
    "+"answer:"+ answer);

    3.2当所有题目答完之后,将错误的所有合集写到文件error.txt中

    1 ErrorOutPut.outPut(errList);
     1 public static void outPut(List<Object> errList) {
     2         String filepath = "errList.txt";
     3         File file = new File(filepath);
     4         BufferedWriter out = null;
     5         if (file.exists()) {
     6             try {
     7                 out = new BufferedWriter(new OutputStreamWriter(
     8                         new FileOutputStream(file, true)));
     9                 // 输出时间
    10                 Date now = new Date();
    11                 String date = DateFormat.getDateTimeInstance().format(now);
    12                 out.write("DATE:" + date);
    13                 out.newLine();
    14                 // 输出错题集
    15                 while (errList.size() != 0) {
    16                     String err = (String) errList.remove(0);
    17                     out.write(err);
    18                     out.newLine();
    19                 }
    20             } catch (IOException e) {
    21                 e.printStackTrace();
    22             } finally {
    23                 try {
    24                     out.close();
    25                 } catch (IOException e) {
    27                     e.printStackTrace();
    28                 }
    29             }
    30         } else {
    31             try {
    32                 file.createNewFile();
    33                 out = new BufferedWriter(new OutputStreamWriter(
    34                         new FileOutputStream(file, true)));
    35                 // 输出时间
    36                 Date now = new Date();
    37                 String date = DateFormat.getDateTimeInstance().format(now);
    38                 out.write(date);
    39                 out.newLine();
    40                 // 输出错题集
    41                 while (errList.size() != 0) {
    42                     String err = (String) errList.remove(0);
    43                     out.write(err);
    44                     out.newLine();
    45                 }
    46             } catch (IOException e) {
    47                 e.printStackTrace();
    48             } finally {
    49                 try {
    50                     out.close();
    51                 } catch (IOException e) {
    53                     e.printStackTrace();
    54                 }
    55             }
    56         }
    57     }

    3.3主界面监听触发查看错题集

    1         // 错题集
    2         else if (e.getSource().equals(jmi6)) {
    3             new ErrListFrame(getOper());
    4         }

    3.4先将文件中内容读取出来存放在errList中,在一个新界面显示

     1 public static List<Object> readErrList() {
     2         String filepath = "errList.txt";
     3         File file = new File(filepath);
     4         String lineTex = null;
     5         List<Object> errList = new ArrayList<Object>();
     6         try {
     7             if (file.isFile() && file.exists()) {
     8                 BufferedReader br = new BufferedReader(new FileReader(file));
     9                 while ((lineTex = br.readLine()) != null) {
    10                     errList.add(lineTex);
    11                 }
    12                 br.close();
    13             } else {
    14                 System.out.println("文件不存在!");
    15             }
    16         } catch (Exception e) {
    17             System.out.println("文件读取错误!");
    18         }
    19         return errList;
    20     }
     1 public ErrListFrame(int oper) {
     2         jta = new JTextArea();
     3         scroll = new JScrollPane(jta);
     4         // jta.setPreferredSize(new Dimension(350,400));
     5         jta.setFont(new Font("标楷体", Font.PLAIN, 14)); // 设置当前字体。
     6         jta.setEditable(false);
     7         jta.setBackground(Color.white);
     8         scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
     9         List<Object> readErrList = ReadErrList.readErrList();
    10         for (int i = 0; i < readErrList.size(); i++) {
    11             errList = errList + (String) readErrList.get(i) + "
    " + "  ";
    12         }
    13         jta.setText(errList);
    14 
    15         this.add(scroll);
    16         // 给窗口设置标题
    17         this.setTitle(Lovo.locale(oper).getString("jmi6"));
    18         // 设置窗体大小
    19         this.setSize(350, 400);
    20         // 设置窗体初始位置
    21         this.setLocationRelativeTo(null);
    22         // 显示窗体
    23         this.setVisible(true);
    24         this.setResizable(false);
    25 
    26     }

    4、程序运行

    1.主界面

    2.选择语言(默认是简体中文)

    3.计算及结果展示(第二张图表示不同语言效果)

    4.记录功能:错题集和历史记录

    5、小结感受

    • 本次结对编程是在个人作业1基础上进行增量,队友作业1功能完成比较完善,在他的个人作业1上增量开发,不用再次去大量完善个人作业1的功能,容易了很多。
    • 结对编程的队友是同宿舍的,过去也有一起结对编程经历,队友之间很熟悉,配合起来相对默契。
    • 结对编程分工,根据自己想要完成和自己有能力完成的功能来分配,编程过程中遇到问题相互沟通,很快就解决。
    • 对于结对编程真的能带来1+1>2的效果吗? 这个问题我觉得是要在双方具有默契的时候,比如编程过程中采用标准化,java编程命名采用驼峰命名法等,并且队友之间沟通顺畅,遇到问题能够一起解决,这样的结对编程才能带来1+1>2的效果。

    四、运用“汉堡包”的方式,评价结对伙伴:

    优点:对于问题的处理非常快,解决思路很清晰,非常值得学习。

    缺点:有些方法没标明用途,代码的注释有点欠缺。

    希望他提高的地方:对一些方法尽量标明用途,以便以后容易重新查阅。

    五、描述结对过程:

    1.读完题目,明确任务需求。这次结对编程需要在个人作业1上增加3个功能。

           2.根据任务需求和自身条件分配任务,比如这次结对编程我要完成的任务是主界面设计、语言选择和错题集。

           3.独自完成自己任务,遇到问题时一起沟通解决。比如在做语言选择时,语言切换使用关掉上个界面,启用新界面来处理的,实际操作中新界面弹窗出现问题,在讨论中发现新界面弹窗语言切换参数是旧界面的而非新界面的。自己独立最终也能发现问题,但不会如此快速。

           4.完成功能后,相互互省代码,调试功能。

           5.整合所有功能代码,调试功能是否冲突。

    六、展示PSP:

  • 相关阅读:
    非递归实现斐波拉契函数
    二叉树前序、中序遍历得到后序遍历
    python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
    2018春招-今日头条笔试题-第四题(python)
    2018春招-今日头条笔试题-第三题(python)
    2018春招-今日头条笔试题-第二题(python)
    Karatsuba乘法--实现大数相乘
    NodeJS写模块和引入模块的例子
    nodeJS的了解
    Node.js的适用场景
  • 原文地址:https://www.cnblogs.com/wxqblog/p/7677416.html
Copyright © 2020-2023  润新知