《 OO第一作業周期(前四周)總結 》

作為一名軟件工程的大學生,很高興能夠以這樣一種方式,實現對博客編寫零的突破。專業課老師也介紹了編寫博客給我們帶來的幫助,聽了以後,我感覺到了培養出寫博客的習慣,是一件多麼有意義的事!

話不多說,讓我們言歸正傳。

0. 前言

本次作業:《 OO第一作業周期(前四周)總結 》

針對我們第一階段的作業( 共三次 ),發表總結性博客。這三次作業,均能夠較為順利完成,並達到滿分。

對於這五周所學習到的java知識,也是讓我初步了解了java面向對象的風格。

1. 作業過程總結

①總結三次作業之間的知識迭代關係;

這三次PTA中的作業,可能還沒有過多的涉及到面向對象的設計。其中,第一次作業,我認為是對一些程序設計算法的基本考察,很多都是和大一上學期所學的C語言相似的題目。例如,第一題,計算稅率:全是大量的根據

輸入的值進行公計算,我可能認為代碼放在一個main函數里,顯得很亂,就在類裏面添加了一個計算稅率和判斷種類的函數。這樣main函數中的代碼看上去更簡潔一些,思路更明確。由於題目要求,稍微在網上查了一下,

java控制台輸入的代碼。剩餘四題都是基礎的條件判斷。

第二次作業:初次涉及到部分日期的算法,一開始,對日期的求法比較頭疼,需要考慮到很多情況。想了很久也沒有什麼比較簡便的算法,於是就一點點的把所有情況例舉出來,尤其是考慮到了特殊情況,例如:往前跨月、

往前跨年,閏年的跨月……至少是成功通過了測試,感覺不夠簡便。

第三次作業:這個耗時最多的一次,我也認為是對面向對象的初次體現。這次作業,在第二次作業,對日期算法的基礎上,加大了難度,不僅僅是算法上的難度,還有類設計的。先說算法上:與上次不同的是,前n天和後n

天的範圍沒有規定,也就是需要考慮大於一個月、甚至是年份為負數的情況……對於情況的考慮,我之前一直有漏掉的方面,再過測試點的時候遇到了麻煩。首先沒有考慮到輸入的n值過大的問題。所以最後選擇了”long”的數據

類型,是第一次在代碼中使用。然後,在求前n天和後n天里,求出輸入日期距離”0000-1-1″的天數,加上”n”得到總天數,在從”0000-1-1″累加天數求新的日期。計算負數年份的算法,由於代碼的設計,負數年份我考慮用天數

減去整年天數,最後剩餘小於多一年的數, 日期從”-1-12-31″開始計算,因為日期是從後往前計算,所以可以直接用一年的天數減去剩餘不足一年的天數, 計算出來的天數可以採用正向按月累加,得到相應日期。類的設計里

面,有兩種不同的形式。一個是五角星,一個是鏈式結構。五角星:在日期算法的類中,有“年-月-日”三個類圍繞,在算法中類方法的調用相對簡便;鏈式結構:是以“日期算法->日->月->年”的結構,方法中的屬性調用麻

煩,需要按鏈的順序,逐級調用。日期的算法均採用的之前設計過的算法,並沒有按着題目里已給出的屬性,重新設計算法。雖然是直接copy,但是類屬性的調用改起來依然很麻煩,尤其是鏈式結構的設計。

        ②如何通過作業逐步從面向過程過渡到面向對象;

面向過程的概念接觸可能是在C語言當中,知道main函數裏面調用外部設計的各種功能函數。在第一、二次作業當中,使用的更多是面向過程的思想,也與題目本身有關係,因為沒有過多的涉及面向對象的知識。而到了第三

次作業,面向對象的思想初步體現,尤其是最後兩題,類的多種結構設計。在“年月日”三個類的設計中,有更多的面向對象的體現。設計出的類,需要創建出實體,這個實體我就認為是一個對象,所以類設計出來,是為了對

象,而類被看做是一個概念。

③作業過程中遇到的問題及解決方法

作業中遇到的問題真的是一雙手的手指都數不過來,因為很多知識需要在課下進行學習。從最簡單的控制台輸入開始,這個和之前學的C語言的輸入輸出格式大不相同。之前只是最簡單的”scanf”,在網上查詢以後,知道了

java裏面可以按數據類型控制輸入的數據,就好像”.nextInt”、”.nextLine”……各有各的作用,相對於之前學的,在數據的接收方面看上去更方便一些。接着就是,代碼風格的改變,一開始只是創建一個類,還需要對類進行實體

化,我就因為這個出現了很多次的報錯,後來熟悉以後就漸漸少了些。到後面的日期算法,先是無從下手,到最後選擇在紙上把想法畫出來,步驟逐條的記錄在紙上,然後開始不斷地編譯測試。在測試中,找到一個個特殊情

況,再對方法加以完善。這個過程很難,但也很重要,否則就會達不到題目提出的要求。其中有一個”long”類型的使用記得很清楚,因為當時不知道怎麼考慮”int”最大值輸入的情況,就詢問了同學,在指導下知道了使

用”long”類型接收數據。

④每次作業花費的時間比例

耗時也是隨作業逐漸增加,第一次作業中主要是稅率的公式計算,大量的”if..else..”語句和錢數的累加,代碼看上去很枯燥,但的確需要這麼設計。第二次作業中主要是日期的簡單問題,當時考慮到了特殊情況,相對會耗時

少一些,但並不最簡便的算法。第三次作業,算法難度的升級,大量的特殊情況,關鍵我一開始並沒有想到合理的算法,花費很多時間在設計上面。到後面的類的設計,相對copy了已經設計好的函數,並且沒有進行修改,只

是改變的調用屬性的方法。這也耗時增多的主要原因之一。

⑤對編程過程的嚴謹性的認識及教訓

這個可能深有體會吧。之前的C語言相對沒有注意過這些,連變量名都是簡單的一個毫無疑義的字母。但是到了java裏面,開始關注變量名,類名,方法名,實體名等等一系列的命名方式,會去使用更多的相對應的英文命

名,的確可以方便讀,在對代碼的了解上,有很大幫助。因為java中,有項目文件夾,再到一個包,一個類,一個接口,這些都是有一個等級順序的,所以命名時要考慮是否合理及可用。剛開始還會遇到報錯,我也很奇怪,因

為在算法上沒有錯誤,在eclipse提醒下,才知道類名重複的可怕性。

2.OO設計心得

①面向過程與面向對象的比較

相比較的話,應該是面向對象的設計會複雜一些,感覺更多的是類的定義,和實體的創建。這些應該是面向過程里沒有的。但是,的確在方法和屬性的調用上很清楚,更容易接受了解。面向過程很多是main函數外加函數方

法,而這也是在學習過程中,老師要求我們少用”static”,無論是屬性還是方法使用後,都會忽略了實體本身,類創建出來也變得毫無意義。

②面向對象設計的基本原則理解

這個我的了解非常的少,也沒有仔細了解過。只知道java中的三個特點,多態、繼承、封裝,這些可能是java獨有的特點,對於面向對象,我認為還是概念和實體的定義、創建。它關注的是每一個對象本身,就像是,我有這

么一個東西,但是東西內部的構成我不需要了解,只是知道有這麼個東西存在。這也就像java中有很多在類裏面的基本方法,這些方法的內部定義,並不需要我們去學習,只是要知道這個方法有什麼作用,好

比”System.out.print()”這就是一個輸出功能。寫這個博客時,我在網上也查閱了面向對象的概念:面向對象(Object-Oriented)=對象(Object)+類(Class)+ 繼承(Inheritance)+通信(Communication)。這只是一個初步的定義,

對於裏面對象、類、繼承、通信的定義有很多很多。我認為和我想的挺相似。但是“通信”這個概念目前還不是很懂,希望以後可以去逐漸了解。

③OO編程思維的理解

思維上面應該是需要考慮對類、接口等等的設計。類只是一個概念,需要不斷給其中增添很多定義,包括類與類之間的關聯性:依賴、聚合……這些是面向過程中少有的。每個類被抽象化了,各有各的職責,就像是老師說

的,可以在每個類中找到更多的相同點,再進行提煉,設計出新的類。而實體更像是被賦予了這個概念,舉個例子:學生就是一個類,這個類中有班級、學校、同學、老師等等的屬性,還有做課間操、考試等等的方法。這些是

在學生這個類中定義出來的,而“我是一個學生。”,這句話里,我就是一個實體,被附上了學生這個概念,所以我有同學、老師,可以做課間操、考試。

3.測試的理解與實踐

①測試對於編碼質量的重要性

測試這個環節對於程序員來說,可以決定着,他面對要求修改,或者bug出現時,麻煩的大小。因為一段代碼里會有很多的功能實現。這些功能的設計或者算法上時常會出現錯誤,而測試就很有效的幫助我們提高代碼的準確

性。而這並非是最關鍵的,當一個複雜的程序設計出來,倘若中間沒有及時的測試,在bug出現時,很難快速準確的找到錯誤位置,這樣會帶來很多麻煩,以及時間上的損失。所以養成一個良好的測試習慣至關重要,不僅要測

試,還重要是及時測試。

②假如讓你設計測試用例,你會如何做

對於我來說,像是一個查漏補缺的環節。我會先是設計一些尋常樣例,至少要保證程序正常的使用。其次就是臨界值,這個臨界值的範圍很大,比如輸入輸出的數據,像是第三次作業中int型數據的最大值。然後會是合法數

據的輸入和判斷,不可能說,當輸入錯誤信息時,什麼提示都沒有,這對於用戶很不友好。最後,可能是一些人性化的設計吧,比如用戶無意間的輸入空格或者其他無關數據時,能否判斷出並且進行自動修改。

4.課程收穫

總結這四周來在OO方面的教訓及收穫

教訓當然是很多的,因為和C語言風格的不同,有面向過程轉變到面向對象,這個過程還需要慢慢適應。因為目前接觸到對面向對象的題目深度不夠,還沒有真正體現出來面向對象的優越性和複雜性,這個應該是會在大作業

中出現吧。多種代碼報錯。不過這裡,還是要好好感謝一下eclipse,會自動在錯誤的代碼下面進行標註,並賦予多種解決方案。雖說這些方案不一定是我們所需要的,但是在思路上還是帶來不小的幫助,也有效控制了我編程的

時間。至於收穫,是一些剛接觸到java時,心裏有一些疑惑,可能在做題時也經常會出現。不過在進行相關查詢和幫助下,基本都有所解決。這個過程就是最好的收穫。

5.對課程的建議 

java上課的風格可能加大了我們課下的自學時間,而且是加大很多。老師在課堂上說的完全不夠,像第一次作業中的數據輸入,就需要自己在網上查找相關資料。不過對於上課的風格,還是比較能接受和適應的,雖然是通過

網課進行教學,依舊可以有着濃厚的興趣,還得提一下,有一說一,老師的聲音非常有磁性,很好聽!!!至於建議嘛,希望老師上課還可以多講一些內容吧,雖然這個時間有限,但是課下查找資料的過程畢竟還是靠每個人自

己的理解,沒有系統的學習,在部分內容上面就會出現理解上的差距。

6.之後一階段的學習計劃

計划上,我覺得稍微少一點,實現的可能會更大。根據這幾周的學習,首先肯定是要適應面向對象這種設計思路,至少別總是出現一些C語言中的知識特點。第二是要代碼簡潔,有些代碼不必要的分行反而讓我看上去不舒

服,合理的對代碼進行排版,有助於自己的閱讀。第三,適當添加註釋,方便對知識的複習,也有利於別人讀自己寫的代碼時,更清晰易懂。第四,一些低級錯誤就還是少犯一些,例如:少加大括號,方法名使用錯誤,循環條

件的判斷……很多很多,希望我可以少讓eclipse或者編譯器來提醒我有這樣類似的錯誤出現。最後,應該是算法設計,需要提高一點點,否則做題會浪費很多沒必要的時間,多去網站上學學看看吧。

這裡就來一個結尾吧,聽老師說,java學好了以後的工資很高,這錢肯定是香的啊,誰會去和錢作對呢!但是這前提是學好java,所以我也希望自己可以在學java的路上越走越遠吧,都選擇當程序員了,還怕什麼掉頭髮,大

不了拿一些工去植個發也行啊!平時多看看,多學習學習,不僅僅是為了過這門學科,也是為以後的工作打基礎、做鋪墊。給自己加個油!