OOP課第三階段總結

郑雅斌發表於2024-06-29

OOP課第三階段總結

前言:

  • 我想說的第一句是:”我感受到了設計上的極大缺陷“,從一開始,我完全就忽略了引腳的存在。因為在第二階段中,家電模擬大作業一、二在不需要考慮引腳的情況下也可以完成。但是當來到第三次,出現了互斥開關,因為互斥開關的特殊性,它具有1、2、3三個引腳,並且連線方式多種多樣,所以再不考慮引腳,那麼互斥開關的情況我是應對不了的。但是,我並沒有為所有的裝置保留其引腳資訊,而是隻考慮了互斥開關這一個另類。以至於,在第四次家電模擬大作業中,慘敗

  • 類比電路是一個非常具有擴充套件性的題目,因為電路的連線方式可以千變萬化,其中的裝置也可以是五花八門。這就非常考驗到了我寫的程式碼,能不能應對多種多樣的電路情況。而且在第四次大作業中還加入了二極體以及要求輸出各個裝置引腳的電勢,其實我感覺只加入二極體不難,只加入輸出引腳電勢的需求也不難,但是這兩者同時出現,卻會導致難度陡然上升。

  • 最後一次大作業讓我很遺憾,只拿到了不到1/3的分數。我想要投入更多的時間,好歹及格吧。但是接下來幾天的考試又不允許我持續往PTA傾斜時間,所以在結束的最後一天,距離結束還有6個小時的時候,我停止了作答。並不是我想要放棄了,而是我真的必須去複習其他課程了,這是最具有價效比的。希望等待老師開啟補練後,我可以完成最後一次大作業。在此我又統計了每次題目集的透過情況。可以看到,最後一次題目集的慘況,但提交次數卻遠不及同為透過率最低的第一次迭代(答題資訊)的題目集三的提交次數,可見,在期末緊張的時間下,很多同學並沒有足夠多的時間投入其中。

8次大作業透過情況

正文:

  • 第七次題目集 :

    新增裝置:

    互斥開關:

    解釋互斥開關有3個引腳:1個是彙總引腳,另兩個是分支引腳。
    開關電路示意圖如圖1所示,左邊是彙總引腳,編號為1;右邊兩個是分支引腳,右上的輸出引腳為2,右下輸出引腳為3。圖中1、2、3引腳均可以是輸入引腳,當1為輸入引腳時,2、3引腳為輸出引腳;1為輸出引腳時,2、3引腳為輸入引腳。
    互斥開關只有兩種狀態:開關接往上面的2號引腳、接往下面的3號引腳。開關每次只能接通其中一個分支引腳,而另一個分支引腳處於斷開狀態。
    互斥開關的預設狀態為1、2引腳接通,1、3引腳斷開。
    圖1中所示的互斥開關可以反過來接入電路,即彙總引腳接往接地端,兩個分支引腳接往電源端。
    

    受控窗簾:

    受控窗簾的電路符號為S,其最低工作電壓為50V,電壓達到或超過50V,窗簾即可正常工作,不考慮室外光照強度和室內空間大小等因素,窗簾受室內燈光的光照強度控制。

    解釋當電路中所有燈光的光照強度總和在[0,50)lux範圍內,窗簾全開;
    在[50,100)lux範圍內,窗簾開啟比例為0.8;
    在[100,200)lux範圍內,窗簾開啟比例為0.6;
    在[200,300)lux範圍內,窗簾開啟比例為0.4;
    在[300,400)lux範圍內,窗簾開啟比例為0.2;
    在400lux及以上範圍內,窗簾關閉。
    當電壓低於50V,窗簾不工作,預設為全開狀態。
    如果電路中沒有燈或者燈全部關閉,光照強度為0,窗簾處於全開狀態。
    

    新增電路情況:

    多個並聯電路串聯在一起的情況。

    考慮一條串聯電路中包含其他串聯電路的情況。

    第七次題目集新增兩大內容,新的裝置及新的電路情況。

    其實這並不會很難,因為互斥開關以及新的電路情況,都可以透過等效的方式來解決。

    • 互斥開關

      本質上,互斥開關可以等效為兩條並聯支路上的兩個狀態互異的正常開關,兩個開關只能有一個處於閉合狀態。當改變互斥開關的狀態時,就分別改變兩個開關的狀態。並且對這兩個開關進行電阻賦值。

      並且我為這兩個由互斥開關等效而來的普通開關定義了新的命名規則:

      當互斥開關的資訊為:H+"序號"+"-"+"引腳號"時

      等效開關的名稱便被我定義為:K+"互斥開關的序號+100"+"-"+"當前電路上的互斥開關的引腳號"。

      例如:

      H1-2等效為K101-2,並且對此電阻賦值為5

      經過這樣的操作後,我就可以很好的處理互斥開關的特殊性了。

      那麼最後關於互斥開關的資訊如何輸出?這個也是很好解決的,我們只需要根據互斥開關的序號加上100,在開關中尋找與之對應的兩個開關,根據兩者的狀態便可知道互斥開關的狀態。當K101-2是閉合的且K101-3是斷開的時候,H1就是閉合的。反之H1斷開。

    • 受控窗簾

      這個再簡單不過了,我只需要在輸出受控窗簾的資訊之前把所有的能產生光亮的裝置的亮度進行相加求和就好了,再判斷一下是不是達到了最低工作電壓。

    • 串聯電路包含串聯

      這個我認為是所有特殊的電路情況裡面最好解決的。因為我的所有電路類都繼承於裝置類,我只需要在遍歷每一條串聯電路的裝置資訊時,將其中含有的串聯電路的所有裝置依次新增到該串聯電路中去。因為串聯電路中包含串聯電路的情況,本質上還是一條串聯電路。所以是很好解決的。

    • 多個並聯電路串聯

      這個也算不上很難的點,很多人的程式碼都不需要或者經過少量的更改就能處理這個情況。本質上還是在主電路上新增一個並聯電路資訊,然後得到所有並聯電路的等效電阻後一起計算分壓就好了。

    到這裡,題目集七就算是被解決了。思路很正確,但是程式碼呢?能提出解決方法的人不一定能很好的實現這個方法。

    UML類圖

    類圖就是這樣,全都繼承於裝置類。

    Method CogC ev(G) iv(G) v(G)
    ControlledDevice.ControlledDevice() 0 1 1 1
    ControlledDevice.ControlledDevice(String, int) 0 1 1 1
    Controller.Controller(String, int) 0 1 1 1
    Controller.Controller(double) 0 1 1 1
    Controller.getGear() 0 1 1 1
    Controller.setGear(double) 0 1 1 1
    CurtainOfS.CalculateOpenScale(double) 10 1 7 8
    CurtainOfS.CurtainOfS(String, int) 0 1 1 1
    CurtainOfS.getOpenScale() 0 1 1 1
    CurtainOfS.setOpenScale(double) 0 1 1 1
    Device.Device() 0 1 1 1
    Device.Device(String, int) 0 1 1 1
    Device.getInputPin() 0 1 1 1
    Device.getInputV() 0 1 1 1
    Device.getName() 0 1 1 1
    Device.getNumber() 0 1 1 1
    Device.getOutPin() 0 1 1 1
    Device.getOutV() 0 1 1 1
    Device.getPartialPressure() 0 1 1 1
    Device.getResistance() 0 1 1 1
    Device.setInputPin(int) 0 1 1 1
    Device.setInputV(double) 0 1 1 1
    Device.setName(String) 0 1 1 1
    Device.setNumber(int) 0 1 1 1
    Device.setOutPin(int) 0 1 1 1
    Device.setOutV(double) 0 1 1 1
    Device.setPartialPressure(double) 0 1 1 1
    Device.setResistance(double) 0 1 1 1
    Fan.Fan(String, int) 0 1 1 1
    Fan.Fan(double) 0 1 1 1
    Fan.getSpeed() 0 1 1 1
    Fan.setSpeed(double) 0 1 1 1
    FanOfA.FanOfA(String, int) 0 1 1 1
    FanOfA.FanOfA(double) 0 1 1 1
    FanOfA.calculateSpeed() 5 1 4 5
    FanOfA.setSpeed(double) 0 1 1 1
    FanOfD.FanOfD(String, int) 0 1 1 1
    FanOfD.FanOfD(double) 0 1 1 1
    FanOfD.calculateSpeed() 3 1 3 3
    FanOfD.setSpeed(double) 0 1 1 1
    FilamentLamp.CalculateBrightness() 3 1 3 3
    FilamentLamp.FilamentLamp(String, int) 0 1 1 1
    FilamentLamp.setBrightness(double) 0 1 1 1
    FluorescentLamp.CalculateBrightness() 2 1 1 2
    FluorescentLamp.FluorescentLamp(String, int) 0 1 1 1
    FluorescentLamp.setBrightness(double) 0 1 1 1
    Lamp.Lamp(String, int) 0 1 1 1
    Lamp.getBrightness() 0 1 1 1
    Lamp.setBrightness(double) 0 1 1 1
    ParallelCircuit.ParallelCircuit(String, int, ArrayList) 0 1 1 1
    ParallelCircuit.ParallelCircuit(double, double) 0 1 1 1
    ParallelCircuit.getPartialPressure() 0 1 1 1
    ParallelCircuit.getSeriesNames() 0 1 1 1
    ParallelCircuit.setPartialPressure(double) 0 1 1 1
    ParallelCircuit.setSeriesNames(ArrayList) 0 1 1 1
    SeriesCircuit.SeriesCircuit(String, int, ArrayList) 0 1 1 1
    SeriesCircuit.SeriesCircuit(double, double) 0 1 1 1
    SeriesCircuit.getEquipments() 0 1 1 1
    SeriesCircuit.setEquipments(ArrayList) 0 1 1 1
    SwitchOfF.SwitchOfF(String, int) 0 1 1 1
    SwitchOfF.SwitchOfF(double) 0 1 1 1
    SwitchOfF.calculateState() 4 1 1 6
    SwitchOfF.getState() 0 1 1 1
    SwitchOfF.setState(double) 0 1 1 1
    SwitchOfH.IsClose() 2 2 1 2
    SwitchOfH.SwitchOfH(String, int) 0 1 1 1
    SwitchOfH.SwitchOfH(double) 0 1 1 1
    SwitchOfH.getState() 0 1 1 1
    SwitchOfH.setState(double) 0 1 1 1
    SwitchOfK.IsClose() 2 2 1 2
    SwitchOfK.SwitchOfK(String, int) 0 1 1 1
    SwitchOfK.SwitchOfK(double) 0 1 1 1
    SwitchOfK.isClose() 0 1 1 1
    SwitchOfK.setClose(boolean) 0 1 1 1
    SwitchOfL.SwitchOfL(String, int) 0 1 1 1
    SwitchOfL.SwitchOfL(int, double) 0 1 1 1
    SwitchOfL.calculateState() 0 1 1 1
    SwitchOfL.getState() 0 1 1 1
    SwitchOfL.setState(double) 0 1 1 1
    TotalCircuit.TotalCircuit(String, int) 0 1 1 1
    TotalCircuit.TotalCircuit(double, double) 0 1 1 1
    TotalCircuit.getInputV() 0 1 1 1
    TotalCircuit.getIsOk() 0 1 1 1
    TotalCircuit.getName() 0 1 1 1
    TotalCircuit.getNumber() 0 1 1 1
    TotalCircuit.getOutV() 0 1 1 1
    TotalCircuit.getResistance() 0 1 1 1
    TotalCircuit.setInputV(double) 0 1 1 1
    TotalCircuit.setIsOk(int) 0 1 1 1
    TotalCircuit.setName(String) 0 1 1 1
    TotalCircuit.setNumber(int) 0 1 1 1
    TotalCircuit.setOutV(double) 0 1 1 1
    TotalCircuit.setResistance(double) 0 1 1 1

    這張圖是一個Kiviat(雷達)圖,用來展示Java程式的多項度量指標。以下是對各個指標的分析:

    1. 平均複雜度 (Avg Complexity)

      • 值:3.27,理想範圍:[2.0-4.0]
      • 我的值處於理想範圍內,說明程式碼的平均複雜度較為合理。
    2. 平均深度 (Avg Depth)

      • 值:3.67,理想範圍:[1.0-2.2]
      • 我的值高於理想範圍,說明程式碼的巢狀深度較深,可能會導致程式碼難以理解和維護。
    3. 最大深度 (Max Depth)

      • 值:9+,理想範圍:[3-7]
      • 我的值顯著高於理想範圍,這可能意味著某些部分的程式碼巢狀過深,建議進行重構以減少巢狀深度。
    4. 最大複雜度 (Max Complexity)

      • 值:181,理想範圍:[2-8]
      • 我的值遠高於理想範圍,說明有部分程式碼的複雜度非常高,需要重點關注和最佳化。
    5. 每類方法數 (Methods/Class)

      • 值:5.22,理想範圍:[4-16]
      • 我的值處於理想範圍內,說明每個類的方法數量較為合理。
    6. 每個方法的平均語句數 (Avg Stmts/Method)

      • 值:6.33,理想範圍:[6-12]
      • 我的值處於理想範圍內,說明每個方法的語句數量適中。
    7. 註釋百分比 (% Comments)

      • 值:5.5,理想範圍:[8-20]
      • 我的值低於理想範圍,說明需要增加註釋以提高程式碼的可讀性和可維護性。

    總體來說,圖中的某些指標如平均複雜度、每類方法數和每個方法的平均語句數都處於理想範圍內,但最大深度、最大複雜度和註釋百分比需要特別關注和改進,以提高程式碼質量。

  • 第八次題目集:

    新增裝置:

    二極體:

    增加二極體元件,其電路特性為:正向導通,反向截止;其電器符號如圖4所示,當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。

    1、如果兩端電壓為0,二極體的導通/截止狀態由接入方向決定,1號引腳靠近電源則狀態為導通,反之為截止。
    2、如果兩端電壓不為0,二極體導通。
    

    新增電路情況:

    並聯電路中包含並聯:

    本次迭代考慮並聯電路中包含並聯電路的情況,即構成並聯電路的串聯電路可以包含別的並聯電路。例如如下輸入的電路,並聯電路M2的其中一條串聯電路T4中包含了另一條並聯電路M1:

    #T1:[IN D2-1] [D2-2 H1-2] [H1-1 OUT]
    #T2:[IN D1-1] [D1-2 H1-3] [H1-1 OUT]
    #M1:[T1 T2]
    #T4:[IN K3-1] [K3-2 M1-IN] [M1-OUT OUT]
    #T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]
    #M2:[T4 T5]
    

    新增處理情況:

    管腳電壓的顯示:

    在輸出每個電器的狀態資訊後,再依次輸出該電器每個管腳的電壓。

    @B1:200 220-0
    

    電流限制

    電器在工作時,過大的電流會引起電器過熱,從而燒壞電路。本次迭代,每個元器件都有最大電流的設定,當實時電流超過最大電流時,在該電器輸出資訊的最後加入提示“exceeding current limit error”,與前面的資訊之間用英文空格分隔。

    @B1:190 68-17 exceeding current limit error
    

    正如我前言所說,這次的重難點在於處理好二極體和輸出引腳電勢共同存在的情況,因為很難有一個通用的方法去應對每一種情況。我先將二極體和輸出引腳電勢的情況分開進行討論:

    • 二極體

      分析一下,二極體正向電阻為0,逆向電阻為無窮大。我可以根據引腳的出現順序來判斷二極體的電流方向。

      當引腳1先出現時,我將二極體的電阻設定為0,否則透過:

      Integer.MAX_VALUE
      

      設定二極體電阻為一個很大的值。

    • 輸出引腳電勢:

      分析一下,如何輸出引腳電勢:

      因為大多數人選擇的都是透過計算電阻來直接獲取裝置分壓的,而不是透過引腳的電勢差來獲取裝置分壓,這樣並不能直接計算出引腳的電勢,所以存在很大的缺陷。

      但是也不是沒有方法去處理這樣的情況:

      我從主電路開始遍歷,將主電路的輸入引腳的電壓計算出來,按照遇到裝置(這裡的裝置包括可能遇到的並聯電路/串聯電路)便將裝置的輸入引腳的電壓賦值為前一個輸出引腳的電壓(第一個裝置的輸入引腳的電壓等於主電路的輸入引腳的電壓)。然後每得到一個裝置的輸入引腳的電壓,就用這個值減去當前裝置的分壓,後賦值給其輸出引腳的電壓。

      這樣,主電路被處理好了。

      接下來處理並聯電路就好了:

      按照從後往前的順序去處理並聯電路,類似地,將並聯電路的每一條支路的輸入電壓賦值為該並聯電路的輸入電壓,再遍歷這些支路上的裝置,接下來的操作和剛才一樣,不再贅述。

    • 輸出電流過大警告:

      這個是最好處理的,因為在此之前我已經獲取了每個裝置的分壓以及電阻,只需要透過:

      電流=分壓/電阻
      

      就可以得到該裝置當前的電流。

      但是值得注意的是,這種方法只對有電阻的裝置有效,開關是無法透過這種方法得到的。

      那麼開關電流就需要透過計算開關當前所在串聯電路的電流來得到,只需要用開關所在串聯電路的分壓/總電阻就好了。這些資料我都是已經提前獲取好的了。

    這也就算是能處理好每一種情況了,但是由於二極體的特殊性,導致電路中的電勢情況更加複雜。目前我沒有很好的方法去處理。

UML類圖

設計思路基本一致。

Method CogC ev(G) iv(G) v(G)
ControlledDevice.ControlledDevice() 0 1 1 1
ControlledDevice.ControlledDevice(String, int) 0 1 1 1
Controller.Controller(String, int) 0 1 1 1
Controller.Controller(double) 0 1 1 1
Controller.getGear() 0 1 1 1
Controller.setGear(double) 0 1 1 1
CurtainOfS.CalculateOpenScale(double) 10 1 7 8
CurtainOfS.CurtainOfS(String, int) 0 1 1 1
CurtainOfS.getOpenScale() 0 1 1 1
CurtainOfS.setOpenScale(double) 0 1 1 1
Device.Device() 0 1 1 1
Device.Device(String, int) 0 1 1 1
Device.getExceedingLimitMax() 0 1 1 1
Device.getFirstPin() 0 1 1 1
Device.getInputPin() 0 1 1 1
Device.getInputV() 0 1 1 1
Device.getName() 0 1 1 1
Device.getNumber() 0 1 1 1
Device.getOutPin() 0 1 1 1
Device.getOutV() 0 1 1 1
Device.getPartialPressure() 0 1 1 1
Device.getPin1() 0 1 1 1
Device.getPin2() 0 1 1 1
Device.getResistance() 0 1 1 1
Device.isExceedingLimit() 0 1 1 1
Device.setExceedingLimit(boolean) 0 1 1 1
Device.setExceedingLimitMax(double) 0 1 1 1
Device.setFirstPin(int) 0 1 1 1
Device.setInputPin(int) 0 1 1 1
Device.setInputV(double) 0 1 1 1
Device.setName(String) 0 1 1 1
Device.setNumber(int) 0 1 1 1
Device.setOutPin(int) 0 1 1 1
Device.setOutV(double) 0 1 1 1
Device.setPartialPressure(double) 0 1 1 1
Device.setPin1(double) 0 1 1 1
Device.setPin2(double) 0 1 1 1
Device.setResistance(double) 0 1 1 1
Fan.Fan(String, int) 0 1 1 1
Fan.Fan(double) 0 1 1 1
Fan.getSpeed() 0 1 1 1
Fan.setSpeed(double) 0 1 1 1
FanOfA.FanOfA(String, int) 0 1 1 1
FanOfA.FanOfA(double) 0 1 1 1
FanOfA.calculateSpeed() 5 1 4 5
FanOfA.setSpeed(double) 0 1 1 1
FanOfD.FanOfD(String, int) 0 1 1 1
FanOfD.FanOfD(double) 0 1 1 1
FanOfD.calculateSpeed() 3 1 3 3
FanOfD.setSpeed(double) 0 1 1 1
FilamentLamp.CalculateBrightness() 3 1 3 3
FilamentLamp.FilamentLamp(String, int) 0 1 1 1
FilamentLamp.setBrightness(double) 0 1 1 1
FluorescentLamp.CalculateBrightness() 2 1 1 2
FluorescentLamp.FluorescentLamp(String, int) 0 1 1 1
FluorescentLamp.setBrightness(double) 0 1 1 1
Lamp.Lamp(String, int) 0 1 1 1
Lamp.getBrightness() 0 1 1 1
Lamp.setBrightness(double) 0 1 1 1
ParallelCircuit.ParallelCircuit(String, int) 0 1 1 1
ParallelCircuit.ParallelCircuit(String, int, ArrayList) 0 1 1 1
ParallelCircuit.getSeriesNames() 0 1 1 1
ParallelCircuit.getUpName() 0 1 1 1
ParallelCircuit.setSeriesNames(ArrayList) 0 1 1 1
ParallelCircuit.setUpName(String) 0 1 1 1
SeriesCircuit.SeriesCircuit(String, int, ArrayList) 0 1 1 1
SeriesCircuit.getEquipments() 0 1 1 1
SeriesCircuit.setEquipments(ArrayList) 0 1 1 1
SwitchOfF.SwitchOfF(String, int) 0 1 1 1
SwitchOfF.SwitchOfF(double) 0 1 1 1
SwitchOfF.calculateState() 4 1 1 6
SwitchOfF.getState() 0 1 1 1
SwitchOfF.setState(double) 0 1 1 1
SwitchOfH.IsClose() 2 2 1 2
SwitchOfH.SwitchOfH(String, int) 0 1 1 1
SwitchOfH.SwitchOfH(double) 0 1 1 1
SwitchOfH.getPin_1_v() 0 1 1 1
SwitchOfH.getPin_2_v() 0 1 1 1
SwitchOfH.getPin_3_v() 0 1 1 1
SwitchOfH.getState() 0 1 1 1
SwitchOfH.setPin_1_v(double) 0 1 1 1
SwitchOfH.setPin_2_v(double) 0 1 1 1
SwitchOfH.setPin_3_v(double) 0 1 1 1
SwitchOfH.setState(double) 0 1 1 1
SwitchOfK.IsClose() 2 2 1 2
SwitchOfK.SwitchOfK(String, int) 0 1 1 1
SwitchOfK.SwitchOfK(double) 0 1 1 1
SwitchOfK.isClose() 0 1 1 1
SwitchOfK.setClose(boolean) 0 1 1 1
SwitchOfL.SwitchOfL(String, int) 0 1 1 1
SwitchOfL.SwitchOfL(int, double) 0 1 1 1
SwitchOfL.calculateState() 0 1 1 1
SwitchOfL.getState() 0 1 1 1
SwitchOfL.setState(double) 0 1 1 1
SwitchOfP.SwitchOfP(String, int) 0 1 1 1
SwitchOfP.SwitchOfP(double) 0 1 1 1
SwitchOfP.isConduction() 0 1 1 1
SwitchOfP.setConduction(boolean) 0 1 1 1
SwitchOfP.setR() 2 1 2 2
TotalCircuit.TotalCircuit(String, int) 0 1 1 1
TotalCircuit.getIsOk() 0 1 1 1
TotalCircuit.setIsOk(int) 0 1 1 1
Class OCavg OCmax WMC
ControlledDevice 1 1 2
Controller 1 1 4
CurtainOfS 2.5 7 10
Device 1 1 28
Fan 1 1 4
FanOfA 2 5 8
FanOfD 1.5 3 6
FilamentLamp 1.67 3 5
FluorescentLamp 1.33 2 4
Lamp 1 1 3
ParallelCircuit 1 1 6
SeriesCircuit 1 1 3
SwitchOfF 2.2 7 11
SwitchOfH 1.09 2 12
SwitchOfK 1.2 2 6
SwitchOfL 1 1 5
SwitchOfP 1.2 2 6
TotalCircuit 1 1 3

  1. 平均複雜度 (Avg Complexity)

    • 值:3.17
    • 理想範圍:[2.0-4.0]
    • 你的平均複雜度在理想範圍內,表明程式碼的複雜度適中,易於理解和維護。
  2. 平均深度 (Avg Depth)

    • 值:3.65
    • 理想範圍:[1.0-2.2]
    • 你的平均深度高於理想範圍,意味著程式碼的巢狀層次較深,可能會增加理解難度和維護成本。
  3. 最大深度 (Max Depth)

    • 值:9+
    • 理想範圍:[3-7]
    • 我的最大深度顯著高於理想範圍,表明某些程式碼塊巢狀非常深,需要考慮簡化這些程式碼塊。
  4. 最大複雜度 (Max Complexity)

    • 值:190
    • 理想範圍:[2-8]
    • 我的最大複雜度遠高於理想範圍,提示有些部分程式碼非常複雜,需要重點最佳化這些部分以提高程式碼質量。
  5. 每類方法數 (Methods/Class)

    • 值:5.42
    • 理想範圍:[4-16]
    • 我的每類方法數在理想範圍內,表明每個類的方法數量適中。
  6. 每個方法的平均語句數 (Avg Stmts/Method)

    • 值:6.37
    • 理想範圍:[6-12]
    • 我的每個方法的平均語句數在理想範圍內,意味著方法的長度適中。
  7. 註釋百分比 (% Comments)

    • 值:3.8
    • 理想範圍:[8-20]
    • 我的註釋百分比低於理想範圍,建議增加註釋,以提高程式碼的可讀性和可維護性。

與之前的分析相比,這張圖的指標略有不同,但總體情況類似。你的Java程式在平均複雜度、每類方法數和每個方法的平均語句數方面表現良好,但在程式碼深度和複雜度方面需要改進,特別是最大深度和最大複雜度,需要優先考慮重構和最佳化。

總結:

  • 踩坑心得:

    • 一開始就沒有考慮引腳的功能,導致後期程式碼修修補補,很難維護和擴充。

    • 沒有保持PTA與電腦上程式碼的一致性,有時候為了圖方便直接在P他的提交介面修改程式碼,改完之後卻沒有修改原生代碼,導致兩個程式碼之間不同步。

    • 一開始設計的時候並沒有將電路類繼承於裝置類,而是成為了一個獨立存在的父類,導致後期處理複雜電路情況時很不方便。

  • 課程建議:

    • 希望老師可以積極回覆同學的疑問,雖然很多時候都是問測試點的,但是這是真的“走投無路”了才會用的方法。
  • 最後:

    8次大作業到此也就結束了,象徵著本學期的學習已經來到了尾聲。感謝老師們的辛苦付出,敬禮!

相關文章