因為疫情的緣故,一眨眼的功夫,這個學期就已經臨近尾聲了。此學期的課程也都由於這場不可避免的災害而受到影響,我們的學習也由以往的線下互動教學,變成了長達三四個月的網課教學。這自然是有利有弊的,利的一面是,我們可以更為輕松地學習,可以將一些線下學習所必須的出行等瑣碎時間全部省去,更為自如的分配自己所有的時間;弊的一面是,因為僅是通過網絡相連,老師無法真正地考察到同學們的學習進展,無法切實的了解到學生們的學習困惑。而同學們也因為這些原因,在進行網上教學的同時,更重要的是自己的自學效率,這也是對自己自學能力的一種檢驗。
自從進入大學,接觸了解了程序編程的入門知識,對編程就有了濃厚的興趣,興趣是最好的老師。有了這名“老師”,即使在學習過程中碰到過很多困難,也能努力克服。大一開設了C語言學習,這是一門面向過程的語言,不過那時的我還沒能了解過什么事面向過程和面向對象,直到這個學期我開始學習了面向對象程序設計。這正是一個學習中的遞進關系,由局部到整體。
剛開始學習這門課程,我並沒有一個面向對象程序設計的概念,我只當是在學習一門新的編程語言。Java算是我學習的第二門語言,卻也可以看出編程語言之間的的很多的相似性和更多的差異性。萬事開頭難,在經歷了大一初次學習編程語言艱難的理解之路后,Java的語法又與C語言語法挺類似,這一次的進階學習也就相對輕松了一點點,至少一些基礎語法理解方面的是這樣的。
前兩次作業還是在以面向過程的理念去教學,以我們最熟悉也最擅長的過程思想先去適應Java這門語言,在一個類中通過構造方法,僅用一個類去實現一些最簡單基礎的功能,這時的我還認為Java與C並無大區別;緊接着的幾次作業,題目更為復雜,也逐漸開始給出類圖,從模仿做起,根據類圖去模仿去構造,理解了類中的屬性方法,了解了不同類之間的聯系,慢慢感受到了兩種語言之間的區別;在最后幾次作業,開始更多樣的去接觸Java的的封裝、繼承、多態,嘗試自己去設計類圖,去以面向對象的思路邏輯去設計類圖,分析和設計類與類之間的關聯。
漸漸地在一次次大作業練習中,老師逐漸過渡的教學中,自己也體會到了他們之間最大、最本質的區別:C語言是最接近硬件的,是注重程序運作“過程”和程序與硬件如何結合的語言;而Java卻是相對遠離硬件的,只需專注於面向對象,專注於功能邏輯的開發設計。不管是學習哪一種語言,都要以這個語言自身的特點去做文章,這也是這門課程會選擇以Java去教學的主要原因吧。面向對象程序設計首先要讓我們理解和貫徹的是這種面向對象的設計思想,我們不再是去考慮桌子椅子是由木頭怎么構成的,而是去宏觀的思考桌子椅子是怎么組成一間房子的,更多的是去作為一個組裝設計師,而不是元件設計師。
Java具有封裝性和繼承性,這使得在Java中,只要是你能想到的功能,它都可以找得到相應的“包”,其中有它自己的各種各樣的類與方法。在Java中一切皆為對象,我們需要做的不是去構建對象,而是將這一個個現成的對象編織成一張網,利用它們自我屬性所特有的方法相互貫穿調用,去搭建我們所需要實現的功能。
為了提高程序的獨立性和復用性,在進行面向對象程序設計的時候,我們需要遵從一些必要的基本原則,它們所帶來的好處也是我在實踐過程中深有體會到的。例如最基礎也是最重要的“單一職責原則”,指的是一個類最好只有一個職責可以使其改變,其實就是一個類只專注於一件事。職責變得單一了,這樣提高了類的獨立性和可擴展性。如果我要設計一個狼吃羊,羊吃草的程序,僅將“吃”這一個動作作為一個職責一個類,那么不管寫什么有關“吃”這個動作的程序,都可以反復的只調用這一個類,在其基礎上去做拓展來適配自己的程序,這不就是提升了類的可覆用可拓展性嘛。開閉原則也是我自己在寫代碼時深有感觸的,它指的是對修改關閉,對拓展開放。在程序設計中,我們經常會面臨一些功能的修改和拓展,這時我們需要在已有程序上面進行“更新”,由於Java語言繼承關系的特性,子類會繼承父類的屬性和方法,在我們想要更改功能的時候,最好是去拓展子類,而並不去修改父類,這就是開閉原則。還是那個“吃”的動作,我想在這個基礎上新增加一個“喝”,如果我直接將“吃”這個類修改,那么這個“吃”類的所有子類都會受到影響,那樣的維護工作太大了,所以是不可行的,正確的操作應該是繼承此類然后做拓展。面向程序設計還有很多應該遵守的原則,不過我的接觸還不深,在以后的學習中也許會更為理解。
在這為期一個學期的學習中,加上這次一共做了三次課程Plog,自己在寫的過程中思考和感受到的成長是最多的。從一開始懵懵懂懂的不太理解,到現在能理解一些理念的東西了,雖然也還只是接觸了一些皮毛。思路由一開始的照葫蘆畫瓢,變得可以自己思考和設計。對於程序的設計,由一開始完全的平面構思,慢慢的立起來了,變得更加的立體,有自己的層次結構。
一門課程的結束就是下一門課程的開始,老師能教的是有限的,自己的探索學習是無限的,學習是伴隨一生的事情。