一、程式結構分析:
第一次作業:
思路:
1. 建立單項式類,負責使用正規表達式将一個單項式字元串解析為一個單項式,并将系數和指數存儲起來,同時設有求導方法。
2. 建立多項式類,負責使用正規表達式将一個多項式字元串解析為多個單項式,通過調用單項式類的解析方法将資料以HashMap的形式存儲起來,再調用單項式類的求導方法完成對多項式的求導。
3. 建立主類,負責輸入輸出并通過執行個體化多項式對象并調用其方法完成程式功能。
類圖:
代碼行數:
第二次作業:
1. 建立三種因子類分别存儲幂函數、正弦函數和餘弦函數的指數,并設有通過解析相應字元串設定指數的方法。
2. 建立單項式類,内有幂函數、正弦函數、餘弦函數和常數四個域,可以通過解析單項式字元串來設定這四個域,同時重寫了toString方法。此外該類還設有相加方法,以對能合并的單項式進行合并。
3. 建立多項式類,在第一次作業的基礎上重寫了toString方法,其核心部分是循環調用單項式類的toString方法。
4. 建立化簡類,将多項式中的各個單項式嘗試提取公因式後,對形如sin2+cos2、1-sin2、1-cos2的形式進行化簡合并。
5. 建立求導類,将多項式中的各個單項式進行求導後相加,進而建立求導後的新的多項式,再調用其toString方法完成求導。
6. 建立主類,與第一次作業類似。
第三次作業:
1. 建立因子接口,内置求導方法和toString方法,再建立四種因子類實作因子接口。
2. 建立運算規則接口,内置求導方法和toString方法,再建立加減、乘法、複合三種運算規則類實作運算規則接口,同時也讓四種因子類實作運算規則接口(這樣在建構表達式樹時更友善)。
3. 建立字元串解析類,内置樹建立方法,将多項式分解為若幹單項式,對單項式的第一個因子建立一個節點,再對剩餘部分進行遞歸調用,完成對樹的建構。
4. 建立主類,與上兩次作業類似。
二、Bug分析
自我程式尋找bug:
本菜雞在三次作業中始終使用人工構造測試資料的方法(第一次研讨課有大佬分享自己建構評測機的方法,奈何自己太菜始終get不到要點,自己百度也毫無頭緒),通過周遊讨論區以及廣大水群來尋找易錯點,并建構對應測試資料。
然而人工建構測試資料的方法還是有一定的局限性,如果程式有良好的設計的話還好,但當程式結構的複雜度、耦合度較大時效果就十分有限了。
第一次作業和第二次作業由于設計時各個子產品的耦合性較低,互測和強測均沒有出現bug;但進入第三次作業之後,無論強測還是互測都爆炸了,因為在一個類中将一整個表達式字元串建構為表達式樹,解析過程太過複雜;同時輸入的預處理部分和字元串解析部分都含有對WF的判斷,耦合度較高。
尋找他人bug:
在互測過程中使用自己在debug過程中構造的典型測試資料,以及另外自己随機建構的一些一般樣例對他人的代碼進行測試。
(事實證明這種方法完全随緣,要成為一個合格的殺手,還是要學習建構自動評測機。)
三、感想
結構設計:
第三次作業慘痛的教訓證明動手之前良好的構思真的很重要(當年學計組的時候也深有同感,但第三次作業由于時間原因沒有貫徹落實實屬慚愧),例如通過工廠模式對輸入的字元串建立相應的對象,能很好的降低子產品間的耦合度。在開始動手碼代碼前,即使花一天的時間構思也不為過,因為這一天的構思能讓之後實作各個子產品功能時有着事半功倍的效果。
單元收獲:
經過了一個單元的學習,我從一個java小白變成了能了解容器、正規表達式、設計模式的基本使用的菜雞,總體來說收獲挺多。更重要的是能盡量從面向對象的角度設計程式,雖然有時候對有些抽象功能還是無能為力,但已經能體會到面向對象程式設計的複雜度低,子產品化,可重複利用等特點。在今後的課程中我一定向着了解面向對象思想的方向努力,讓自己的代碼結構層次更加清晰易懂,能将所學知識真正轉化為自己的能力來運用,提高自己的競争力。