第三輪OOP作業總結

林子炫發表於2024-06-30

隨著這一次大作業的結束,這學期的PTA大作業也隨之完結,可以說這最後一次大作業也是最難的一次,在這一次作業中我也感受到了不良程式碼結構所導致的修改錯誤的痛苦,接下來讓我們對這兩次題目進行相應分析。

  • 家居強電電路模擬程式-3
  • 家居強電電路模擬程式-4

第三次作業

這一次大作業的電路連線上與上一次大作業差不多,都是一條主線加多條分支的結構,但是新增的互斥開關導致我修改了很多之前的程式碼內容,從而產生的相應的錯誤讓我感受到了遵循開閉原則的重要性。

由於互斥開關在不同路的電壓不同,所以我對getRes方法進行了修改,當呼叫getRes方法時需要傳入是那條電路傳入的,雖然這樣解決了互斥開關的問題,但同時也要修改其他全部volObserver物件的getRes方法,就導致很複雜。

SourceMonitor分析如下:

UML類圖如下:

設計與分析:

設計:

這次較大的改動分別是由於互斥開關的引進,電路電阻的分析,大幅修改了計算電阻方法的引數,其次就是排序方法,由於這次題目要求了相應的排序方法,於是我又在AUTO類中加了儲存裝置名稱的變數,將所有裝置的名稱儲存起來後在排序,之後透過排序的順序搜尋相應的裝置進行輸出。

改進建議:

對互斥開關物件的類設計不是很遵循六大設計原則,導致程式碼在面對修改時很複雜。

出現錯誤:

1.這次題目有個很噁心的錯誤點,那就是排序的問題,這道題對於A1 A11 A2進行排序時的排序規則是完全依據字典排序,不需要將字母和數字分開來進行排序

第二次作業

這一次大作業不僅是最難的一次,而且時期恰逢考試周,不得不在做PTA和複習中做抉擇,而這一次的PTA難點在於放開了電路的組成限制,使得電路可以隨意拼接,串聯有串聯,並聯,並聯內可以有並聯串聯,但最難的還是強制要求輸出裝置的引腳電壓,這是我之前程式碼中完全沒有考慮到的部分,之前我都是直接給裝置賦值有效電壓,而不是透過引腳電壓差來計算,所以對於引腳電壓的判斷完全是在之前程式碼的基礎上新增,又由於這時恰逢考試周,對程式碼的修改不在注重單一原則,就導致程式碼在修改時遇到了很多困難。

SourceMonitor分析如下:

UML類圖如下:

設計:

我的類設計:

這題難就難在對一系列短路,斷路中裝置引腳電壓的判斷,一開始我以為短路電路,上裝置引腳進出都為0,但實則不然,必須要符合電勢,而不是單純的使引腳為0。

這次新增的二極體在題目一開始也沒說清楚會不會阻擋反向電勢,後面加上的說明也是模稜兩可,可以說最後一次改分後雖然我知道錯誤點在哪裡,(兩個斷開控制裝置中間夾著一個裝置是此時這個裝置引腳沒電勢),修改也只能最多讓我多加12分,於是放棄複習去了。

出現錯誤:

這次題目集最後直接將程式碼耦合度提升了1度,也是將自己的程式碼修改成了石山的形狀,而且最後也沒有滿分,是這一次題目集的遺憾,讓我明白了程式碼不是一味的硬寫,比如這次就是沒有考慮電勢,而出了很大錯誤,也讓我明白了降低耦合度的重要性,提升程式碼擴充套件性和魯棒性的重要性。

改進建議:

一開始就可以再類中設定儲存引腳電壓的變數,由於一開始的主電路沒個裝置左右兩引腳必有電壓,這樣就可以當遇到短路時直接將裝置輸出引腳賦值為上層電路的輸出電壓,這樣可以就不需要左右賦值電壓了,以下是我現在的引腳賦值程式碼

@Override
public double setInputVol(double inputPin, Circuit circuit) {
    super.setInPin(inputPin);
    double voltage = inputPin;
    for (VolObserver observer : getCurObservers()) {
        voltage = observer.setInputVol(voltage, this);
        if (voltage == 0) {
            return 0;
        }
    }
    return inputPin - getVoltage();
}

@Override
public double setOutputVol(double outputPin, Circuit circuit) {
    super.setOutPin(outputPin);
    double voltage = outputPin;
    for (int i = getCurObservers().size() - 1; i >= 0; i--) {
        VolObserver observer = getCurObservers().get(i);
        voltage = observer.setOutputVol(voltage, this);
        if (voltage == 0) {
            return 0;
        }
    }
    return outputPin + getVoltage();
}

這是之前的程式碼還是會產生一些不知名的錯誤。

綜合性總結:

最後一次作業,讓我明白了架構設計的重要性,透過學習設計模式可以巧妙解決一些問題,

而透過這一學期PTA作業的高強度訓練,我在大型問題的程式設計能力也得到了提高,程式碼書寫行數也有萬行以上了。

期待下學期計算機系統和資料結構的學習