? oo第一次作業主要考察了多項式的求導,從簡單的冪函數求導到三角函數求導再到嵌套函數的求導,難度循序漸進,對我們對于面向對象的理解的要求也在一次一次提升。一行行代碼打下來,一夜夜熬過去,我也來到了這個短暫的停靠站,對自己前三次的作業進行一個簡單的回顧。
?
第一次作業:
? 測試結果:在強測時被一個同質bug hack到了六個點,直接導致我自己很可惜的沒有進入互測,問題在于x和^之間的空格在我寫正則表達式進行判斷時被遺漏,導致強測大多數點輸出的結果都是”WRONG FORMAT!”,我個人對這個評測結果和給分制度并沒有任何的異議,因為我覺得這個問題的出現確實是我沒有做好本地測試的原因,最基礎的錯誤,往往是也是最嚴重的,這一點不管是在現在的學習還是以后的工作都會得到體現。
? 主要問題:感覺第一次作業結果并不好的原因就在于中測通過之后沒有進行更嚴格的測試,不是按照先測試、后寫代碼的順序來進行的,沒有按照規律構建較為完備的測試集,才導致了這么基礎的錯誤的發生。在第二三次作業中由于我做好了這一點,導致結果明顯比第一次要好很多。
? 過程反思:在第一次作業的時候我個人感覺自己并沒有很好的理解“面向對象”這個概念,整個程序就是按照一個main從頭到尾地寫了下來,還依舊停留在c語言面向過程的思維里,這樣寫出來的程序不論是魯棒性、擴展性還是后面對于修復bug而言都是十分不利的,很多時候修復一個bug往往需要對好幾個方法進行改動,這一點我在第一次作業的修復過程中深有體會。
?
第二次作業:
? 測試結果:強測點全部通過,但是顯然我對于對于三角函數的化簡并沒有做到最好,只是簡單地進行了sin(x)^2+cos(x)^2=1這個公式的有關化簡,對于大多數三角公式都沒有進行處理,最終強測只拿到了98.3分,互測也被找到了三個bug。
? 主要問題:第二次我覺得我確實相對于第一次有了一定的進步,但是代碼架構仍然十分令自己不滿意,各種方法的關系錯綜復雜,沒有做好邏輯的梳理,導致自己在檢查bug時依然十分頭疼,總是在一個類中反復尋找邏輯關系。
? 過程反思:但是第二次作業我也有了一定的收獲,那就是在互測環節中,我自己嘗試去利用shell腳本進行了程序的對拍,這樣對于bug的查找即高效又省力,我需要做的僅僅就是確保自己寫的shell文件沒有任何的問題即可。
? 雖然第二次作業和第一次作業有著許多相似之處,但是我深知我必須對自己的代碼進行徹底的重構,不然對于第三次作業的進行將會極為不利。但是第二次作業我對對象的理解仍然不夠深刻,我只是簡單的將程序分為了main、多項式處理(poly)和單項式處理(mono)這三個類來進行書寫,這樣我的poly類中仍然有著龐大的代碼數目和十分復雜的方法關系,很多完全可以單獨拿出來作為一個類的方法,都被我雜糅進了poly這個類中,這是我所犯下的錯誤。
?
第三次作業:
? 測試結果:第三次作業和前兩次作業相比難度確實大了很多,就我個人而言,對有關結構的問題和同學進行了近兩天的討論,最后通過兩個夜晚的奮斗終于在周二下午成功解決了中測的所有測試點,(雖然后來延時心里確實有些小小的不平衡,但是還是利用這個時間找出了自己的幾個bug并進行了略微的優化)。最終強測還是錯了一個測試點,并且在互測中被找出了一個bug,不得不說一下在互測的過程中我深刻的感受到了同級大佬的強大,不論是優化的程度,還是代碼的架構都十分讓人佩服。
? 過程反思:在這次互測中同班的朋友教會了我使用python腳本進行表達式的求導和計算,這樣我就可以利用shell文件對每個人的表達式賦值計算并查看結果,這無疑是一件讓人十分有成就感的事,這樣我也避免了去檢查同組復雜的的輸出表達式,而可以直接通過結果來快速判斷正確性。
? 在第三次作業中我覺得我的整體架構比前兩次要好得多,清晰得多,我一共分了八個類,并在因子的求導部分利用了繼承來進行書寫,常數、三角函數、單項式和表達式因子都是因子這個父類的子類,這樣寫起來邏輯十分的清晰,在debug的過程中也更加容易鎖定自己bug所在的位置并快速進行修改,正確度也高了許多。
?
三次作業代碼分析:
? 在三次作業之后,我利用idea自帶的metrics插件對三次作業的代碼復雜度進行分析,結果如下:
? ? ? ? ? ? ? ? ? ? ? ???
? 我個人很驚訝的發現到第三次作業代碼長度竟然略小于第二次的作業代碼長度,這里我對這個現象進行了一下簡單的分析,首先是我第三次作業的優化明顯不如第二次做的好,而對于第二次作業來說,結果優化部分大概占據了八十到一百二十行的代碼量,這是原因之一,其次是我第三次作業的框架要優于第二次作業,不論是類的劃分,還是繼承等方面都比第二次好得多,這也就導致少了很多冗余重復的代碼。
?
? 這三次作業每一次都讓我對面向對象這個概念有了進一步的認識,對程序的構架設計的越好,程序的各方面性能也隨之變得更好。我利用idea查看了每一次作業的類圖,結果如下:
? ? 第一次作業:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
? 第二次作業:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
? 第三次作業:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?很明顯我每一次作業的設計都相對于上次的有了很大的提升,而隨著我結構的一次次完善,相應測試的分數也有所提高,修改bug的難度也變得越來越簡單,我覺得我在逐漸從過去的面向過程往面向對象不斷地前進,這也是我必須從這門課里學習到的最重要的東西之一。
?
對于bug查找的分析:
? 其實就我個人的感覺而言,這一次作業bug并不太可能出現在求導的部分,基本上當大家通過了中測的所有樣例之后,對因子或者項的求導功能大概率是不存在缺陷的,所以在互測環節時,bug基本都是出現在正則表達式的判斷部分,或者是輸出的格式問題上,構造一個完備的略微基礎的測試集,有時候比很復雜很長但是測試類型同質的測試樣例更為有效。
? 以我自己為例,在第二次作業的互測環節中,我被hack到的樣例分別是1*和++++,這些數據都是最簡單最基礎的測試樣例,但是往往我們就會在正則匹配的部分忽略這些情況,其實復雜的測試樣例也就只是多個簡單樣例的綜合測試,我們提前做好一個完備的簡單樣例的測試集,復雜樣例的通過只不過是順其自然的事情。
?
小小的總結:
? ?雖然通過每一次作業我都能看到自己在某些方面取得了明顯的進步,也有了繼續努力的動力,但是相比于同級大佬們的代碼而言,我的程序各個方面都還存在著極大的優化空間,這將是我未來進一步努力的方向,希望自己的能力可以通過這門課得到極大的提升。
?
?