结对项目
项目代码地址:https://git.coding.net/bigben123/7897.git
暂时我们只实现了出题功能。
这是在开始开发前,预计消耗的时间
PSP |
任务内容 |
计划完成需要的时间(min) |
Planning |
计划 |
10 |
Estimate |
明确需求和其他相关因素 |
5 |
Development |
开发 |
10 |
Design spec |
生成设计文档 |
10 |
Design review |
设计复审 |
11 |
Coding standard |
代码规范 |
10 |
Design |
具体设计 |
20 |
Coding |
具体编码 |
300 |
Code review |
代码复审 |
20 |
Test |
测试 |
10 |
Record time spent |
记录用时 |
10 |
Test report |
测试报告 |
50 |
Size measurement |
计算工作量 |
1 |
Postmortem |
事后总结 |
30
|
接口设计
Information Hiding:信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。信息隐藏是结构化设计与面向对象设计的基础。在结构化中函数的概念和面向对象的封装思想都来源于信息隐藏。软件业对这个原则的认同也是最近十年的事情。
Interface Design:接口设计,即对接口的逻辑等属性进行设计,来增强代码的可读性。
Loose Coupling:松耦合系统通常是基于消息的系统,此时客户端和服务端并不知道对方是如何实现的。就是我们在写程序前将其功能模块化。
四、计算模块接口的实现与实现过程。
import java.io.IOException; public class Command { public static void main(String[] args) { int sum = 0, sumZF = 1, min = 1, max = 100; boolean cc = false; try { for(int i=0; i<args.length; i++) { if(args[i].equals("-n") ) { sum = Integer.parseInt(args[++i]); } else if(args[i].equals("-m")) { min = Integer.parseInt(args[++i]); max = Integer.parseInt(args[++i]); if(min>max) { System.out.println("设置的最小值 :" + min + "大于设置的最大值" + max); return; } } else if(args[i].equals("-o")) { sumZF = Integer.parseInt(args[++i]); } else if(args[i].equals("-c")) { cc = true; } else { System.out.println(args[i] + "不是一个有效的命令,请输入有效的命令(-n, -m, -o, -c)"); return; } } } catch (Exception e) { System.out.println("请输入有效的命令及其对应的参数"); } Lib.setSumZF(sumZF); Lib.setNum(min, max); Lib.setcc(cc); String[] list = new String[sum+3]; for(int i=0; i<sum; i++){ list[i] = Lib.makeAndCalQuestion(); } try{ Lib.print(list, sum); } catch(IOException ioe) { ioe.printStackTrace(); } } }
五、单元测试
我们用单元测试测试了lib类。
import java.io.IOException; import org.junit.Test; public class LibTest { Lib lib = new Lib(); @Test public void testLib() { } @Test public void testSetSumZF() { Lib.setSumZF(5); Lib.setSumZF(-1); } @Test public void testSetcc() { Lib.setcc(false); Lib.setcc(true); } @Test public void testSetNum() { Lib.setNum(1, 5); Lib.setNum(2, 100); } @Test public void testMakeAndCalQuestion() { Lib.setcc(true); Lib.setNum(1, 20); Lib.setSumZF(5); Lib.makeAndCalQuestion(); Lib.setcc(false); Lib.setNum(5, 100); Lib.setSumZF(4); Lib.makeAndCalQuestion(); } @Test public void testPrint() { String[] list = new String[10]; for(int i=0; i< 5; i++) list[i] = Lib.makeAndCalQuestion(); try{ Lib.print(list, 5); } catch(IOException ioe) { ioe.printStackTrace(); } } }
得到的代码覆盖率如下图
五、页面设计模块
我们采用了GUI设计页面
import javax.swing.*; import java.awt.*; public class GUI extends JFrame{ /** * */ private static final long serialVersionUID = 1L; public GUI() { Color color = new Color(200,200,200); Font font = new Font("SansSerif",Font.BOLD,18); Font font2 = new Font("SansSerif",Font.CENTER_BASELINE,26); JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(5,3)); JLabel NOQ= new JLabel("需要的题目数量(1~10000):"); NOQ.setFont(font); p1.add(NOQ); p1.add(new JTextField(4)); p1.add(new JLabel(" ")); JLabel RON = new JLabel("题目的数值范围(下界1~100,上界50~1000):"); RON.setFont(font); p1.add(RON); p1.add(new JTextField(2)); p1.add(new JTextField(2)); JLabel NOO = new JLabel("题目中最多存在运算符数量:"); NOO.setFont(font); p1.add(NOO); p1.add(new JTextField(2)); p1.add(new JLabel(" ")); JLabel isMul = new JLabel("题目中是否有乘除法(默认为无):"); isMul.setFont(font); p1.add(isMul); JRadioButton b2 = new JRadioButton(); p1.add(b2); b2.setBackground(new Color (200,200,200)); p1.add(new JLabel(" ")); JLabel isBracket = new JLabel("题目中是否有括号(默认为无):"); isBracket.setFont(font); p1.add(isBracket); JRadioButton b1 = new JRadioButton(); b1.setBackground(new Color(200,200,200)); p1.add(b1); p1.add(new JLabel(" ")); p1.setFont(font); JPanel p2 = new JPanel(); JButton Cre = new JButton("开始生成!"); Cre.setFont(font); Cre.setBackground(color); p2.add(Cre,BorderLayout.WEST); JButton exit = new JButton("退出系统"); p2.add(exit,BorderLayout.EAST); exit.setFont(font); exit.setBackground(new Color(200,200,200)); p2.add(exit,BorderLayout.EAST); add(p1,BorderLayout.CENTER); JLabel title = new JLabel("欢迎来到四则运算题目生成系统!"); title.setFont(font2); JPanel p3 = new JPanel(); p3.add(title,BorderLayout.CENTER); add(p3,BorderLayout.NORTH); add(p2,BorderLayout.SOUTH); setBackground(Color.cyan); p1.setBackground(new Color(200,200,200)); p2.setBackground(new Color (200,200,200)); p3.setBackground(new Color (100,100,100)); } public static void main(String[] args) { GUI frame = new GUI(); frame.setTitle("四则运算题目生成系统"); frame.setSize(1250, 500); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
七、结队编程感想
对于我们这种基础较弱的同学,结对编程也给了我们讨论与一起进步的空间,虽然做得不好,但是还是非常有收获,我相信在一次次的不好当中,我们会变强,总有一天,我们可以做得好。
缺点方面的话,可能就是我们都不强,做得很痛苦。