0. 前言 這段時間完成了第二階段的Java作業練習,第一階段是入手,那麼這個階段則是這之後的學習打基礎;這幾次作業主要是加強我們對面向對象的封裝性、繼承性、多態性特征的理解,下麵是我對此次作業的總結分析。 1.作業過程總結 (1) 三次作業之間的知識迭代關係 第4次作業涉及數據檢驗及處理,類的繼承 ...
0. 前言
這段時間完成了第二階段的Java作業練習,第一階段是入手,那麼這個階段則是這之後的學習打基礎;這幾次作業主要是加強我們對面向對象的封裝性、繼承性、多態性特征的理解,下麵是我對此次作業的總結分析。
1.作業過程總結
(1) 三次作業之間的知識迭代關係
第4次作業涉及數據檢驗及處理,類的繼承。要求我們依題設計正確的正則匹配,實現多種數據格式的檢驗及處理,還有就是理解繼承特性。
第5次作業是在作業4的鋪墊下,讓我們加強理解類的繼承、多態性;第6次作業相對於前兩次來說,更加簡單,也是在前者的練習過後,更加理解了類的多態使用方法,而且這次作業還加入了介面的應用,讓程式處理更加多樣了。
(2) 通過作業逐步理解面向對象的封裝性、繼承性、多態性特征
作業不會刻意的說用到這幾個特征,但代碼實現上就會反映出這些特征,這也是面向對象編程的重要體現。理解見下文中的對這三個特性的理解。
(3) 作業過程中遇到的問題及解決方法
①作業4中題一對輸入的數據進行有效性校驗要求較高,因此在應對數據的格式測試上挺讓人頭疼的。具體如下:
既然有這麼多種不同的格式,這就需要不斷地細分,對一條信息進行數據校驗、對各種不同數據進行校驗、對不同數據的不同格式進行校驗……具體的實現就不一一羅列了,總之就是不斷地切分功能,最後整合到一起。
②作業5題二、使用類的繼承、多態性編寫程式對簡單多項式的導函數進行求解中。同樣是在輸入輸出的格式上花費了不少功夫。
在處理格式時,我的處理方法是這樣的:先將輸入的多項式以“+”分割成一個個單項,在每個單項進行格式匹配,若匹配成功則進行求導處理,當然得到的還是一個個單項,當所有單項都處理好了之後,將單項串成一個完整的表達式。這隻是概要的思路,具體實現還是挺困難的。
③作業6相對比較簡單,無非就是設計對象的實現,以及輸出的格式問題,這些問題解決起來還是比較輕鬆的。
(4) 三次作業花費的時間比例
(花費時間為實際寫代碼所用時間)對於這三次作業,也許是難度有所加大,所花時間遠比階段一作業多:作業4所用時間大概是10小時、作業5所用時間大概是7小時、作業6所用時間大概是5小時,前後比例為10:7:5 。
(5) 對編程過程的嚴謹性的認識及教訓。
數據的格式是十分嚴謹的,對於不同的需求,我們應該能靈活地做出應對,這也就要求我們在編程時多多思考,考慮到儘可能多的情況。在寫一個程式時,多多加上一些註釋,也是為之後的檢查及修改提供方便。
2.OO設計心得
(1) 面向對象三大技術特性之間關係的理解
三大特性:封裝性、繼承性、多態性。
①所謂封裝,就是把客觀事物封裝成抽象的類,類中的私有屬性和方法是無法被訪問的,表現了封裝的隱藏性,增加數據的安全性。簡單來說,一個類就是一個封裝了特定屬性及方法的邏輯實體。依據某個類創建的對象對其內部屬性及方法實行不同程度的保護,根據需要來使用對象中的各屬性及方法。
②所謂繼承,就是讓某個類獲得另一個類或多個類的屬性。子類繼承父類。實現了繼承之後,子類就可以使用繼承來的所用方法,同時可以依據需要重寫從父類繼承來的方法。實現繼承大多通過組合來實現,其中有實現繼承以及介面繼承,在這幾次作業中,我們就用到了這兩種繼承方式。
③所謂多態,是指不同的對象,接收到不同的消息會有不同的行為,就像不同的人聽到一件相同的事所做的反應都是不同的。同一個類表現出不同的狀態,也就是說一個類具備了多種形態。
繼承與封裝,一個讓類有了通用、靈活、獨立的效果,一個讓類與類之間有了直接的聯繫,這也就為多態打下了基礎。把不同的子類對象都當做父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適用需求不斷變化。
(2) 面向對象設計的基本原則理解(單一職責原則、“開閉”原則)
之前不太瞭解這些基本原則,但經過這幾次的作業練習以後,有了更多的理解: ①單一功能原則,即一個對象只有一個功能,專註一個功能。這樣的話,如果需求有了改變,只需對該對象所對應的類進行修改,而且這樣不會影響到其他的功能,就是實現功能單一 ②開放封閉原則,即一個類寫好了,在更改性方面是封閉的,不改變原本的功能;在擴展性方面是開放的,能夠實現新功能的添加。③此外還有以下基本原則:依賴倒置原則,介面分離原則,里氏替換原則。其中,介面分離原則要求各個模塊之間通過抽象的介面分隔開;簡單來說,就是實現你需要用到哪些方法就調用哪些方法,屏蔽掉不需要的方法,同時也防止實施調用的對象訪問了不該訪問的方法。
(3) OO編程思維的理解
在面向對象編程過程中都以對象為主,即把問題的某些內容抽象為某個對象,然後創建出具有屬性和方法的類,依據類中的屬性和方法之間的各類關係來實現各種功能,在不同情況下實現各種調用。這種將抽象出對象對應實際問題的某些內容的思維,對於以後的軟體開發的可維護性、可擴展性以及可復用性等都是有極大的好處的。
3.測試的理解與實踐
(1) 測試對編碼質量的重要性
測試對於編碼質量很重要,因為在投入使用前,我們對它的細節要求並不是很清楚,就像作業中所給出的測試點經常要多次調試才能過。而測試則可以讓我們對代碼進行全面檢查,一步一步完善每個功能,實現編碼的高質量。
(2) 使用Junit進行程式的測試分析
Junit是一個Java語言的單元測試框架,Junit測試是程式員測試,即所謂白盒測試,因為程式員知道被測試的軟體如何(How)完成功能和完成什麼樣(What)的功能。我們在編程時使用Junit寫一些適當的測試是有必要的,Junit有斷言功能,如果測試結果不通過會告訴我們哪裡測試不通過,如果Junit報告了測試沒有成功,它會區分失敗(failures)和錯誤(errors),在此基礎上進行修改,這大大提高了效率。
在實踐中,編寫測試代碼會使我們的壓力逐漸減輕,因為通過編寫測試代碼,我們也能對類的行為有更確切的認識。以下是我認為比較有必要掌握的技巧:①確保測試與時間無關,不要依賴使用過期的數據進行測試。②儘可能地使用Junit提供的assert/fail方法以及異常處理的方法,利用Junit 的自動異常處理書寫簡潔的測試代碼可以使代碼更為簡潔。③測試類和測試方法應該有一致的命名方案。如在工作類名前加上test從而形成測試類名。④測試要儘可能地小,執行速度快。
4. 課程收穫
通過這四周的學習,在OO方面,以及漸漸養成了面向對象的編程思維,解決一個問題時,慢慢習慣去實現一個個模塊化的功能,估計這就是封裝吧,同時做了這麼多的練習,對於三大特性已經慢慢地體現在了代碼中。
此外,這幾次的作業做下來還是覺得挺吃力的,還是得多多練習,把基礎打牢靠。
5.之後一段時間的學習計劃
結束了第二階段的學習,在之後的學習中,多多練習寫代碼,同時由於下一階段更考驗每個人對於類的設計,這就需要在類的設計上多花心思,需要更加針對性地學習。希望能和同學多多交流與探討。