1. 程式人生 > 其它 >面向物件第一單元個人總結

面向物件第一單元個人總結

面向物件第一單元個人總結

摘要:本次部落格介紹了第一單元三次作業的思路、bug分析與心得體會,三次作業均採用預解析模式。

一、第一次作業

UML類圖:

解析:

MainClass:執行主程式,判斷每一次的輸入為add、sub、neg、pos、mul、pow中的哪種運算,進而執行Factor中的相應函式。

Factor : BigInteger[] factors用於儲存次數為0~8對應的係數,factor函式用於初始化資料,add、sub、neg、pos、mul、pow幾個函式用於運算,進行係數的運算。

優點:

將係數存入陣列進行運算,思路簡單明瞭,便於操作,針對性強。

缺點:

拓展性弱,因各個次數對應的係數是用數字型別的陣列進行儲存的,當係數的型別增加後,該方法難以應對,拓展性弱,這也導致了我第二次作業的重構。

 

 

整體複雜度與類的耦合度都較低,但也有個例,pow做乘方計算的函式複雜度過高,計算時過於複雜,程式碼行數較多,影響效能,mainclass中也做了過多運算。

bug分析:

在公測和互測的過程中無明顯bug,雖然效能存在一定缺陷,但未出現bug。

互測bug尋找:

隨機測試,僅通過尋找特殊資料來進行hack,導致本次互測未發現別人bug。

二、第二次作業

UML類圖:

解析:

與第一次作業相似,但是不再是原本的只儲存數字的係數,這次選擇了ArrayList去儲存每個表示式不同的項。

MainClass:執行主程式,判斷每一次的輸入為add、sub、neg、pos、mul、pow中的哪種運算,進而執行expr中的相應函式。

expr:ArrayList<Factor> factors用於儲存儲存每個表示式不同的項,其中包含add、sub、neg、pos、mul、pow,進行運算。

Factor:將str轉化為Factor型別,便於儲存和運算。

優點:判斷運算型別後直接進行Factor的運算,運算簡單。

缺點:最終的形式為字串,且運算過程中無化簡,導致最後難以化簡,只能進行一定的字串替換。

整體複雜度與類的耦合度都較低,只是在MainClass中進行了過多的字串處理與判斷,導致其複雜度過高。

bug分析:

本次出現了較多bug,第一個是由於本次的運算方式導致的,最終只進行簡單的字串合併,沒有關注到形式的合法性,導致出現了類似“*-x”的不合法的情況,在進行字串處理後將此bug進行了修復。

第二個是出現了未考慮0次冪的情況,導致運算錯誤,在pow進行了0次冪的特殊情況討論後將此bug進行了修復。

互測bug尋找:

未能發現bug。

三、第三次作業

UML類圖:

解析:

與第二次作業的程式極度相似,選擇了ArrayList去儲存每個表示式不同的項,相比與第二次作業,只是添加了sin與cos的()。因此以下幾部分也是與第二次作業相同的。

MainClass:執行主程式,判斷每一次的輸入為add、sub、neg、pos、mul、pow中的哪種運算,進而執行expr中的相應函式。

expr:ArrayList<Factor> factors用於儲存儲存每個表示式不同的項,其中包含add、sub、neg、pos、mul、pow,進行運算。

Factor:將str轉化為Factor型別,便於儲存和運算。

優點:判斷運算型別後直接進行Factor的運算,運算簡單。

缺點:最終的形式為字串,且運算過程中無化簡,導致最後難以化簡,只能進行一定的字串替換。

整體複雜度與類的耦合度都較低,在MainClass中進行了過多的字串處理與判斷,導致其複雜度過高。

bug分析:

本次強側中出現了2個測試點未通過,經過手動計算與程式結果比對,程式結果是正確的,應該是因為最終結果未化簡導致的錯誤。

互測中未被發現bug。

互測bug尋找:

 本次bug尋找主要是構造極限資料與特殊情況,尋找到了3個其他同學的bug,有2個bug是通過測試sum中數字的超大值發現的,例如sum(i,99999997,99999999,i)。第3個bug是通過測試sum(i,-3,-1,i**2)測得的,部分同學在進行冪次運算時未打括號,導致結果為負而出錯。

四、架構設計體驗

第一次作業由於對各種語法、思想都不熟悉,導致在最初構建框架時很費勁,構建出來的框架也不夠完善,僅僅依靠完全的面向第一次作業的特殊形式而過關,這也導致了第二次作業的重構。

第二次作業進行了重構,改變了原本的以單一數字為係數的儲存模式,將每一次的計算結果存入hashmap中,用expr的類來儲存表示式的每一項。然而在此過程中未能發現“*-x”類似的不合法的bug和未考慮0次冪的bug,導致結果不理想,雖然在bug修復中進行了修復。第二次的作業架構設計還是可以的,這種做法能夠適應表示式型別的增添而不受影響,雖然化簡過程麻煩,甚至難以化簡,但是在保證拓展性和正確性方面還是可以的。

第三次作業是比較輕鬆的,由於第二次架構的完整性與拓展性,第三次作業中僅添加了sin與cos後的()便完成了作業,由此可見好的建構的重要性。從第一次到第二次,從第二次到第三次,這完全是兩個極端,一個由於架構的巨大缺陷而重構,一個由於架構的拓展性而僅僅修改了一點完成了作業,這也算是一次巨大的教訓了吧。

五、心得體會

最初接觸第一次作業,真的很不熟悉,幾乎沒有思路,又有許多語法上的不明白的地方,真的挺折磨人的,還好在經過詢問與求助後得到了不錯的結果。面向物件真的需要花費時間去學習,去理解,僅僅掌握語法是完全不夠的,就拿這幾次作業來說,很難馬上擁有思路,更何況自己本身的知識儲備匱乏,所以還是要多加練習啊。第一單元也算學習到了許多,類似繼承、介面等方法,雖然用的不多,但也算知道了大致的用法和定義。希望第二單元能夠學到更多知識,能夠順利度過。