結對項目-四則運算出題程序(GUI版)
目錄:
一.致搭檔(含項目地址)
二.PSP(planning)
三.結對編程中對接口的設計
四.計算模塊接口的設計與實現過程
五.計算模塊接口部分的性能改進
六.計算模塊部分單元測試展示
七.計算模塊部分異常處理說明
八.界面模塊的詳細設計過程
九.界面模塊與計算模塊的對接
十.結對過程的描述
十一.結對編程的優缺點
十二.PSP(actual)
一、致搭檔:
隊友:李庭娟(我很喜歡把這位隊友叫娟子,感覺很親切)
首先非常非常感謝這位結對搭檔——娟子,從最初組隊到如今合作,始終非常信任我,鼓勵我。性格灑脫,熱情親切。跟她合作過程中,真的沒有一絲分歧。這些天和我一起討論,分工,合作這個作業。都說“男女搭配,幹活不累”,我是真的體會到了。完成項目的整個過程中,她始終積極主動的分擔任務。我倒是很慚愧,由於個人能力的原因,不能承擔著一個男生應該承擔的任務。臨近截止日期,我還催著她和我一起熬夜趕項目,非常非常不好意思。在此,衷心地向我的搭檔說句感謝,很開心能有一次結對項目的作業,非常開心能有一次這樣的機會去深入認識了解身邊的同學,最最開心的是兩個人在這個過程中的彼此信任與支持。不管結果怎麽樣,這是一次不同尋常的學習經歷,不僅限於知識的學習和項目的制作,還有的是同伴的合作。
我的Coding.net源碼倉庫地址:https://git.coding.net/Vsmile1997/homework.git
搭檔博客地址:http://www.cnblogs.com/tingjuanli/p/8746012.html
二、PSP(planning)
PSP |
任務內容 |
計劃時間(min) |
Planning |
計劃 |
30 |
Estimate |
估計這個任務需要多少時間,並規劃大致工作步驟 |
10 |
Development |
開發 |
780 |
Analysis |
需求分析 |
23 |
Design Spec |
生成文檔 |
0 |
Design Review |
設計復審 |
0 |
Coding Standard |
代碼規範 |
7 |
Design |
具體設計 |
40 |
Coding |
具體編碼 |
210 |
Code Review |
代碼復審 |
30 |
Test |
測試 |
30 |
Reporting |
報告 |
160 |
Test Report |
測試報告 |
180 |
Size Measurement |
計算工作量 |
40 |
Postmortem & Process Improvement Plan |
事後總結, 並提出過程改進計劃 |
60 |
三、
1、Information Hiding
信息隱藏是結構化設計於面向對象設計的基礎。在結構化中函數的概念和面向對象的封裝思想都來源於信息隱藏。信息隱藏原則的主要應用有:
(1)多層設計中的層與層之間加入接口層;
(2)所有類與類之間都通過接口類訪問;
(3)類的所有數據成員都是private,所有訪問都是通過訪問函數實現的。
我們的做法:信息隱藏的目的主要是隱藏復雜度,它所具有的封裝思想就是體現了這個目的。我們把程序分解為各個模塊(主模塊,生成算式模塊,計算模塊等),隱藏每個模塊具體算法的實現原理,而只需要知道每個模塊的功能,按需調用即可。
接口設計,我理解的接口就是契約,一種職責。在我們的項目中使用接口指明了多個類需要實現的方法,不需要知道對象對應的類,就可以知道對象之間的交互界面,提高了編程效率。
松耦合就是降低系統部件和部件之間的耦合性,也就是降低部件的依賴性,使得部件之間相互獨立,這樣對於日後的系統維護以及擴展都是有好處的。因此,耦合程度,模塊與模塊之間的聯系性就更高,系統的靈活性就越低,報錯率就更高。我們的理解就是,松耦合歸根結底就是一種“模塊化”編程思想,將項目盡可能多的分為相互獨立的幾個模塊,便於調用和實現優化。我們在項目中也力求實現模塊化處理,做到松耦合。
四、
五、計算模塊接口部分的性能改進
1.性能分析改進
在整體編程結束後,進行性能分析與改進是非常有必要的。因為在小規模的數據下或者是一般情況下,功能的實現是不太會涉及到優化算法的。但是,個別特例或者是大規模的數據往往會導致程序報錯,這就要求我們需要對程序進行性能的優化改進。比如,我們在生成算式過程中,由於上下限和算式個數選擇上偏於極端情況,算式的結果“遲遲”無法生成,CPU占有率極大。因此我們在算法中做了異常處理,並且規範輸入,這樣一來,軟件的使用性能上就得到了優化改進。
2.性能分析截圖
項目總體分析圖,從內存,多線程,CPU等方面分析了計算模塊的性能,截圖如下:
性能分析過程截圖:
六、計算模塊部分單元測試展示
測試Command.java類(下圖的單元測試中的Main即代碼中的Command,截圖時未更名):
package test; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class CommandTest { private static Command con = new Command(); @Before public void setUp() throws Exception { } @Test public void testSimple() { con.Simple(2,50,3);//產生2個50以內最多3個運算符的算式 } @Test public void testOnlyMD() { con.OnlyMD(1,500,2);//產生1個500以內最多2個運算符的算式 } @Test public void testOnlyBra() { con.OnlyBra(10,50,4,1);//故意輸入參數錯誤,檢驗單元測試報錯 } @Test public void testBothMDBra() { fail("Not yet implemented");//未編寫單元測試函數,單元測試失敗 } }
代碼覆蓋率:
七、
八、
1 JButton b_log=new JButton("登錄"); 2 b_log.addActionListener(new ActionListener() { 3 public void actionPerformed(ActionEvent e) { 4 // TODO Auto-generated method stub 5 //獲取用戶名和密碼,進行校驗 6 String myUsername=tf_name.getText(); 7 String myPassword=password.getText(); 8 if(myUsername.equals("1")&& myPassword.equals("1")){ 9 JOptionPane.showMessageDialog(null, "登陸成功!"); 10 f.dispose(); 11 //new MyExGUI(); 12 new ShowGridLayout(); 13 14 } 15 else{ 16 JOptionPane.showMessageDialog(null, "賬號或密碼錯誤!"); 17 tf_name.setText( ""); 18 password.setText( ""); 19 } 20 21 } 22 });View Code
2.定制面板:
通過輸入合理有效的數值,定制不同需求的題目
對應部分代碼展示:
1 JButton b_enter=new JButton("進入"); 2 b_enter.addActionListener(new ActionListener() { 3 public void actionPerformed(ActionEvent e) { 4 5 String myNum=tf_num.getText(); 6 int n = Integer.parseInt(myNum); 7 8 String myLow=tf_low.getText(); 9 int ml = Integer.parseInt(myLow); 10 11 String myUp=tf_up.getText(); 12 int mu = Integer.parseInt(myUp); 13 14 String myOp=tf_op.getText(); 15 int o = Integer.parseInt(myOp); 16 17 String myMul=tf_mul.getText(); 18 19 String myBak=tf_bak.getText(); 20 21 if((n>0&& n<10001) && (ml>0&& ml<101) && (mu>=50&&mu<1001) && (o>0&&o<11) && 22 ( myMul.equals("0")|| myMul.equals("1") )&& 23 ( myBak.equals("0")|| myBak.equals("1") ) 24 ){ 25 JOptionPane.showMessageDialog(null, "歡迎使用!"); 26 f.dispose(); 27 new MyExGUI(n,ml,mu,o,myMul,myBak); 28 29 } 30 else{ 31 JOptionPane.showMessageDialog(null, "你輸入的數據有錯!"); 32 tf_num.setText( ""); 33 tf_low.setText( ""); 34 tf_up.setText( ""); 35 tf_op.setText( ""); 36 tf_mul.setText( ""); 37 tf_bak.setText( ""); 38 } 39 40 } 41 });View Code
九、
文件的上傳
保存文件:
題目解答:每題5分。給出對應得分並繪制柱形圖
十、
1.一開始本打算做網頁版的,但是前端我們都不大熟悉,所以決定做GUI界面。此次結對編程中,一人負責內部功能的算法實現,一人負責界面,各自負責編寫自己的那部分代碼;對接過程中,我們一起合作,在這一階段也充分感受到了結對編程的高效,也意識到好隊友的挑選對項目的完成有很大的促進促進作用。
2.結對照片展示
十一、
1.結對編程的優缺點
優點:充分鍛煉了兩個人的合作,溝通能力。兩個人之間可以相互學習交流,從而取長補短。後期兩人共同對接模塊時,充分結合了兩人的優點,使對接較為順利的完成。
缺點:需要一段磨合時間,剛開始時效率不高,需要相互熟悉了解代碼風格之後漸入佳境。
2.結對個人優缺點
我的優點: (1)擅長算法,編碼效率高。對項目進度的把握很有規劃
(2)編程思路清晰,能夠盡最大的能力做到最好
(3)既細心又耐心。在結對編程中能很快地處理bug
缺點: (1)缺乏主見,在選擇上搖擺不定
搭檔優點:(1)編程思路清晰,能夠盡自己最大的能力實現自己能做到的最好
(2)耐心,不懼怕問題的出現,出現問題時不驕不躁,能靜下心來處理解決問題
缺點: (1)我認為娟子最大的缺點就是沒有缺點,哈哈哈哈哈!
十二、
PSP |
任務內容 |
計劃時間(min) |
完成時間(min) |
Planning |
計劃 |
30 |
30 |
Estimate |
估計這個任務需要多少時間,並規劃大致工作步驟 |
10 |
10 |
Development |
開發 |
780 |
2700 |
Analysis |
需求分析 |
23 |
40 |
Design Spec |
生成文檔 |
0 |
20 |
Design Review |
設計復審 |
0 |
20 |
Coding Standard |
代碼規範 |
7 |
15 |
Design |
具體設計 |
40 |
60 |
Coding |
具體編碼 |
210 |
1800 |
Code Review |
代碼復審 |
30 |
45 |
Test |
測試 |
30 |
700 |
Reporting |
報告 |
160 |
840 |
Test Report |
測試報告 |
180 |
780 |
Size Measurement |
計算工作量 |
40 |
30 |
Postmortem & Process Improvement Plan |
事後總結, 並提出過程改進計劃 |
60 |
30
|
結對項目-四則運算出題程序(GUI版)