Blog2-題目集4~6
一、前言:
本次的大作業(yè),包含了兩個(gè)部分,一個(gè)是之前的1-3大作業(yè)(答題程序)還剩余的一次迭代,另外兩個(gè)是最近做的電路設(shè)計(jì)的迭代,總而來說,這些大作業(yè)都是對(duì)于自己能力的考驗(yàn),也是對(duì)自己的提升。
二、設(shè)計(jì)與分析:
大作業(yè)4最后一題:
1.源碼分析:
這次的迭代相比于上次的內(nèi)容,主要是增加了如下
- 題目:增加了題目類型,包括多選題,填空題了
- 對(duì)于類的設(shè)計(jì),主要是需要使用繼承的思想,這些多選題,填空題都是可以繼承于題目類,然后重寫其中的方法。
- 對(duì)于判分,就需要增加多選題的判分邏輯,填空題的判分邏輯。因?yàn)闀?huì)有半對(duì)的情況產(chǎn)生,所以需要考慮。
其實(shí)我這里也是使用小巧思
class MCQuestion extends Question { // 定義選擇題類,繼承題目類
public MCQuestion(int number, String content, String standardAnswer) {
super(number, content, standardAnswer);
}
}
class FQuestion extends Question { // 定義填空題類,繼承題目類
public FQuestion(int number, String content, String standardAnswer) {
super(number, content, standardAnswer);
}
}
其實(shí)不難發(fā)現(xiàn),我這個(gè)完全就是一個(gè)虛假的繼承,因?yàn)槲移鋵?shí)還是把他當(dāng)那種單選題做了,不過能出一個(gè)半對(duì)的情況。只是我分開存儲(chǔ)了答案,然后就會(huì)有我如下的判定:
boolean isAllCorrect = standardAns.equals(providedAns); // 對(duì)于一模一樣的答案直接通過,針對(duì)填空題
boolean isCorrect = containsAllCharacters(MstandardAns, MproviedAns); // 對(duì)于錯(cuò)序的選擇題,如標(biāo)準(zhǔn)答案是:ABD,給出答案是:DBA
boolean ishalfCorrect = containspartCharacters(MstandardAns, MproviedAns); // 判斷是否有包含,針對(duì)半對(duì)的情況,不能有多余字符
可以看見我的是有三種情況的,然后分開判定,這樣就能處理多選題和半對(duì)的情況。也算是一個(gè)投機(jī)取巧的辦法?
2.SourceMontor分析結(jié)果:

3.UML圖:

4.時(shí)序圖


大作業(yè)5最后一題:
1.源碼分析
這是第一次新的題,就是對(duì)于電路電器的模擬
我做出了如下設(shè)計(jì):
- 電氣設(shè)備類(Electrical_equipment)
- 屬性:
- identifier: 設(shè)備的唯一標(biāo)識(shí)符(例如,VCC、GND等)。
- inputVoltage: 輸入電壓(默認(rèn)值為0V)。
- outputVoltage: 輸出電壓(默認(rèn)值為0V)。
- number: 設(shè)備編號(hào)。
input 和 output: 分別表示設(shè)備的輸入和輸出端口。
- 方法:
- getOutputVoltage(): 返回輸出電壓,調(diào)用 computeOutput() 進(jìn)行計(jì)算。
- setInputVoltage(double inputVoltage): 設(shè)置輸入電壓。
- computeOutput(): 抽象方法,用于每個(gè)設(shè)備根據(jù)輸入電壓計(jì)算輸出電壓,具體實(shí)現(xiàn)由子類提供。
- 具體設(shè)備類
- 電壓源(Voltage_source): 輸出固定電壓220V,表示電源設(shè)備。
- 接地(Ground): 輸出固定電壓0V,表示接地設(shè)備。
- 控制設(shè)備(如 Switch, Binning_governor, Continuous_governor): 用于調(diào)節(jié)電路的開關(guān)狀態(tài)、調(diào)速或調(diào)節(jié)電壓輸出。
- 受控設(shè)備(如 Light, Fan): 由電壓控制,執(zhí)行具體的控制操作,如燈的亮度或風(fēng)扇的轉(zhuǎn)速。
每個(gè)設(shè)備類繼承自 Electrical_equipment 并實(shí)現(xiàn)了 computeOutput() 方法,計(jì)算設(shè)備的輸出電壓或亮度等。
-
控制設(shè)備類
Switch: 用于控制電路開關(guān)狀態(tài)。電路的狀態(tài)(開或關(guān))會(huì)影響設(shè)備的電壓輸出。toggle() 方法改變開關(guān)狀態(tài)。
Binning_governor: 分檔調(diào)速器,通過切換檔位控制電壓輸出的比例。共有4檔,檔位0至3。
Continuous_governor: 連續(xù)調(diào)速器,輸出電壓比例在0至1之間,可以細(xì)粒度調(diào)整輸出電壓。
這些設(shè)備通過輸入調(diào)節(jié)命令(例如 #K1, #F2+ 等)來控制設(shè)備的狀態(tài)。 -
電路連接和設(shè)備控制
ProcessSystem 類負(fù)責(zé)解析輸入命令并管理設(shè)備。輸入包括設(shè)備連接(例如 [VCC 1])和設(shè)備控制命令(如 #K2, #F3+ 等)。
解析設(shè)備連接:parseConnection() 方法通過正則表達(dá)式解析輸入的設(shè)備連接命令。根據(jù)設(shè)備連接,更新設(shè)備列表 deviceList。
設(shè)備控制:parseControlEquipment() 方法解析并執(zhí)行控制命令,比如切換開關(guān)狀態(tài)或調(diào)整調(diào)速器檔位。
串聯(lián)電路(SeriesCircuit): 設(shè)備通過 SeriesCircuit 類連接,模擬串聯(lián)電路的行為。電壓從 VCC(電壓源)流向其他設(shè)備,并根據(jù)設(shè)備的狀態(tài)計(jì)算每個(gè)設(shè)備的輸出電壓。
在串聯(lián)電路中,電流流過每個(gè)設(shè)備時(shí),可能會(huì)遇到開關(guān)(Switch),若開關(guān)關(guān)閉,則電路中斷,電壓為0V。
輸出計(jì)算:computeSystemOutput() 方法會(huì)計(jì)算整個(gè)系統(tǒng)的輸出,并將結(jié)果按設(shè)備編號(hào)排序輸出。
其實(shí)是以巨大的繼承關(guān)系,
如圖:

可以見到總的父類是Electrical_equipment,然后是Voltage_source、Ground、Switch、Binning_governor、Continuous_governor、Light、Fan等具體設(shè)備類,最后是ProcessSystem類負(fù)責(zé)管理設(shè)備。
2.SourceMontor分析結(jié)果:

3.UML圖

4.時(shí)序圖


大作業(yè)6最后一題:
1.源碼分析
此次迭代基于上次的基礎(chǔ)上添加了并聯(lián)電路,以及新的受控設(shè)備,對(duì)于新的受控設(shè)備來說,改的不多,只是增加了一個(gè)新的類來繼承Fan,然后重寫了computeOutput()方法,計(jì)算風(fēng)扇的轉(zhuǎn)速。并且在處理設(shè)備的時(shí)候增加對(duì)于落地扇的操作即可。
最主要的是新增的并聯(lián),思路也比較簡單,我是計(jì)算電阻分壓來做的,在并聯(lián)的類里,有
private List< SeriesCircuit > seriesCircuits; 來存放串聯(lián)電路,通過computeOutput()計(jì)算分壓,然后再計(jì)算總電壓。
另外,我把之前的設(shè)備里的comouteOutput()方法改成了compute(),因?yàn)楝F(xiàn)在同一以compute()來計(jì)算設(shè)備的各種參數(shù)值。comouteOutput()就主要用于處理電壓,以及電阻等了。
2.SourceMontor分析結(jié)果:

3.UML圖

4.時(shí)序圖


三、踩坑心得
- 在大作業(yè)4的實(shí)現(xiàn)中,嘗試通過繼承關(guān)系來簡化多種題型的設(shè)計(jì)(如選擇題、填空題等)。雖然這種設(shè)計(jì)看起來符合面向?qū)ο蟮脑O(shè)計(jì)原則,但實(shí)際上并沒有充分利用繼承的優(yōu)勢,而是出現(xiàn)了“虛假的繼承”——多選題和填空題本質(zhì)上和單選題差別不大,繼承只是為了區(qū)分不同的題型。然而,這種設(shè)計(jì)使得代碼的可擴(kuò)展性變差,因?yàn)楹罄m(xù)若需要對(duì)新類型的題目進(jìn)行擴(kuò)展(如判斷對(duì)錯(cuò)規(guī)則),則不得不修改現(xiàn)有類。但是那一次我也只會(huì)這樣考慮了
- 在大作業(yè)5和大作業(yè)6的電路模擬中,涉及到了設(shè)備之間的數(shù)據(jù)流和控制邏輯。尤其是在串聯(lián)和并聯(lián)電路的實(shí)現(xiàn)過程中,需要仔細(xì)設(shè)計(jì)每個(gè)設(shè)備的輸入輸出接口以及控制命令的解析。最初在設(shè)計(jì)控制命令的解析時(shí),難以保證命令的順序和格式的一致性,導(dǎo)致程序出錯(cuò)或行為不符合預(yù)期。
- 電路模擬中的每個(gè)設(shè)備都有不同的計(jì)算邏輯,如電壓源、電壓控制器、負(fù)載設(shè)備等,而每個(gè)設(shè)備的輸出都可能受到其他設(shè)備的影響。調(diào)試時(shí)發(fā)現(xiàn)電路在某些情況下輸出不正常,往往是因?yàn)槟硞€(gè)設(shè)備的狀態(tài)或參數(shù)沒有正確傳遞。比如在串聯(lián)電路中,若一個(gè)開關(guān)狀態(tài)未被正確更新,可能導(dǎo)致電路中斷,輸出為零。在并聯(lián)電路中,之前沒有分開compute()和computeOutput(),導(dǎo)致在計(jì)算分壓的時(shí)候,沒有考慮到電阻的值,導(dǎo)致計(jì)算錯(cuò)誤。
- 大作業(yè)6中,我實(shí)現(xiàn)了并聯(lián)電路的模擬。并聯(lián)電路的輸出電壓需要通過電阻分壓來計(jì)算,雖然思路清晰,但實(shí)際編碼時(shí),如何準(zhǔn)確模擬電流分流和電壓分配,尤其是在不同設(shè)備和電路組合時(shí),給我?guī)砹艘恍├Щ蟆F鸪?,我沒能很好地處理串聯(lián)電路和并聯(lián)電路之間的相互影響,導(dǎo)致某些情況下計(jì)算結(jié)果不準(zhǔn)確。
四、改進(jìn)建議
- 盡量避免為了繼承而繼承,特別是在子類和父類之間差異不大的情況下??梢钥紤]通過接口或者策略模式來提高代碼的靈活性和可維護(hù)性。
- 對(duì)于大作業(yè)4的答題程序來說,應(yīng)該是進(jìn)一步優(yōu)化進(jìn)程的,可以增加屬性:答案的集合等信息,以便于判分。這樣相對(duì)于我的程序更加優(yōu)良
- 對(duì)于大作業(yè)6來說,我的成績是94分的樣子,在今天走的時(shí)候想到,似乎有個(gè)地方?jīng)]有改掉,就是在sort中,沒有把A(落地扇)加上去,導(dǎo)致其實(shí)落地扇是沒有加入排序的。
總結(jié)
通過這次的大作業(yè),我不僅鞏固了面向?qū)ο蟮脑O(shè)計(jì)思維,也深入理解了如何將抽象的電路模型轉(zhuǎn)化為具體的代碼實(shí)現(xiàn)。從設(shè)計(jì)繼承關(guān)系到電路的模擬,每一部分都考驗(yàn)了我的編程能力和解決問題的思路。通過這次迭代,我收獲了很多實(shí)踐經(jīng)驗(yàn),也發(fā)現(xiàn)了自己的不足之處,特別是在如何設(shè)計(jì)靈活、可擴(kuò)展的系統(tǒng)方面。

浙公網(wǎng)安備 33010602011771號(hào)