一.前言
第七次作業
-
- 涉及的知識點:這次的題目集是在上一次題目集的基礎上增加了多個並聯串聯在一起的情況,並且也考慮了一條串聯電路中包含其它串聯電路的情況,同時在這次題目集中新增了裝置:窗簾(它的狀態與亮度有關,這就需要我們考慮接入電路中的燈泡狀態),互斥開關(包含三個引腳,同時這三個引腳的接入電路的順序也有多種情況)
-
- 題量:本次作業的題量和上一次相同
-
- 難度:比上一次難一點
第八次作業
-
- 涉及的知識點:這一次的大作業是這個學期的最後一次大作業,這次作業它又是在上一次的基礎上增加一些功能和裝置,增加的功能:可以是並聯裡面包含並聯,同時這次的作業還需要輸入每個裝置的兩個引腳的電壓,增加了裝置的額定電流,短路的判斷,增加的裝置這次又有二極體的增加,它的接入電路中的狀態又給電路增加了新的判斷情況。
-
- 難度:最複雜的一題,細節多,程式碼量大,需要考慮的非常全面
二.設計與分析
第七次大作業
下面是幾個類
public abstract class CircuitDevice {
protected String id;
protected double voltage;
protected double current;
protected double resistance;
public abstract void updateState();
}
點選檢視程式碼
public abstract class ControlDevice extends CircuitDevice {
protected int state;
public abstract void adjustState(String command);
}
點選檢視程式碼
public abstract class ControlledDevice extends CircuitDevice {
protected double outputValue;
public abstract void calculateOutput();
}
點選檢視程式碼
public class Switch extends ControlDevice {
@Override
public void adjustState(String command) {
// 實現開關狀態調整
}
@Override
public void updateState() {
// 更新開關狀態
}
}
public class Dimmer extends ControlDevice {
private double level;
@Override
public void adjustState(String command) {
// 實現調光器狀態調整
}
@Override
public void updateState() {
// 更新調光器狀態
}
}
點選檢視程式碼
public class Light extends ControlledDevice {
private double brightness;
@Override
public void calculateOutput() {
// 計算燈的亮度
}
@Override
public void updateState() {
// 更新燈的狀態
}
}
public class Fan extends ControlledDevice {
private double speed;
@Override
public void calculateOutput() {
// 計算風扇的速度
}
@Override
public void updateState() {
// 更新風扇的狀態
}
}
點選檢視程式碼
public class SerialCircuit extends CircuitDevice {
private List<CircuitDevice> devices;
public void addDevice(CircuitDevice device) {
devices.add(device);
}
@Override
public void updateState() {
// 更新串聯電路的狀態
}
}
點選檢視程式碼
public class ParallelCircuit extends CircuitDevice {
private List<CircuitDevice> branches;
public void addBranch(CircuitDevice branch) {
branches.add(branch);
}
@Override
public void updateState() {
// 更新並聯電路的狀態
}
}
點選檢視程式碼
public class CircuitManager {
private CircuitDevice mainCircuit;
public void processInput(String input) {
// 處理輸入命令
}
public void updateCircuit() {
// 更新整個電路的狀態
}
public void outputStatus() {
// 輸出所有裝置的狀態
}
}
第八次大作業
三.踩坑心得
- 串聯和並聯電路的巢狀可能會導致電路結構變得非常複雜,難以正確計算電壓和電流,可以使用遞迴方法處理巢狀的電路結構。將每個串聯或並聯電路視為一個獨立的元件,逐層計算。
2.輸入格式複雜,包含多種型別的資訊(裝置資訊、連線資訊、控制命令等)
3.裝置狀態的更新順序可能影響最終結果,特別是在複雜電路中。
四.改進建議
- 實現一個兩階段更新機制:首先計算所有裝置的新狀態,然後統一更新。這樣可以避免更新順序對結果的影響。
- 為每種裝置型別實現一個專門的格式化方法,確保輸出符合要求。使用單元測試驗證每種輸出格式。
- 設計時考慮單元測試的需求。使用依賴注入等技術使得各個元件可以獨立測試。為關鍵的計算邏輯編寫詳細的單元測試。
五.總結
透過編寫這個家居電路模擬系統,我獲得以下寶貴的經驗
學會了如何設計一個複雜的、多層次的系統架構。
理解了模組化設計的重要性,以及如何將大問題分解成小問題。
物件導向程式設計的深入理解:
加深了對繼承、多型、封裝等物件導向概念的理解。
學會了如何利用抽象類和介面來設計靈活的類層次結構。
理解了設計模式如何提高程式碼的可擴充套件性和可維護性。
提高了解決複雜邏輯問題的能力。
掌握了格式化輸出的技巧,特別是處理不同型別資料的輸出格式。
學會了如何設計健壯的系統,能夠優雅地處理各種異常情況。