一、前言

1. 核心知識點 

  • 編程實現:正則表達式解析文本(元件、引腳、輸入信號),Map/List/Queue 等數據結構管理元件與信號,面向對象編程(封裝元件屬性與行為、繼承多態拓展元件類型),信號傳播的迭代模擬邏輯,自定義排序規則實現結果輸出。
  • 電路原理:第一次覆蓋與、或、非、異或、同或 5 類基礎門電路的邏輯規則;第二次新增三態門、譯碼器、數據選擇器、數據分配器 4 類元件,涉及控制引腳、輸入輸出引腳的分類管理及不同元件的有效工作條件與輸出規則。

2. 題量與難度 

  • 兩次均為單道綜合編程題,第二次在第一次基礎上拓展元件類型(5 類→9 類)、引腳規則(新增控制引腳分類)、輸出格式(譯碼器 / 數據分配器特殊輸出),代碼量與邏輯複雜度顯著提升,難度從基礎門電路模擬升級為複雜數字元件的綜合系統模擬。

 

二、設計與分析

1.源碼量化分析

  • 核心指標對比

度量指標

第一次題目

第二次題目

變化核心原因

代碼總行數

277

553

新增三態門、譯碼器等 4 類元件,補充引腳分類、特殊輸出邏輯

類數量

3

13

採用 “抽象基類 + 子類” 分層設計,拆分不同元件封裝邏輯

最大方法複雜度

12(Gate.calculateOutput()

39(Main.main()

需兼容 9 類元件的解析、信號傳播及差異化輸出規則

代碼最大嵌套深度

8

9+

元件類型判斷、引腳分類匹配等分支嵌套增加

註釋佔比

0%

0%

未添加功能性、邏輯性註釋

數電1:

《數字電子技術課程設計》課程筆記(五)————調試總結_封裝

第一次題目複雜度集中在Gate.calculateOutput(),僅處理基礎門電路的分支邏輯,代碼層級較淺(最大深度 8)。

 

數電2:

《數字電子技術課程設計》課程筆記(五)————調試總結_子類_02

 

 

第二次題目Main.main()複雜度飆升至 39,因需處理元件解析、引腳分類、特殊輸出等多分支邏輯;代碼深度達 9+,反映嵌套層級增加。

 

2.代碼結構設計分析

(1) 第一次作業:扁平式封裝

《數字電子技術課程設計》課程筆記(五)————調試總結_子類_03

 


 

      分析:該架構僅包含MainGateGateType3 個類:

  • Gate類集中封裝所有門電路的屬性(輸入引腳、輸出值)與行為(calculateOutput()計算輸出),通過GateType枚舉區分 5 類基礎門電路;
  • 所有邏輯以硬編碼分支實現,新增元件需修改Gate類的switch邏輯,擴展性差;
  • 未區分引腳類型,僅用Map管理輸入,無法適配複雜元件的控制邏輯。

 

(2) 第二次作業:抽象分層架構

《數字電子技術課程設計》課程筆記(五)————調試總結_引腳_04

 

  

 

 

分析:該架構採用抽象基類 + 子類多態設計:

  • 抽象Component類定義通用方法(calculate()getOutputString()),封裝輸入 / 輸出引腳管理;
  • 新增Pin類區分引腳類型(控制 / 輸入 / 輸出),貼合數字電路語義;
  • 派生BasicGate(基礎門電路)、ComplexComponent(譯碼器 / 分配器)等子類,各自實現專屬邏輯。
  • 優勢:新增元件僅需擴展子類,符合 “開閉原則”,適配控制引腳、特殊輸出等複雜規則。

 

3.設計心得

  1. 抽象設計適配擴展:從 “扁平封裝” 到 “抽象基類 + 子類”,代碼從 “硬編碼” 轉向 “多態擴展”,能低成本適配元件類型、引腳規則的新增需求;
  2. 量化工具暴露問題:SourceMonitor 的複雜度指標直接指出Main.main()的 “臃腫” 問題,需拆分輸入解析、信號傳播等邏輯;
  3. 語義化封裝提升可讀性Pin類對引腳類型的封裝,相比第一次的 “數字編號 + 布爾值”,更貼合電路語義,降低理解成本;
  4. 待優化點:補充註釋、拆分高複雜度方法、完善異常處理,進一步提升代碼可維護性。

4.課堂測驗分析

4.1 答題概況

測驗覆蓋判斷、單選、多選、填空四類題型,整體正確率較高,但存在 5 類核心錯誤,集中在語法細節、概念理解、版本特性等維度。

4.2 核心錯誤拆解

  • 語法細節:誤記 int 佔 2 字節(實際 4 字節)、包聲明(package myPackage;)/ 編譯命令(javac Hello.java)格式錯誤;
  • 概念理解:異常處理核心是 “捕獲” 而非 “識別”,數組非 3 倍數元素累加結果計算錯誤;
  • 版本特性:未掌握 Java 8 + 接口可定義默認 / 靜態方法,誤判 “接口僅含抽象方法”;
  • 邏輯分析:對象類型轉換規則理解偏差,認為父類對象可強制轉為子類對象;
  • 語法規範:String 常量池機制、構造方法調用格式理解淺層化。

4.3 錯誤根源

  • 基礎語法細節記憶不精準,缺乏實操驗證;
  • 核心概念(如類型轉換、異常處理)僅字面記憶,未理解底層邏輯;
  • Java 版本特性更新不及時,代碼邏輯分析能力不足。

4.4 改進方向

  • 整理語法規則清單(編譯命令、包聲明等),結合實操強化記憶;
  • 編寫測試代碼驗證類型轉換、常量池等難點;
  • 學習 Java 8 + 接口新特性,手動梳理循環 / 條件判斷執行流程。

三、採坑心得

1. 踩坑點

(1)代碼耦合嚴重,擴展難:

  問題:把所有元件邏輯堆在一個Gate類裏,用if-else區分類型,引腳僅用普通Map存儲(無輸入 / 控制 / 輸出區分)。新增三態門時,需大幅修改核心邏輯,還會混淆控制引腳和普通輸入,導致測試輸出錯誤

// 單一類耦合所有邏輯
class Gate {
    String type;
    Map<Integer, Boolean> inputs; // 無引腳類型區分
    // 所有元件計算邏輯擠在一個方法裏
    public void calculate() {
        if (type.equals("AND")) { /* 與門邏輯 */ }
        else if (type.equals("OR")) { /* 或門邏輯 */ }
        // 加新元件需改此處,易出錯
    }
}

改進:採用 “抽象基類 + 子類” 架構,用 Pin 類區分引腳類型,抽象出通用的Component基類封裝引腳校驗等通用邏輯,每個元件單獨寫子類,新增元件只需寫子類,無需修改原有代碼:

《數字電子技術課程設計》課程筆記(五)————調試總結_封裝_05

 

(2)信號傳播無序,計算出錯:

  問題:按 “線性遍歷” 計算所有元件,忽略元件間的輸入依賴(比如先算與門,再算給它供輸入的非門),導致 測試用

例因 “輸入未就緒” 輸出空值: 

for (Gate gate : allGates) {
    gate.calculate(); // 依賴未滿足就計算,易出錯
}

改進:用 “隊列” 實現異步信號傳播,先算有外部輸入的元件,再算依賴其輸出的元件:

Queue<String> pinQueue = new LinkedList<>();
// 先將外部輸入引腳加入隊列
pinQueue.addAll(inputSignals.keySet());
while (!pinQueue.isEmpty()) {
    String currentPin = pinQueue.poll();
    // 計算當前引腳對應的元件輸出
    // 將輸出引腳加入隊列,供後續元件使用
}

 

2. 心得

  1. 拆分代碼結構:別把所有邏輯堆在一個類裏,按 “一個元件一個子類” 設計,像整理書包一樣分類存放,邏輯清晰易擴展;
  2. 信號異步計算:用隊列管理信號傳播順序,避免 “未就緒輸入就計算”,就像排隊辦事,前序沒完成不着急處理後續。

四、改進建議

  1. 基礎優化:給代碼加輸入校驗(如檢查信號是否為 0/1、引腳是否接全),避免閃退;把硬編碼的符號 / 元件標識(如 "-"、"A" 代表與門)集中成常量,改起來更方便;給關鍵邏輯加簡短註釋。
  2. 代碼拆分:把 main 裏 “讀輸入、創元件、算信號、輸結果” 的雜活拆成獨立小方法,每個方法只做一件事;新增元件時用 “抽象類 + 子類”,比如加加法器只寫新子類,不動原有門電路代碼。
  3. 長期維護:用配置文件存元件規則(如輸入數、輸出格式),新增元件只改配置不用改代碼;寫簡單測試用例(如與門輸入雙 1 測輸出),改代碼後驗證功能沒壞;加基礎日誌,方便定位報錯原因。

核心原則:代碼拆成小塊寫,新增功能只加代碼不改老代碼,改完記得測試,保證改得動、不返工。

五、總結

  1. 數字電路模擬作業總結

通過兩次數字電路模擬綜合編程題實踐,我掌握了正則表達式解析、Map/Queue 等數據結構應用,實現了從基礎門電路到複雜數字元件的模擬開發,代碼架構從扁平硬編碼升級為 “抽象基類 + 子類” 的分層設計,同時理解了信號異步傳播的實現邏輯,完成了編程能力與數字電路原理的結合;作業中暴露出核心問題:Main 方法邏輯耦合嚴重、複雜度過高,代碼缺乏註釋與異常處理,新增元件需修改核心代碼,維護與擴展成本高。後續將拆分耦合邏輯、補充註釋與校驗機制,引入配置化管理和測試用例,提升代碼可維護性與擴展性。

 2. 課堂測驗總結

課堂測驗檢驗了 Java 基礎語法掌握情況,發現自身存在語法細節記憶不精準(如 int 字節數、包聲明格式)、核心概念理解淺層化(異常處理、類型轉換)、Java 新版本特性掌握不足等問題,反映出實操驗證與底層邏輯理解的欠缺;後續將整理核心語法清單,通過編寫測試代碼強化記憶,深入學習核心概念的底層邏輯,主動跟進 Java 版本特性更新,補齊基礎短板。