一、代碼倉庫Coding.Net項目位址:https://git.coding.net/yanglq/Twork3.git
二、PSP展示:
PSP | 任務内容 | 計劃共完成需要的時間(h) | 實際完成需要的時間(h) |
Planning | 計劃 | 5 | 10 |
Estimate | 估計這個任務需要多少時間,并規劃大緻工作步驟 | 2 | 1.5 |
Development | 開發 | 65 | 104 |
Analysis | 需求分析(包括學習新技術) | 15 | |
Design Spec | 生成設計文檔 | 0.5 | |
Design Review | 設計複審(和同僚稽核設計文檔) | 6 | |
Coding Standard | 代碼規範(為目前的開發制定合适的規範) | ||
Design | 具體設計 | 9 | |
Coding | 具體編碼 | 24 | 50 |
Code Review | 代碼複審 | 8 | |
Test | 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 | 3 | 4 |
Test Report | 測試報告 | 1 | |
Size Measurement | 計算工作量 | ||
Postmortem&Process Improvement Plan | 事後總結,并提出過程改進計劃 |
三、關于接口設計
(1)Interface Design
接口(Interface)是一種與類相識的結構,隻包含常量和抽象方法,它的目的是指明多個對象的共同行為。由于我們的程式用到的是Java,故Java接口的定義為:
修飾符 interface 接口名{
/** 聲明常量 **/
/** 方法簽名 **/
}
Java接口的實作:
修飾符 class 類名 [extends 父類名] [implement 接口清單]{
}
類和接口之間的關系成為接口繼承(interface inheritance),接口繼承和類繼承本質上是相同的,簡稱為繼承。在類繼承中隻能被單重繼承,而實作接口時,一次可實作多個接口,每個接口之間用逗号隔開。implements關鍵字是一個類實作一個接口所用的關鍵字,它是用來實作接口中定義的抽象方法,實作一個接口,必須實作接口中的所有方法
Comparable接口定義:package java.lang;
pablic interface Comparable{
public int comparaTo(Object o);
comparaTo方法判斷這個對象相對于給定對象o的順序,并且當這個對象小于、等于或大于給定對象時,分别傳回負整數、0和正整數。
ActionListener(事件監聽器)接口包含處理事件的actionPerformed方法,監聽器必須覆寫該方法來響應事件。
一個對象要成為源對象上動作時間的監聽器,需滿足兩個條件:①這個對象必須是ActionListener接口的一個執行個體,該接口定義了所有動作監聽器共有的動作;②ActionListener對象listener必須使用方法source.addActionListener(listener)注冊給源對象
Cloneable接口定義:package java.lang;
public interface Coneable{
}
這個接口是空的,一個帶空體的接口稱為标記接口(market interface),一個标記接口既不包括常量也不包括方法,它用來表示一個類擁有某些特定的屬性。實作Cloneable接口的類标記為可克隆的,而且它的對象可以使用Object類定義的clone()方法克隆
參考自:《Java語言程式設計·基礎篇》Y.Daniel Liang(阿姆斯特朗蘭大州立大學)著、李娜(西安電子科技大學)譯
(2)Information Hiding
資訊隐藏是指在設計和确定子產品時,使得一個子產品内包含的特定資訊(過程或資料),對于不需要這些資訊的其他子產品來說,是不可通路的。
假設A打算秘密傳遞一些資訊給B,A需要從一個随機消息源中随機選取一個無關緊要的消息C,當這個消息公開傳遞時,不會引起人們的懷疑,稱這個消息為載體對象(Cover Message)C;把秘密資訊(Secret Message)M隐藏到載體對象C中,此時,載體對象就變成了僞裝對象C1.載體對象C是正常的,不會引起人們的懷疑,僞裝對象C1與載體對象C無論從感官(比如感受圖像、視訊的視覺和感受聲音、音頻的聽覺)上,還是從計算機的分析上,都不可能把他們區分開來,而且對僞裝對象C1的正常處理,不應破壞隐藏的秘密資訊。這樣就實作了資訊的隐藏傳輸。秘密資訊的嵌入過程可能需要密鑰,也可能不需要密鑰,為了差別于加密的密鑰,資訊隐藏的密鑰稱為僞裝密鑰k。資訊隐藏涉及兩個算法:資訊嵌入算法和資訊提取算法,如下圖:
參考自:百度百科
(3)Loose Coupling
子產品設計追求強内聚、弱耦合。内聚(Cohesion)是一個子產品内部各成分之間相關聯程度的度量,耦合(Coupling)是子產品之間依賴程度的度量,内聚和耦合是密切相關的
内聚類型有:偶然内聚、邏輯内聚、時間内聚、過程内聚、通信内聚、順序内聚、功能内聚(内聚強度由低到高)
耦合的強度依賴于以下幾個因素:一個子產品對另一個子產品的調用;一個子產品向另一個子產品傳遞的資料量;一個子產品施加到另一個子產品的控制的多少;子產品之間的接口程度
耦合類型有:内容耦合、公共耦合、控制耦合、标記耦合、資料耦合、非直接耦合(耦合強度由強到弱)
弱耦合一般使用資料耦合。子產品間通過參數傳遞基本類型的資料,稱為資料耦合。
參考自部落格:http://www.cnblogs.com/jarod99/
四、計算子產品接口的設計與實作過程
①程式界面設計
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>四則運算練習小程式</title>
<style type="text/css">
body{
text-align:center;
background-image:url(1.jpg);
background-size:cover;
background-attachment:fixed;
background-position:center;
background-repeat:no-repeat;
}
.p1{
font:italic;
font-size:25px;
font-family:Microsoft Yahei;
margin-top:60px;
}
.submit{
font-size:18px;
margin-top:60px;
}
</style>
</head>
<body>
<h1 style="text-align:center">歡迎來到四則運算練習小程式!</h1>
<p class="p1">在這裡,你将鞏固練習四則運算</p>
<form method="get" action="Select.html" class="option">
<button class="submit" title="準備好了,請點選!" >你準備好了嗎?</button>
</form>
</body>
</html>
②題目定制界面設計
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>題目定制</title>
<style type="text/css">
body{
background-image:url(1.jpg);
background-size:cover;
background-attachment:fixed;
background-position:center;
background-repeat:no-repeat;
}
</style>
</head>
<body>
<h1 style="text-align:center;">題目定制</h1>
<form method="get" action="Exercise.html" >
<ol>
<li>
請設定題目數量:
<input type="text" name="number0" />
</li>
<br/>
<li>
請設定運算式中最小數值:
<input type="text" name="number1" />
最大數值:
<input type="text" name="number2" />
</li>
<br/>
<li>
請設定最大運算符号數:
1<input type="radio" value="1" name="numberOfOperator" checked="checked" />
2<input type="radio" value="2" name="numberOfOperator" />
3<input type="radio" value="3" name="numberOfOperator" />
4<input type="radio" value="4" name="numberOfOperator" />
5<input type="radio" value="5" name="numberOfOperator" />
</li>
<br/>
<li>
請設定題目中是否有乘除法:
有
<input type="radio" value="Y" name="multiplyAndDivide" />
沒有
<input type="radio" value="N" name="multiplyAndDivide" checked="checked" />
</li>
<br/>
<li>
請設定四則運算式中是否有括号:
有
<input type="radio" value="Y" name="bracket" />
沒有
<input type="radio" value="N" name="bracket" checked="checked" />
</li>
</ol>
<input type="submit" title="填寫好了,進行送出" value="送出" />
</form>
</body>
</html>
③練習四則運算界面設計
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>開始四則運算練習</title>
<style type="text/css">
body{
text-align:center;
background-image:url(1.jpg);
background-size:cover;
background-attachment:fixed;
background-position:center;
background-repeat:no-repeat;
}
</style>
</head>
<body>
<h1>開始你的四則運算練習</h1>
<iframe src="Exercise00.txt" width="85%" height="500" scrolling="auto">四則運算練習</iframe>
<form method="get" action="Select.html" >
<input type="submit" title="題目定制錯誤,傳回上一步" value="傳回上一步" />
</form>
<form method="get" action="Answer.html" >
<input type="submit" title="我做完了,我要驗證答案!" value="送出" />
</form>
</body>
</html>
④驗證答案界面設計
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>驗證運算答案</title>
<style type="text/css">
body{
text-align:center;
background-image:url(1.jpg);
background-size:cover;
background-attachment:fixed;
background-position:center;
background-repeat:no-repeat;
}
.submit{
font-size:18px;
margin-top:30px;
}
</style>
</head>
<body>
<h1>驗證你的運算答案</h1>
<iframe src="Exercise00.txt" width="85%" height="500" scrolling="auto">四則運算練習</iframe>
<form method="get" action="Select.html" class="option">
<button class="submit" title="扶我起來,我還能再戰!" >傳回題目定制</button>
</form>
</body>
</html>
五、計算子產品部分單元測試展示
@Test
public void testDecide(){//測試控制整除的遞歸
int m=User.decide(10, 3);
assertThat(m, is(5));
int n=User.decide(10, 1);
assertThat(10%n, is(0));
}
@Test
public void testIsOpe(){
assertThat(User.isOperator("5"), is(false));
assertThat(User.isOperator("+"), is(true));
assertThat(User.isOperator("-"), is(true));
assertThat(User.isOperator("*"), is(true));
assertThat(User.isOperator("÷"), is(true));
assertThat(User.isOperator("("), is(true));
assertThat(User.isOperator(")"), is(true));
}
@org.junit.Test
public void testCore(){//測試産生随機式、中綴轉字尾和計算字尾表達式
LinkedList<String> list=makeQuestion.expression(5, 0, 1, 2, 99);
LinkedList<String> list1=makeQuestion.expression(10, 1, 0, 2, 99);
Iterator<String> it=list.iterator();
StringBuilder sd=new StringBuilder();
while (it.hasNext()) {
sd.append(it.next()).append(" ");
}
String[] ss=sd.toString().split(" ");
Iterator<String> it1=list1.iterator();
StringBuilder sd1=new StringBuilder();
while (it1.hasNext()) {
sd1.append(it1.next()).append(" ");
}
String[] ss1=sd1.toString().split(" ");
makeQuestion.toSuffix("test.txt");
makeQuestion.dealEquation("test.txt");
makeQuestion.toSuffix("test.txt");
makeQuestion.dealEquation("test.txt");
}
@org .junit.Testpublic void testIsOpe(){
assertThat(makeQuestion.isOperator( "5" ), org.hamcrest.CoreMatchers.is( false ));
assertThat(makeQuestion.isOperator( "+" ), org.hamcrest.CoreMatchers.is( true ));
assertThat(makeQuestion.isOperator( "-" ), org.hamcrest.CoreMatchers.is( true ));
assertThat(makeQuestion.isOperator( "*" ), org.hamcrest.CoreMatchers.is( true ));
assertThat(makeQuestion.isOperator( "÷" ), org.hamcrest.CoreMatchers.is( true ));
assertThat(makeQuestion.isOperator( "(" ), org.hamcrest.CoreMatchers.is( true ));
assertThat(makeQuestion.isOperator( ")" ), org.hamcrest.CoreMatchers.is( true ));
}
六、異常處理說明
①User類異常處理:
②News類異常處理:
七、界面子產品的設計過程
八、界面子產品與計算子產品的對接
①進入四則運算練習小程式:
②進行題目定制,設定題目的數量、運算式中最小數值及最大數值、最大運算符号數、是否有乘除法及括号等,如下圖:
③在完成題目定制後,點選送出進入四則運算練習界面,在這裡程式将給出定制數量的題目,提供使用者練習;當使用者定制題目意向出錯時,可以點選傳回上一步,重新進行題目定制,如下圖:
④在完成四則運算練習後點選送出可來到驗證頁面,使用者可以驗證練習的正确與否,如下圖:
九、結對的那些小事
在剛開始結對完成作業的時候,我們兩個還比較迷茫,對于結對應該怎麼做?怎樣合作?都存在着些許疑問,但在閱讀《建構之法》第四章之後便豁然開朗。首先我們對作業進行讨論并進行任務的配置設定,估計我們将在程式的各個子產品的開發上耗費的時間并制作PSP表格;在完成作業的過程中,我們兩個一起讨論、一起設計、一起編碼、一起單元測試、一起編寫文檔等,具有非常強額解決問題的能力也提高了代碼效率和品質。這是一個非常棒的體驗!以下圖檔見證我們的pair:
十、關于結對程式設計
優點:
①可以每時每刻都處在代碼複審的狀态
②一對程式員可以平等地、互補地進行開發工作
③在開發層次,結對程式設計能提供更好的設計品質和代碼品質,兩人合作能有更強的解決問題的能力
④對開發人員自身來說,結對工作能帶來更多的信心,高品質的産出能帶啦更高的滿足感
⑤結對程式設計能互相督促,在心理上,能夠更好地監督自身和更好地提高自身的技術能力
⑥在企業管理層次上,結對能更有效地交流,互相學習和傳遞經驗,能更好地處理人員流動
⑦結對程式設計能得到更高的投入産出比(Return of Investment)
⑧結對程式設計在一定程度上避免了個人英雄主義,能夠幫助建立集體擁有代碼的意識
缺點:
①在高速度中完成任務,任務有較高的技術要求,任務失敗的代價很高
②開發人員需要時間來适應這種新的開發模式,剛開始的結對程式設計效率可能不見得比單獨開發效率高
③結對程式設計要求兩個人協調一緻,每個人的作息時間需要同步。當有一人出現情況另一人不得不等待
④結對程式設計不能像單獨開發一樣自主和自由
⑤結對程式設計中兩個人的職責是相同的,可以減小每一個人的壓力,但又容易造成缺乏責任感
結對中的你我:
YLQ:在這次結對作業中她連續幾天熬夜查閱各種資料、學習知識來攻克這次的作業,非常地認真盡職,但因為遇到一些難題而變得比較焦躁,寫代碼時bug較多。總的來說她是個非常棒的結對partner。
ZST:這次結對作業過程中她能比較耐心地盡力完成每一部分,但同時也遇到非常多不懂的知識面,通過查閱各種資料并學習攻克。雖然她掌握的技能和知識較為匮乏,但能努力學習并補足,也是個值得結對的pair。