夥伴博客:http://www.cnblogs.com/wangyy39/p/8763244.htmlhtml
1、前言java
2、計劃時間——PSPgit
3、接口設計express
4、接口實現編程
5、性能分析數組
6、單元測試app
7、異常處理dom
8、模塊設計ide
9、模塊對接函數
10、她
11、結對編程思考
12、實際時間——PSP
十3、關於柱狀圖的實現
首先我很感謝個人隊友——王玥瑩,謝謝她的努力,放棄本身休息的時間。
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類的程序這種狀況,這也是所謂的「循環依賴」,這種狀況會阻礙信息隱藏。
在本項目設計接口過程當中,使用有意義的命名方式使接口的功能一目瞭然,加強了可讀性;類名和方法名也都使用了有意義的命名方式;在開發過程當中加好了註釋,方便本身和他人看懂代碼;在接口設計過程當中對相關原則也有了一些體會,主要參考如下內容:
https://blog.csdn.net/blueangle17/article/details/55049858
https://jingyan.baidu.com/article/066074d626ea09c3c21cb0b9.html
咱們用到了按鈕監聽器和複選框監聽器以及文件監聽器,對於時間計算方面咱們選擇的是比較簡單可是簡陋的計時器。
講真,這個項目對於咱們來講,能完成已是不遺餘力,在優化性能時儘管有些抵觸,但也算盡力,儘可能減小內存佔用率,減小嵌套循環和數組過大帶來的資源浪費。在生成計算式時,不符合要求的計算式須要捨棄,在數值較大時,十分容易形成資源的浪費,所以咱們在數值較大時,儘可能限制了乘法時數的大小,儘可能避免連續屢次棄用。
設計思路:
在main方法中實現了對輸入參數的解析和對輸入參數異常的報錯,因此測試這個部分的函數最主要的就是構造不一樣的異常狀況,同時也不要忘記測試參數正確時的狀況,由於這也是代碼的一部分(單元測試中第一次就是所以覆蓋率較低)。
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("取消生成,請檢查數值\n"); }
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);
一、參數傳遞功能
String n = JOptionPane.showInputDialog( frame, "輸入題目的數量(1-1000):" ); String m = JOptionPane.showInputDialog( frame, "輸入數值範圍(1-10000):" ); String z = JOptionPane.showInputDialog( frame, "輸入符號數量(1-10):" );
二、選擇計算方式功能
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; }
三、作題功能
public void actionPerformed(ActionEvent e) { if(!doFlag){ JOptionPane.showMessageDialog(frame,"請點擊開始答題按鈕,進行測試!","消息標題",JOptionPane.WARNING_MESSAGE); } else{ textArea.append("上一題\n"); textArea.append("算式:"+strPro.StrSplitBefore(arithExpress.get(index))+"="+textField.getText()+"\n"); if(!textField.getText().equals("")||textField.getText()!=null){ ansHash.put(index, strPro.StrSplitAfter(arithExpress.get(index))); resHash.put(index, textField.getText()); }
四、統計分析功能
使用了繪製柱狀圖工具類,從一篇博客中學習找到的靈感 連接: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、分工明確,能夠提升作事效率
3、加強兩我的的關係,加強合做能力、加強代碼理解能力。
4、在出現錯誤時,夥伴能夠及時發現而且指出,少走彎路
結對編程有壞處:
1、須要大量的交流,若是交流溝通不到位,項目將步履維艱。
2、可能會出現思路的分歧,致使兩人代碼出現分歧,難以結合。
3、兩人分工的不均勻,有可能出現技術強帶技術弱作項目的狀況。
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的使用)