目錄 homework & class & trainning : 兩次上機、三次作業、四周課堂 code analysis & review : 為什麼我沒有bug 黑盒測試和白盒測試 OO 設計感言 Scanning: Creational Pattern & Multithreading 一、 ...
目錄
- homework & class & trainning : 兩次上機、三次作業、四周課堂
- code analysis & review : 為什麼我沒有bug
- 黑盒測試和白盒測試
- OO 設計感言
- Scanning: Creational Pattern & Multithreading
一、作業、課堂、上機總結若幹
1. 關於Debug
我對我三次房間的同學的bug都做了詳細的文檔記錄,這裡簡單的貼一下,很熱衷於和同學們分享。
第一次
1 1. 多人刪除了首尾的特殊字元 2 2. 多人沒有判斷指數後面 3 3. 一人沒有考慮正則表達式爆棧 4 4. 一人沒有考慮對常數求導
第二次
[x] 1.in for rider TLE ,考慮嵌套,導致超市 [x] 2.in for saber 0 , 沒有考慮輸出0 [x] 3.in for archer WF ,沒有考慮格式錯誤 [?] 4.in for altergo saber assassin berserker rider UNKNOWN maybe because of sympy, sympy對拍精度問題,使用Wolfram Alpha複查 [?] 5.in for archer lancer UNKNOWN maybe because of sympy sympy對拍精度問題,使用Wolfram Alpha複查 [?] 6.in for rider WA UNKNOWN 「fail to debug」 ,沒有考慮化簡錯誤 [x] 7.in for archer WF ^ + ,沒有考慮`^ +`類型的錯誤格式 [x] 8.in for altergo WA , 化簡出現錯誤 x 表示 是錯誤數據 ? 表示 是可疑數據
第三次
整體錯誤較少,僅一人出現判錯格式。
大佬分享課的收穫
1. shh : 優秀的自動機分析
2. cyx :優秀的設計模式思考者
3. dyj :高階對拍器設計者
4. hdl :優秀的面向對象和工業級設計師
感謝各位同學,我受益匪淺,在分享知識後,我們收穫的更多:如何設計測試、如何做良好測試、如何運用設計模式、如何學習面向對象、如何挑戰自己的高度。
二、code review & analysis
三次作業以來,我的作業在強測、互測階段沒有發現任何正確性錯誤、在弱測環節因為正確性產生的commit也非常少。我來總結一下我三次作業的流程、思路、設計、代碼實現。先是三張我的設計圖。
第一次作業:
第二次作業
第三次作業
從三次的設計圖來看,Unit 1對我的提升非常大,可以看到我的設計越來越有整體層次感、對象和介面的封裝、多態的函數返回模式、具有自我管理能力的類、Unit 1的設計最後充分體現了我的設計思想逐漸豐富。組合思維的應用讓我的程式越來越有設計感,越來越具有可擴展性和良性。
為什麼我沒有bug:其實是由於我的開發流程在逐步細化:
我的第一次開發流程:
1. 做一個簡要的計劃
2. 設計對象、畫圖
3. 寫簡單的測試用例和測試代碼
4. 寫代碼
5. 小黃鴨調試
6. 運行測試
我的第二次開發流程:
1. 學習遞歸下降法
2. 第一次代碼重新閱讀
3. 重構類型清單
4. 一個新的設計計劃
5. 設計新對象、做思維導圖
6. 寫部分代碼
7. 重構部分代碼,消除硬綁定、做軟綁定。
8. 測試代碼和測試類
9. 測試數據編寫
10. 小黃鴨調試
11. 黑盒運行調試
12. 簡單白盒測試
我的第三次開發流程
1. 學習裝飾者模式、介面設計
2. 第二次代碼重構模塊綁定
3. 重構部分清單
4. 表達式樹建立
5. 文法和對象模式的逐一對應
6. 寫代碼「僅40分鐘」
7. 做頭腦風暴,考察多種測試數據和思路,並完成代碼
8. 檢查是否存在硬綁定、消除硬綁定、為可行的優化做準備
9. 擴展、將優化和求導均作為裝飾者執行。
10. 寫代碼
11. 測試類和測試代碼運行
12. 測試數據構造和覆蓋性測試
13. 小黃鴨測試
14. 黑盒運行測試
15. 覆蓋式白盒測試
16. 優化及優化測試
17. 性能分析和性能測試
18. 代碼回顧和思考
可以看到,在三次作業中,我沒有bug完全是因為通過學習、通過和優秀的各位同學在討論區交流、不斷提升自我、提高自己的代碼魯棒性、和建立具有糾錯能力的開發模式。我沒有bug不完全是運氣、但也有不少運氣成分、還有很多同學比我做得更好、向他們學習。在三次作業後,我逐漸看清了表達式問題的本質:即,用組合的思維去描述表達式樹的形態、用裝飾者的行為去描述求導和化簡這些可以變化的方法。是設計提升了我的代碼質量。可以發現,我的優化也是完全面向對象的松耦合實現!
此外,在講講我三次作業的進步
我的第一次作業,代碼其實有較高的耦合度。
OCavg | WMC | |
Poly | 3.8333333333333335 | 23.0 |
Main | 5.666666666666667 | 17.0 |
Total | 40.0 | |
Average | 4.444444444444445 | 20.0 |
我的第二次作業,代碼的耦合度就直線降低了。
OCavg | WMC | |
Deg | 1.5714285714285714 | 11.0 |
Expr | 2.7142857142857144 | 19.0 |
Main | 1.0 | 1.0 |
Myinput | 2.2222222222222223 | 40.0 |
Myoutput | 3.0 | 6.0 |
Term | 2.1818181818181817 | 24.0 |
Total | 101.0 | |
Average | 2.1956521739130435 | 16.833333333333332 |
我的第三次作業,在擴展之後,依然有較好的擴展性和松耦合。且後兩次的耦合主要在Input Handler即遞歸下降的部分,這部分HansBug學長已經給出了有效的OO風格的指導。
OCavg | WMC | |
Val | 1.0 | 9.0 |
Sin | 2.75 | 11.0 |
Pow | 1.6666666666666667 | 10.0 |
Plus | 2.272727272727273 | 25.0 |
Myoutput | 1.0 | 1.0 |
Myinput | 2.526315789473684 | 48.0 |
Mul | 2.4545454545454546 | 27.0 |
Main | 1.0 | 1.0 |
Cos | 2.75 | 11.0 |
Total | 143.0 | |
Average | 2.1666666666666665 | 15.88888888888889 |
三、黑盒測試和白盒測試
在黑盒測試部分,感謝:牛雅哲、張少昂兩位助教的建議和鼓勵、感謝林佬@login256,丁總,HugeGun,Nemo陳宇軒,對我的技術支持和指導。
在白盒測試部分,感謝:榮文戈老師的優質教學、感謝OO課程組老師的優質ppt、感謝何岱嵐教導實現junit做測試。
黑盒測試:
我的測試環境是: ubuntu 18.04 (Intel Core i7 8Gen) ,java 10 , g++ 7.3.0 , Python 3.6.7,GNU bash 4.4.19,我的測試方法在不同平臺和環境下有一定的調整、同學們可以自行調整、大部分內容是跨平臺的。
我的測試構造技巧同樣可以參考我已經寫好的博文,
白盒測試:
大量的同學在debug環節是黑盒測試的,即比較其他同學輸出和標準輸出的正確性,而這樣是勞心勞力、費時費資源的一種朴素測試思路,所以需要白盒測試,來彌補難以覆蓋的測試環節和情形。我通過單元測試、全路徑覆蓋的形式保證了:
1. 保證模塊中所有獨立路徑至少被執行一次
2. 對所有邏輯值都會測試TRUE和FALSE
3. 在上下邊界及可操作範圍內運行所有迴圈情況
4. 檢查內部數據結構以確保其有效性
四、OO設計感言
OO設計是充滿驚險充滿挑戰的過程。面向對象的設計思想是從自然界中來的,因為在自然界中,類(Class)和實例(Instance)的概念是很自然的。Class是一種抽象概念,比如我們定義的Class——Student,是指學生這個概念,而實例(Instance)則是一個個具體的Student,比如,Bart Simpson和Lisa Simpson是兩個具體的Student。Java學起來很有趣,通過學習Java可以提高自己的邏輯思維能力。在學習Java期間我們做了一些程式,我們班的同學也都積極準備,完成的還不錯!因為Java是一種面向對象的編程語言,剛接觸Java的人可能會感覺比較抽象 ,不過沒關係不用著急,上課的時候認真聽老師講解,一些概念知識慢慢去理解,課後多做練習,認真完成課下作業,熟能生巧,哪怕是你的記性再好,課後不去強化練習也沒用,只有多練了,當你在做項目時你才能很熟練的寫出你想要代碼。
五、Design Pattern & Multithreading
因為我本周很忙,很多任務,所以提前預習了很有意思的多線程。
六、鳴謝
鳴謝OO課程組中對OO精心付出的每一位老師同學,希望後續的OO體驗會更好。我想在OO思維和設計模式的大海裡面徜徉。