1.前言 這應該是本學期最後一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得瞭如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業過程總結 相比前兩個單元,此單 ...
1.前言
這應該是本學期最後一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得瞭如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。
2.作業過程總結
相比前兩個單元,此單元的三次作業每次作業只有一道題。做題目沒有了像之前那樣的優先順序,而是全程專註一道題。作業九則是通過雨刷程式功能擴展設計考察對類的封裝、繼承、多態的掌握度,作業十是通過 統計Java程式中關鍵詞的出現次數考察對工具類List、Set或Map的掌握程度,作業十一則是設計表達式求值的程式,考察對棧的使用,並檢驗自己之前對正則表達式的掌握程度。總的來說,三次作業考察的重點是併列的,但都需要有之前學到的基礎知識。通過這幾次作業,對面向對象以及其基本原則有了更深的理解。
作業九剛開始看題目的時候感覺整體不難,但是仔細一想,需要在繼承與組合的方法之間斟酌,是自己寫出的程式能夠使得程式在符合單一職責原則、迪米特法則、合成復用原則的基礎上具有良好的擴展性(開-閉原則)、里氏代換原則、介面隔離原則及依賴 倒轉原則。將題目寫出來問題不大,但是如何使代碼實現要求很難。我開始使用了繼承的方法,但是因為子類要實現父類的方法,使得代碼寫到很長。我開始嘗試去網上找一些例題,查找了一些組合的方法來解決問題。
作業十給人一種很簡單的感覺,但實際卻不簡單,剛開始做的時候覺得這是到用正則表達式匹配,然後返回匹配正確次數的題目。但開始寫主函數代碼的時候,就碰到了問題。如何輸入數據呢?是一行一行輸還是整體用一個StringBuilder類型的參數將整體接收呢?如何判斷輸入的數據是否為源代碼呢,遇到多行註釋該如何跳過呢?諸如此類的很多問題,這個題目在細節上處理很麻煩。第一次的時候是直接用一個StringBuilder類型的參數將整體接收,發現在遇到單行註釋的時候很難講數據處理,就改為了一行一行輸入,併在每行結尾加上換行符作為每一行結束的標誌,通過換行符將數據切割成字元串數組,對每個字元串進行正則匹配,在每一行遇到單行換行符後直接跳過字元串後面的數據轉而匹配下一行的數據,在遇到多行註釋時,同理跳過知道遇到下一個註釋符是繼續匹配。因為TreeMap可以自動排序,所以選擇TreeMap來裝載得到的數據。因為53個關鍵詞是不重覆的,而關鍵詞出現的次數是可以重覆的,所以關鍵詞為key,出現的次數對應value。本題存在疏漏,即題目測試未給出題目所測的53個關鍵字是以什麼來排序的。而是叫我們去網上找,但是網上找的53個關鍵字的先後順序是不一樣的,我開始以為是按拼音來排序的,不管怎麼做,正確的測試點只能過一個。看到有網站上寫到53個字也是按拼音排的,唯一不同的是它將null放在了末尾,後來我嘗試按這種方法排序,結果大部分測試點都過了。最後一個測試點過不了,至少我到最後都不知道最後一個測試點測的是什麼數據。
作業十一的表達式求值,則需要用到自己完全沒有接觸過的知識,棧。開始基本上完全不知道棧是如何使用的,學著網上的一些例題和相關資料才有了一個大致的輪廓。大致思路是通過用一個棧來裝數字,一個棧用來裝符號,通過設定符號的優先順序,來對數據進行計算。大致思路是將輸入的字元串傳入到一個字元數組中去,然後對字元數組遍歷,用準備好的兩個棧,分別來裝載數字和字元,當輸入比之前字元優先順序的字元時,對之前的數據進行計算。開始經過測試的時候發現輸入帶括弧的數據時很容易出錯。通過設置一個條件語句,判斷是否掃描到括弧,若出現右括弧,則從後往前計算,並不斷刪除已使用的符號,直到遇到左括弧為止。此題考慮數據錯誤的情況有很多,需要逐一判斷,總體上花了不少時間。
本單元的三次作業在大體上花的時間大概差不多,按順序來三次作業大概花3:3:4的時間,總體上3次作業難度上總體難度相差不大。但是實際花的總時間應該能更短。每次拿到題目,一上來就是想到什麼寫什麼,很容易卡殼。經過這幾次的作業,我更加深入的理解面向對象的理念。在拿到一個題目時,應該先找出其中有哪些對象,然後通過一些方法將它們之間聯繫起來,形成一個大致的輪廓,同時也便於之後對疏漏的方法進行補充、對代碼進行擴充。而不是想到什麼寫什麼,這樣到後面很容易出現自己用到的一大串的方法可能到後面用不上或者會影響代碼的可拓展性而不得不捨棄。在添加新的方法時,應該考慮會不會影響代碼的可擴展性和復用性,這樣能夠為之後增加新方法省下不少時間。
3.OO設計心得
①里氏替換原則:通俗的來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。在寫代碼時,經常會設計介面或抽象類,然後由子類來實現抽象方法,其中子類可以實現父類的抽象方法也必須完全實現父類的抽象方法,否則編譯器就會報錯。關鍵點在於子類不能覆蓋父類的非抽象方法。如果子類對這些非抽象方法任意修改,就會對整個繼承體系造成破壞。而里氏替換原則就是表達了這一層含義。在繼承父類屬性和方法的同時,每個子類也都可以有自己的個性,在父類的基礎上擴展自己的功能。當功能擴展時,子類儘量不要重寫父類的方法,而是另寫一個方法。
②依賴倒置原則:依賴倒置原則的包含如下的三層含義:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象,抽象不應該依賴細節,細節應該依賴抽象。打個比方奶茶店賣各種各樣的奶茶,奶茶店就是高層模塊,各種各樣味道的奶茶就是低層模塊。當我們想到奶茶這個名詞時,我們會想到,奶茶店賣奶茶,奶茶有冰鎮奶茶,酸奶等這類具體的東西。奶茶就好比一個由各種各樣奶茶共用的介面,而奶茶店也依賴奶茶這個抽象類。
③介面隔離原則:通俗來理解就是,不要在一個介面裡面放很多的方法,這樣會顯得這個類很臃腫不堪,而且後續維護與擴展也十分麻煩。介面儘量細化,一個介面對應一個功能模塊,同時介面裡面的方法應該儘可能的少,使介面更加輕便靈活。
④類設計心得:在拿到題目後,應先找出題目中的對象,通過構造方法使他們之間產生聯繫,一開始就要構造一個大致框架,把幾個大模塊設計成類,遵循單一職責原則和合成復用原則,並註意考慮其可擴展性和復用性,多使用介面、抽象類、多態等技術來設計類。儘量使用組合而不是繼承。類與類之間可通過關聯,聚合,依賴等關係來實現代碼的復用,從而提高功能執行的效率。
4.測試的理解與實踐
測試對於編碼質量的重要性:測試能夠極大的減少代碼的錯誤以及漏洞,同時它還能夠提醒寫代碼的人對運行時間過長冗雜的部分進行方法的改進。只要是提交的代碼便會有錯誤的可能,而測試正是減少這些錯誤的最好的工具。測試還能夠檢測代碼的效率,是否存在冗長多餘的部分,通過測試可以提高代碼的質量。
只有不斷的練習,才能熟能生巧。通過練習,才能真正的將所學的知識運用起來,才能更加深入的理解,更好的掌握新知識。
5.課程收穫
通過本單元的學習,我對類的封裝、繼承、多態,抽象類,介面的使用有了更深刻的認識,基本上已經能過熟練使用。加強了我對工具類List、Set或Map的認識,學會使用棧來解決題目。通過這幾次作業,我認識到自己的不足,更能深刻體會學無止境這一道理,只有通過不斷地學習,懂得東西才會更多,只有多動手,才能更加清楚發現自己的問題所在,加油。
6.對課程的建議
每次的作業總是和上課所學的知識不能緊密聯繫,上課所講的進度每次都要比作業超前,以至於每次做實驗時都要重新撿起以前的知識,這樣要花費更多的時間。希望以後講課能對標上作業,也希望老師可以帶領我們多多練習,讓學生也能看看老師是如何解題的。