第三階段兩次PTA作業總結

HULia發表於2024-06-29

一、前言

PTA作業已經進入第三階段,第三階段為"家居強電電路模擬程式-3"和"家居強電電路模擬程式-4"的迭代

這兩次的PTA作業第一次為“家居強電電路模擬程式-3” ,他是以前兩次家居強電電路模擬程式為基礎所擴充套件的,在"家居強電電路模擬程式-2"的基礎上增加了一個新的控制裝置,互斥開關,互斥開關設定了限流電阻,12引腳之間預設電阻為5,13引腳之間預設電阻為10,還增加了一個新的受控裝置,受控窗簾,受控窗簾的電路符號為S,其最低工作電壓為50V,電壓達到或超過50V,窗簾即可正常工作,不考慮室外光照強度和室內空間大小等因素,窗簾受室內燈光的光照強度控制,且本次迭代考慮多個並聯電路串聯在一起的情況;

第二次作業為“家居強電電路模擬程式-4”,在“家居強電電路模擬程式-3”的基礎上了管腳電壓的顯示(在輸出每個電器的狀態資訊後,再依次輸出該電器每個管腳的電壓)、電流限制(電器在工作時,過大的電流會引起電器過熱,從而燒壞電路。本次迭代,每個元器件都有最大電流的設定,當實時電流超過最大電流時,在該電器輸出資訊的最後加入提示“exceeding current limit error”,與前面的資訊之間用英文空格分隔)、短路檢測(如果電路出現無窮大的電流造成短路,所有元器件資訊不輸出,僅輸出提示“short circuit error”)、並聯電路中包含並聯,並增加了二極體元件,其電路特性為:正向導通,反向截止;其電器符號如圖4所示,當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。


二、設計與分析

接下來,我將會對這兩次的作業進行分析。

1、家居強電電路模擬程式-3

以下是程式碼的類圖
image

這次的程式碼我重新設計了類結構,所以我重新分析一下類結構

由以上類圖可知,定義了一個裝置基類 (Device),Device 是一個抽象類,定義了所有裝置的基本屬性和行為。
它的屬性有:
id:裝置的唯一識別符號。
pins:裝置的引腳陣列,用於儲存每個引腳的電壓。
方法:
getOutputVoltage(int pin):獲取指定引腳的輸出電壓。
setInputVoltage(int pin, double voltage):設定指定引腳的輸入電壓。
updateState(String command):根據命令更新裝置狀態。
getState():獲取裝置當前狀態。

控制裝置類

開關 (Switch):
繼承自 Device。
屬性:state(開關狀態,true 表示開,false 表示關)。
方法:實現 Device 的抽象方法,處理開關狀態的切換。
分檔調速器 (SteppedSpeedController):
繼承自 Device。
屬性:currentStep(當前檔位),steps(檔位對應的輸出電壓倍數)。
方法:實現 Device 的抽象方法,處理檔位的增減。
連續調速器 (ContinuousSpeedController):
繼承自 Device。
屬性:position(當前位置,範圍 [0.00, 1.00])。
方法:實現 Device 的抽象方法,處理位置的設定。
互斥開關 (MutexSwitch)
繼承自 Device。
屬性:activePin(當前啟用的引腳),resistances(引腳間的電阻)。
方法:實現 Device 的抽象方法,處理互斥開關的狀態切換。

受控裝置類

燈 (Light):
抽象類,繼承自 Device。
屬性:brightness(亮度)。
方法:定義抽象方法,由具體燈型別實現。
白熾燈 (IncandescentLight):
繼承自 Light。
方法:實現 Light 的抽象方法,計算白熾燈的亮度。
日光燈 (FluorescentLight):
繼承自 Light。
方法:實現 Light 的抽象方法,計算日光燈的亮度。
風扇 (Fan):
抽象類,繼承自 Device。
屬性:speed(轉速)。
方法:定義抽象方法,由具體風扇型別實現。
吊扇 (CeilingFan):
繼承自 Fan。
方法:實現 Fan 的抽象方法,計算吊扇的轉速。
落地扇 (FloorFan):
繼承自 Fan。
方法:實現 Fan 的抽象方法,計算落地扇的轉速。
受控窗簾 (ControlledCurtain):
繼承自 Device。
屬性:openPercentage(窗簾開啟的百分比)。
方法:實現 Device 的抽象方法,計算窗簾的開啟百分比。

電路類

串聯電路 (SeriesCircuit):
繼承自 Device。
屬性:devices(串聯的裝置列表)。
方法:實現 Device 的抽象方法,處理串聯電路的電壓傳遞和狀態更新。
並聯電路 (ParallelCircuit):
繼承自 Device。
屬性:seriesCircuits(並聯的串聯電路列表)。
方法:實現 Device 的抽象方法,處理並聯電路的電壓傳遞和狀態更新。

主類 (Main)
方法:
addDevice(Device device):新增裝置。
addCommand(String command):新增命令。
processCommands():處理命令列表,更新裝置狀態。
simulate():類比電路執行,輸出裝置狀態。
inputProcess():處理輸入。

這次的類結構設計具有模組化,每個裝置和電路都有獨立的類,便於擴充套件和維護,可以方便地新增新的裝置型別和電路型別。但是處理輸入的方法在主類中比較複雜,且未對輸入進行充分驗證,可能導致執行時錯誤。

2、家居強電電路模擬程式-4

以下是程式碼的類圖
image

透過類圖可以知道,修改了Device、Switch、SeriesCircuit、ParallelCircuit四個類,並增加了二極體(Diode)。

此次迭代增加了管腳電壓的顯示:在 simulate 方法中,輸出每個電器的狀態資訊後,再依次輸出該電器每個管腳的電壓,並在 simulate 方法中,計算每個電器的實時電流,如果超過最大電流,則輸出“exceeding current limit error”。

增加短路檢測:在 calculateCurrent 方法中,如果檢測到無窮大的電流,則輸出“short circuit error”。

增加並聯電路中包含並聯:在 ParallelCircuit 和 SeriesCircuit 類中,處理並聯電路中包含並聯電路的情況。

增加二極體:增加 Diode 類,處理二極體的正向導通和反向截止特性。

以下是經過修改以及增加的類:

抽象類(Device)
作為所有電器裝置的基類,提供統一的介面和屬性。
屬性:
id:裝置的唯一識別符號。
pins:裝置管腳的電壓陣列。
maxCurrent:裝置的最大允許電流。
方法:
getOutputVoltage(int pin):獲取指定管腳的輸出電壓。
setInputVoltage(int pin, double voltage):設定指定管腳的輸入電壓。
updateState(String command):根據命令更新裝置狀態。
getState():獲取裝置當前狀態。
getPins():獲取裝置所有管腳的電壓。
getMaxCurrent():獲取裝置的最大允許電流。

開關 (Switch):
繼承自 Device。
屬性:state:開關的狀態,true 表示開啟,false 表示關閉。
方法:
getOutputVoltage(int pin):根據開關狀態返回輸出電壓。
setInputVoltage(int pin, double voltage):設定輸入電壓。
updateState(String command):根據命令更新開關狀態。
getState():返回開關狀態。

二極體(Diode):
繼承自 Device。
屬性:conduction:二極體的導通狀態,true 表示導通,false 表示截止。
方法:
getOutputVoltage(int pin):根據導通狀態返回輸出電壓。
setInputVoltage(int pin, double voltage):設定輸入電壓並更新導通狀態。
updateState(String command):不需要更新狀態。
getState():返回二極體的導通狀態。

串聯電路(SeriesCircuit):
繼承自 Device。
屬性:devices:串聯電路中的裝置列表。
方法:
getOutputVoltage(int pin):計算並返回串聯電路的輸出電壓。
setInputVoltage(int pin, double voltage):設定串聯電路中所有裝置的輸入電壓。
updateState(String command):更新串聯電路中所有裝置的狀態。
getState():返回串聯電路中所有裝置的狀態。

並聯電路(ParallelCircuit):
繼承自 Device。
屬性:seriesCircuits:並聯電路中的串聯電路列表。
方法:
getOutputVoltage(int pin):計算並返回並聯電路的輸出電壓。
setInputVoltage(int pin, double voltage):設定並聯電路中所有串聯電路的輸入電壓。
updateState(String command):更新並聯電路中所有串聯電路的狀態。
getState():返回並聯電路中所有串聯電路的狀態。

整體來看,這個程式比之前的答題判題程式有了明顯改進,但是還是不夠好,對類結構設計也還只是學到了皮毛,並不能真正滿足需求,但每次都進步一點,就會越來越好!


三、踩坑心得

在進行類結構設計與寫程式碼時,我遇到了許多問題,也從中吸取了許多教訓。以下是我的一些踩坑心得:

1、抽象類與具體類的邊界:在設計抽象類 Device 時,我最初嘗試將所有可能的方法和屬性都放入抽象類中,導致抽象類變得臃腫,難以維護。

2、多型性與方法實現:在具體類中實現抽象方法時,我最初沒有充分考慮多型性的優勢,導致一些方法在不同具體類中的實現相似度很高,程式碼重複。

3、電路類的遞迴設計:在設計 SeriesCircuit 和 ParallelCircuit 類時,我最初沒有考慮到遞迴包含其他電路的情況,導致在處理複雜電路時邏輯混亂。

4、考慮未來的需求:在設計類結構時,要考慮到未來的需求,為可能的擴充套件留下空間。例如,我可以為處理不同題型的類留出擴充套件點,以應對未來的題目變化。

5、不斷學習和改進:在設計類結構時,我意識到自己的能力還有很大的提升空間。我需要不斷學習,瞭解更多的設計模式和原則,以便在遇到問題時能夠更好地解決問題。


四、改進建議

1、使用抽象類:定義清晰的抽象類,可以讓更容易地擴充套件新的題型或裝置。當需要新增新功能時,可以直接建立一個新的子類,而不用修改現有的類。

2、降低耦合度:儘量減少類之間的依賴關係,比如定義一個控制類Control或管理類Agent這樣可以更容易地修改和維護程式碼。

3、程式碼複用:儘量程式碼複用,這樣可以減少程式碼冗餘,並使程式碼更加清晰。

4、學習和應用設計模式:這一點很重要,瞭解並應用設計模式,可以幫助解決常見的設計問題,並提高程式碼的可維護性可擴充套件性

5、除錯程式碼:學會使用除錯工具,如斷點除錯、日誌輸出等,可以幫助更快地找到並修復錯誤。


五、總結

在本次PTA作業的第三階段,我們迎來了“家居強電電路模擬程式-3”和“家居強電電路模擬程式-4”的迭代。這兩個階段的專案在類結構設計、功能實現和使用者體驗方面都有了顯著的提升和擴充套件。

在“家居強電電路模擬程式-3”中,我們重新設計了類結構,引入了裝置基類(Device)、控制裝置類、受控裝置類和電路類。這樣的設計使得裝置和電路的模組化更加明顯,便於擴充套件和維護。然而,輸入處理方法在主類中較為複雜,且未對輸入進行充分驗證,可能導致執行時錯誤。

在“家居強電電路模擬程式-4”中,我們對之前的類結構進行了修改和擴充套件,增加了管腳電壓顯示、電流限制、短路檢測和二極體等新特性。這次迭代使得程式在功能上更加完善。

在整個過程中,我遇到了許多問題,也從中吸取了許多教訓。比如,在設計抽象類時,我意識到需要保持其簡潔性,避免過於臃腫;在實現多型性時,我學會了如何充分利用抽象類和具體類之間的關係;在設計電路類的遞迴結構時,我意識到了遞迴的重要性和處理複雜邏輯的方法;在考慮未來需求時,我學會了為可能的擴充套件留下空間;在不斷學習和改進的過程中,我意識到了設計模式和原則在解決問題和提高程式碼質量方面的重要性。

總的來說,這幾次PTA作業讓我對類結構設計有了更深入的理解和實踐。雖然還存在很多不足,但我相信隨著不斷的學習和實踐,我會越來越好。

相關文章