1. 程式人生 > >面向對象第一次Coding總結暨感想

面向對象第一次Coding總結暨感想

clip java 好的 不足 調度 exceptio png 我認 五個

  已經不是第一次敲Java了,真的應該感謝學院在大一暑期的時候開設了面向對象先導課程,讓我好歹磕磕絆絆地過了編手,不至於在OO課來臨直接過於難受。其實我跟JAVA有著很大的緣分,記得大一的時候,學院給我們開設了第二課堂,大部分同學為了給下學期的數據結構打好基礎選擇了C語言,偏偏我頭鐵,以為要把眼光放得長遠選擇了Java。結果可想而知,一點點編程基礎沒有的我在滿是大佬的課堂瘋狂劃水,講的東西一個字都聽不懂,整個學期唯一的收獲大概就是電腦上安裝了Eclipse。暑期課程搶救了我,在安裝了Eclipse的基礎上敲了點代碼,入了門,順承地來到了OO的課堂。

一、以“碼”為鑒,可知己菜

  太菜了,是真的菜,這大概是我最近這次互測拿到對方代碼之後不由得發出的感慨,別人是面向對象編程,而我是真的面向對象編程,或者說:面向對象寫面向過程編程。

1、第一次作業——重拾Java

  技術分享圖片

  雖然之前有過編寫Java程序的經驗,但那個時候也只是簡單地學習了語法入了門,沒有理解Java編程的精髓,寫出來的程序有著濃厚的C語言味道,再加上半年來沒有加強訓練,第一次作業依然是在做回顧語法的過程。整個工程文件只有Main和Poly兩個類,所有的方法都在Poly裏面,土豪式地實例化了20個Poly對象,每個都開了1000000大小的數組(指數從0到999999,以下標為指數,以內容為系數),這種做法極大地簡化了邏輯,不用排序,也不用擔心數組會爆,反正大於999999的指數就是ERROR,很暴力地做輸入、正則表達式分解、多項式相加、輸出。然後再自以為安全地寫了通篇的try-catch,搞定。
  結果測試結果一出,就傻眼了。因為粗心,沒有看到作業指導書裏面最多只允許6個字符長度的數字,誤以為最多支持6個前導0就行,導致公測掛了一個點。互測的時候又被掛了一個crash,沒錯,通篇try-catch了也會crash?也希望各位同學引以為鑒,不要以為try-catch就安全了。因為我在正則表達式部分寫了通配符\*,導致對於無限長的合法輸入(100個多項式)也納入到了考慮範圍中,導致運行時爆了Java的運存,連catch都崩了更不會catch到exception了。第一次作業我從中吸取了很多教訓,這之後我除了catch(Exception e),還catch(Error e),徹底杜絕了crash。
  很湊巧又不湊巧的是,第一次作業我分配到了室友的代碼,室友之間肯定就這一次的作業有過交流,我們兩個的思路也是一樣的,雖然我還是盡可能地分析了代碼,但找不到任何bug。

2、 第二次作業——初試面向對象

 技術分享圖片

  從第二次作業開始,無論是老師還是同學都在刻意地學習面向對象式的寫法。從這一次作業指導書可以看出來,強行要求實現五個類就是要學生去體會“對象”這個概念,制止過程式寫法。這一次的作業難點在於電梯時間和請求時間不同步,有一部分同學選擇模擬時間的方式將兩個時間調同步。這一種方法可以簡化邏輯,並且可以適用於接下來的任意一個電梯作業,但模擬時間循環會導致程序運行完畢可能需要較長時間。我采用了另一種方法讓二者時間同步:在電梯每開始執行一條指令到執行完畢的這一段時間,記錄所有請求的到來情況,若某個按鈕沒有被點亮,則接受請求,即點亮按鈕,否則標記為同質請求。老師說過,面向對象實際上就是在搭積木,我給每個樓層都設置了按鈕,電梯裏也設置了按鈕,整部電梯系統就是由樓層,電梯,調度器搭起來的,再搭配上請求類和請求隊列類。寫完之後頗有一絲面向對象的意味,就好像自己在minecraft裏搭房子一樣。但是調度器類我覺得自己依然使用的面向過程的思路,不同於“樓層”、“電梯”、“請求”,我不能很好的把“調度”這一概念很好地抽象出來,也沒有太關註這一點。抽到的代碼也是洋洋灑灑一百行的調度類,跟我有著一樣的毛病。
  在測試自己的代碼的時候,我和小夥伴們一起對老師給出的錯誤分支樹每一個分支都寫了樣例,盡可能降低bug出現概率。這次業我吸取了上一次的教訓,認真閱讀了作業指導書,並對照著自己的代碼一遍又一遍檢查,所幸使得自己公測和互層都沒有被扣分。但是我分配到的代碼也是一個大佬的,用網站測試了我們構造的所有測試樣例之後也沒有發現他任何bug,證明了他代碼邏輯的正確性。進而進行魯棒性測試,測試極端輸入和各種錯誤輸入,也沒有發現問題,正則表達式的匹配部分也運行良好,不會因為奇特的情況crash,讓我心灰意冷。灰心之際突然發現他的編碼格式是GBK,勉強報告了一個incomplete。

3、第三次作業——繼承&接口

  技術分享圖片

  這一次的作業可以說是很有難度了,新的要求使時間不同步的基礎上增加了新的困難:捎帶會影響同質性。因為要用繼承,所以並不想破壞第二次的大體思路,這意味著不能在掃描隊列時先判斷同質再判斷捎帶,而要每條指令都去判斷是否同質,是否可以捎帶。捎帶不但可以捎帶新來的請求,也可以捎帶之前的請求,這就使掃描不能從電梯開始運動時刻開始,要從未執行的第一條指令開始。除此以外小問題眾多:主指令變更、同層輸出順序等等。在敲代碼之前我進行了很長時間的構思,這也是我在學習數據結構開始總結到的經驗:先想好再動手,不然debug的時候可能會哭。整體架構設計完後也想了很多特殊情況:主指令和捎帶指令同層結束但捎帶指令先執行。這種事無巨細的構思給我後期的碼代碼帶來了無限的便利。
  但是過分關註邏輯性,又讓我忽視了“對象”這個概念一個調度器類寫了300行,別的各個類最多也就50行,讓整個結構顯得很不均勻,調度器承擔了太多的任務。因為測試期間沒有看到優秀的“面向對象”代碼,自己也不知道怎樣的寫法才是最好的,直到這一次的互測分配。雖然這個代碼被我找到了同層輸出順序的bug,但他代碼的抽象能力是真的很厲害,第二次作業就很好地完成了調度器的抽象,甚至把輸入、輸出都抽象了出來,既提高了代碼的可讀性,讓代碼更整潔,也減小了第三次作業的任務量,不足數十行代碼,重構一小部分,很漂亮地完成了任務。學習了他的寫法之後我決定小範圍重構自己的代碼。
  不過值得開心的一件事情就是本次作業依舊完美通過了公測和互測,這一點十分得益於對錯誤分支樹的遍歷。我認為是可以總結為經驗的形式繼續下去的。

二、感想

  經過了幾次OO作業,我覺得OO課程最恐怖的地方是他的作業周期。最好的方式是從周日開始構思,周一敲代碼,周二完成,周三稍作修改收工。但凡犯了一點點拖延癥,敲代碼的時候就會很被動,ddl壓頭難免會恐慌,就會造成琢磨不透徹,思路不清晰,bug繁多的現象給別人送去一份大禮包。最近愈發感覺Java比C友好,記得第一次作業的時候還要求寫了一個C代碼,在享受過Java的Arraylist的便捷和Eclipse的自動補全之後,開始寫C語言竟然還有那麽一絲茫然。以前聽大神說C是高級語言裏的最低級語言,看來是沒錯了。
  前文說過寫面向對象的代碼就像在minecraft裏面搭房子,這確實是我真正嘗試用面向對象的思想寫Java的感覺。這不過現在房子搭地還不夠好,還要經過學習去研究怎麽搭地基,怎麽搭房頂。特別是接口的用處還沒有學懂,上節課老師也說過接口在這次作業看似用處不大,不過在多線程作業時就會大放光彩,但願自己可以伴隨著學習一點一點吃透Java的編程思想。最近在基友群裏看到了一個圖片,很生動地解釋了面向對象思想中各個專有名詞的概念。
   技術分享圖片
  這幅圖片蠻搞笑的,不過確實能通俗地解釋基本概念,算得上是忙碌的學習生活中一點點樂子吧。也希望自己的OO課程可以在忙碌得過程中伴隨著樂子,充實愉快得度過這個學期。

面向對象第一次Coding總結暨感想