天天看點

四則運算項目報告

一、代碼倉庫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。