一、前言
在這個學期即將迎來尾聲的時候,這個階段的大作業也迎來了最後的兩個迭代大作業,而本次部落格就將圍繞這兩個迭代大作業講述
二、設計與分析
這兩次的迭代作業的類設計其實沒有很多的變化,只不過根據題目要求新增了互斥開關和受控窗簾,二極體這幾個類,其中互斥開關是控制器的子類,受控窗簾屬於裝置的子類,二極體屬於儀器類的子類。
因為受控窗簾的窗簾開放程度的引數是根據整個系統的光照強度設定的,所以我寫了一個方法在整個電路都執行了之後再根據電路中所有的燈的亮度對這個窗簾的開放程度進行調整。
而針對互斥開關的內部細節操作,我則是設定了一個變數port,用來表示該互斥開關開關搭在哪一個引腳上,當port為2時,電流傳進引腳二,當port為3時,電流傳進引腳三,port為一時,則傳進引腳一,這也是針對當引腳二和引腳三都在引腳一前面的情況。而二極體則是當引腳二在前的時候,該二極體反接,電阻無限大。
下面兩張圖分別是前一次部落格和這一次部落格時SourceMonitor的分析報告
從圖片上可以看出來,在兩次的程式碼的檔案數量增多了4個,因為除開了上面講到的三個類之外,還有一個窗簾的抽象類,作為受控窗簾的父類。
而在程式碼行數上,從688行到984行,多了大約三百行的樣子,主要是第八次大作業的修改多了一些,在引腳的接入方向從以前除了互斥開關可能會存在引腳1在同元件後,變成了所有元件的引腳1與引腳2的順序都可能隨機,這點會在踩坑心得中詳談。並且在輸出資訊方面,多加了輸出元件所有的引腳的資訊這一點,這點也使我修改了不少,雖然在我之前寫的程式碼當中是會將電壓透過傳參的方式傳遞經過所有的元件,但是在最後這一次大作業上卻沒能做到完成該題所有的要求,仍然存在一些錯誤。
而在註釋佔比上也相較於上一次有一點提升,從8.4到9.2說明我也已經慢慢養成了在寫程式碼時為程式碼註釋的習慣了,不過這方面還仍需要提高。
而這個最大的複雜度仍然是根據元件首字母建立相應類的物件的那個方法,該方法使用了switch語句。
三、踩坑心得
在最後一次大作業中因為同一個元件的引腳的先後順序可以不同,比如引腳2可以出現在引腳1的前面,這點對於我寫的程式碼的影響還是偏大的,因為最初我在設計類的時候擔心可能之後會有元件的兩個引腳不會以1或2的編號命名,或者同一條電路中的引腳順序不會按照連線的順序輸入,這會對連線電路的那個方法造成一定的影響,所以我就在引腳類中新增了一個布林型別的引數isInputPort,用於表示該引腳是不是輸入端的引腳並且在建立這些引腳的時候就對這些引腳的inputPort引數進行了設定,但這一次的大作業中這一種輸入模式打破了我原本的寫的模式,所以我不得不對原有程式碼進行比較多的修改,並且在這一次的大作業中我刪除了isInpuPort這一個引數,畢竟這一次輸入模式的較大改變,我也不得不對這種設計進行修改。這也讓我明白在給類新增引數之前應該要先思考該引數是否合理,是否符合應用。
在前幾次大作業中,因為我給引腳類新增的inputPort這個引數,所以我在第三次大作業新增了互斥開關時為了應對出現引腳1在引腳2,3後的情況,我還寫了一個方法用於對這種情況下的三個引腳的isInputPort這個引數進行修改,但在這一次大作業之後我就反思,在寫第三次大作業的時候也許我就應該刪除掉這個引數了,這也是我的疏忽點。
四、總結
在這一階段的大作業中,我對於Java中的繼承和多型的使用更加熟練了,繼承和多型的使用使得整個程式碼更加具有靈活性,並且這提高了程式碼的重用性,當我使用繼承的時候就可以避免寫過多相同的方法,並且多型的使用也提高了我程式碼的簡潔性,就比如我這個程式碼中的CircuitMember類作為電路元件的父類,在使用連結串列的時候範型我可以直接寫成LinkedList<CircuitMember>,這樣就可以儲存所有的電子元件物件了,而不用為所有的類的物件都新建一個新的連結串列,並且這樣的形式,我也不用額外寫一個排序方法了,只需要為CircuitMember類實現Comparable介面的compareTo方法就可以了。
但是雖然繼承和多型雖然好用,但是並非什麼情況都可以用,還是得根據實際情況使用,並且在使用繼承的時候父類的設計就要更加的謹慎了,因為其子類越多,修改父類的一處地方法後,有時就會涉及到很多類的修改,這樣對於修改程式是一個災難,所以繼承雖然優點多,但也不能無腦使用,還是得在滿足了“是一種的”的條件後使用才是對的。
在類的引數變數的新增上應該要思考該引數的存在是否合理,是否符合要求,是否不會造成程式碼的效率變差。