重生之我在男航學Java-1

TCxiaoli發表於2024-04-20

一、前言

  • 第一次題目集主要是讓我們熟悉對類的使用和對單一職責的理解,由於給出了設計建議,並且內部給出了具體的設計分析,第一次P他的題量大但是難度並不是很大,雖然老師說了可以使用正規表示式,但我由於自身的懶惰附加c語言程序導向的思想根深蒂固,我在第一次PTA中並未使用正規表示式,導致我使用split函式後進行if判斷實際上並未真正意義上的實現物件導向程式設計,而是仍然在程序導向程式設計,我對此深感慚愧......

  • 第二次的題目集在第一次的題目集的基礎上減少了題量,但是增加了新的試卷與答卷類,導致我不得不去學習並在其中使用正規表示式。但是仍然存在程序導向程式設計的思想,導致我即使過完了所有樣例也無法取得滿分,類之間也沒有符合單一職責的原則,類和類之間的耦合性極高。為我第三次P他的失敗埋下禍根......

  • 第三次PTA不出意外的難度很大,雖然在第二次的基礎上再次減少了題量,但是由於我對於整體框架的把控出現了的問題,以及對問題的分析出現了缺陷,使得我寫了大半的程式碼不得已進行重構,但在第二次重寫的過程中在正規表示式的使用上出現了邏輯上的錯誤導致並沒有提取到我想要的內容,使得我反覆加強了類與類之間的耦合性,導致在最後的時候我的程式碼牽一髮而動全身,程式碼的複用性極差,程式碼也未符合開閉原則,對此我做出深深的自我檢討......

  • 綜上,其實前三次的題量並不是很大,但是主要考察我們對類與類之間關係的理解,以及在設計時是否滿足了面向對向設計的原則,否則每一次PTA都意味著重新設計設計一次程式碼,以及由於c語言留下的壞習慣,喜歡邊寫邊過樣例,而這在物件導向的程式設計中顯然使行不通的,物件導向原則上就是對整體框架的把握以及對類間關係的設計,我在接下拉的PTA中一定會將實踐與duan老師所講的思想融會貫通,做到“知行合一”!

二、設計與分析:

  • 答題判題程式-1

  • 從這張類圖可以看出我的類雖然按照設計建議定義了3個類,但是真正起作用的只有Paper和Topic類,其中Main類的實現如下:

  • 從Main類不難看出我的設計存在嚴重缺陷,程式碼的複用效果極差,因為採用的使if的多次判斷以及使用split對其進行分割,並未將物件導向的思想融入其中反而延續了c語言程序導向的思想,並且其中類也沒有嚴格按照單一職責原則進行設計。使得我即使在題目集一中拿取了較高的分數,但在第二次題目集中仍需對程式碼進行重構,加大自己的工作量,踩了沒必要踩的坑,正如duan老師所言,有的坑踩了也沒什麼收穫,只是讓我多浪費了一些時間罷了。

  • 答題判題程式-2

  • 從這張圖中,我們可以看到由於第二次新增了試卷資訊導致我的程式碼不得不進行重構,由此體現了我的第一次程式碼存在的極大問題,以及對開閉原則的完全忽視,但在第二次題目集中,我仍然存在單一職責設計存在缺陷,三個了類之間的耦合性極強,Paper類中同時使用了Topic類和Answer類,最後透過Main類來進行實現,因為對正規表示式解析的忽視,應該對正規表示式再進行一個類的設計,專門來進行正規表示式的解析,使得我的程式碼即使過了全部樣例仍然存在一定的缺陷,例如:題目空格過多時正規表示式的解析錯誤。當然,最主要還是因為我一邊寫程式一邊過樣例的壞習慣使得我的程式碼的複用性極差,一旦迭代就要進行重構。其中Main類的實現如下:

  • 再Main類中不難看出我在Main類中實現了大量的方法,其中包括但不限於結果的列印以及對正規表示式的判斷,程序導向程式設計的結果就是我在第三次題目集中難以對程式碼進行最佳化,需要程式碼再次重構,以及我對單一職責的理解仍然不夠深刻,難以運用其中。
  • 答題判題程式-3

  • 在這第三次題目中,由於前面造的孽,導致我第三次寫的程式碼仍需重構,這次我專門使用了Print類來進行對結果的列印以及Judge類來對題目的對錯進行判斷,但由於對總分的設計存在缺陷使得我在Print類中去實現對總分的計算,大大增加了Print類與Paper類的耦合性,其次由於缺少對正規表示式專門解析的類使得我仍Main中使用了對其進行split分割和if判斷的處理,其中Main類的實現如下:

  • 其中Main主要就是實現了對正規表示式的解析,但由於解釋式存在一定的邏輯錯誤使得我在過樣例時出現了無法識別格式錯誤的問題,此外Print類中實現了本應該由其他類實現的大量方法,究其原因是因為我對結構的把控實在太弱,導致我的方法不得不改變位置,其中Print類的實現如下:

  • 在Print類中實現了本應該由Judge類實現的方法,同時由於結果的優先性考慮出現了問題是使得我的Print類中的方法使用了多次if來進行判斷。

  • 綜上,在最開始的時候只是單純的用Topic[]來儲存Topic,由於第二次增加了試卷類和答卷類,開始考慮對試卷類和答卷類也進行Paper[]和Answer[]的儲存,這就導致我第二次出現了無法匹配試卷和答卷的情況,於是在第三次的資料儲存中選擇使用 HashMap<Integer,Topic>,HashMap<Integer,Paper>,HashMap<Integer,Answer>方便我對試卷和答卷的匹配以及試卷和題目的匹配。

三、採坑心得:

  • 答題判題程式-1

  • 其中的非零返回是由於正規表示式使用過程中出現了多個空格,我的正規表示式卻沒有對應的匹配模式導致group捕獲失敗而造成的非零返回

  • 修改之前的正規表示式如下:

  • 修改之後的正規表示式如下:

  • 修改之後的得分如下:

  • 答題判題程式-2

  • 由於最開始是一邊過樣例一邊進行的程式設計的書寫,從而導致自己忘記了要對答卷和題捲進行匹配。

  • 更改後如下:

  • 增加的對答卷和題卷的匹配如下:

  • 答題判題程式-3

  • 從類圖來觀察不難看出我的第三次設計結構框架存在很大的問題,導致了我最後前面忘記了對正規表示式的邏輯錯誤進行更改,由於類與類之間的耦合性實在太強,導致我對此錯誤不知如何下手,可謂是牽一髮而動全身體啊,嗚嗚嗚~~~~

  • 由於我在判斷答案是否存在之前就對題目進行了刪除,導致了在判斷題目是否存在之前就對其進行了刪除,而題目不存在的優先順序高於題目被刪除,我對此進行了以下修改:

  • 我在對Judge類進行初始化時對topicHashMap進行了clone,這樣即使他被刪掉了一個題目,我也可以透過clone出來的topicHashMap1結合if語句對優先順序進行判斷

四、改進建議:對相應題目的編碼改進給出自己的見解,做到可持續改進

  • 答題判題程式-1

  • 對此處正規表示式的設計專門用一個類來進行處理,使得其更符合開閉原則

  • 答題判題程式-2

  • 把以上對答卷總分的判定,題卷是否為空,以及對答卷和題卷的匹配全部寫入一個Judge類中,避免在Main類中實現過多的方法

  • 答題判題程式-3

  • 對答案的判斷將其結果專門存入答卷的一個列表中,避免對if/else的重複使用而導致程式碼的冗雜

  • 對學生判斷是否存在的方法放入Judge類中,遵守單一職責原則,避免Print類中存在太多的其它方法而違背此原則

  • 將該正規表示式進行更改使其匹配時將#Q也匹配進去,便於後續對於題目格式問題的判斷,否則在我框架出現大問題的前提下無法透過樣例而得不到分,嗚嗚嗚~~~

五、總結

1.對於正規表示式的學習

  • 處於題目的需要,使我不得不進行對於正規表示式的學習,透過對正規表示式的學習,讓我能夠更加高效的處理特殊的字串,同時提高了自己的自主學習能力,邊學邊用,使我對正規表示式的熟練度迅速提升。

2.物件導向的設計原則

  • 前面的學習使我認識到了物件導向設計原則對程式碼的重要性,它提高了程式碼的複用性以及可擴充套件性,雖然我在實際寫題目的過程中對其的使用糊里糊塗,但三次題目我重構了三次程式碼讓我意識到了物件導向原則積極遵守的好處,我在後面的題目集中一定仔細審題,合理的對類進行設計,好的設計往往能夠減少自己的工作量。

3.對於整體的設計問題

  • 在第三次題目集中我延續了前倆次的邊過樣例邊寫題的不良習慣,使得我的類與類之間的耦合性極強,同時還出現了相當多的邏輯錯誤,對方法先後呼叫順序的思考,導致了我第三次PTA甚至連樣例都無法全部透過,其中對資料存貯的問題也是先後更改了多次,下次在寫之前我一定要將整體的大框架透過PdShell先搭建出來,避免再出現和這次一樣初次嚴重的錯誤。

4.其它(此處為一些個人感概,老師或助教可以考慮對其跳過)

  • a.對於最後一道題的分數設定我覺得未免有些太過高,使得如果最後一道題不做好的話就會導致P他的分數很難看,對學生而言是一種打擊,但換個方式來說,其實也是對學生的一種激勵手段,但我還是懇請cai老師手下留情,嗚嗚嗚~~~

  • b.對於物件導向設計這門課,我覺得完全可以直接放在大一上學期進行學習,c語言程序導向程式設計的思想使我(不知還有多少人...)陷入了先入為主的思想危機,導致在最開始寫題目時老是會使用程序導向的思想進行物件導向的設計,使得即使做出來題目也僅僅是為了得分,而不是真正意義上的學會物件導向的設計和思想,此外,我校軟體工程專業主流的語言是Java,我覺得c語言的學習完全沒有必要(也不是完全意義上的沒必要,只是感覺現在根本用不到了),我瞭解一些學校是從大一上學期就直接學習Java不學習c語言的同專業學生,我認為我們這麼做也不是不行。

  • c.duan老師雖然老是說自己講的不好,實則是對自己過分的謙虛了(嘿嘿)。duan老師物件導向設計這門課是我大學以來聽得最認真的一門課了(儘管我的PTA有時寫的跟垃圾一樣),duan老師對於這個行業以及這個專業的理解讓我真正學到了一些東西,不止是技能上的,包括思維上和認知的提高,我覺得段老師說的有些話很有道理,比如“困難前移”這個觀點我對此非常推崇,在如今的社會想要不被淘汰就得適應規則,對於“困難牽前移”,儘管在平常的PTA中讓我們欲仙欲死,但是在大學這個試錯成本最低的時間段,如果連這都適應不了,很難想象以後在這個行業中該如何生存下去。duan老師帶我們提前體驗了了以後工作中會遇到的困難,以後在工作中想必會輕鬆一點。另外,我還想對自己說

菜就多練!

相關文章