《第三次部落格》
一.家居強電電路模擬程式-3
-
前言:
1>.程式碼主要功能:
本次迭代的程式碼功能其實裝置之間的連線並沒有太多的變化,本次迭代的內容主要是並聯和並聯串 聯的處理,這個功能好實現,因為設計好了串聯類和並聯類,只要設計好儲存並聯的集合,做好電 壓之間賦值關係即可處理好,多個並聯串聯的問題,在主電路中儲存並聯,相關的電壓時把這整個 並聯當作是一個簡單的裝置,在計算電壓是把這個裝置所計算得到的電壓再賦值給所對應名稱的並 聯之中,再進一步在並聯的方法中計算本並聯中的串聯中的裝置的電壓,做好裝置的賦值賦值操 作,本次迭代出來的功能難點在與互斥開關的類的設計,本次的互斥開關由於是三個引腳,所以在 本次的迭代之中我是按照將一個互斥開關,拆分成兩個帶有引腳表示的簡單開關進行來處理,這樣 的處理可以使得,後續調節互斥開關的狀態時變得更加簡單便利,子在本次的迭代之中還新增了一 個類叫做智慧窗簾,本窗簾的智慧功能是可以根據所有燈光的大小來調節窗簾的開關程度,所以在 計算窗簾的開關程度時,只需便利儲存裝置的集合,累加出總光照的總和,進而計算出開合程度。
2>.主要知識點:
本次迭代並沒有增加很多什麼知識點只是利用原來的知識點寫出了新的功能和部分, 主要知識點都是和集合List,字串的處理,正規表示式,類的設計相關的知識點,沒有增加新 的知識點 1.透過 Scanner 和 System.in 來接收使用者的輸入,實現互動式輸入。 2.字串處理:使用了字串操作方法,如 startsWith、substring、split、charAt 等來處理 使用者輸入的字串。 3.多型:在往 devices 列表中新增裝置物件時,利用多型實現了將不同子類物件當作父類物件來處 理。 4.類繼承與物件例項化:定義了 Device 類及其子類 Switch、GearSpeedController、 ContinuousSpeedController、IncandescentLamp、FluorescentLamp、CeilingFan,並根據 使用者輸入的不同型別來例項化相應的子類物件。 5.透過對 devices 中的裝置進行遍歷查詢及強制型別轉換,實現了根據使用者輸入操作來對裝置進行 狀態控制。 6.使用了 switch-case 語句塊進行根據不同條件執行不同的操作。 7.採用了物件導向設計原則,如單一職責原則、開閉原則,使得程式碼結構清晰、易於擴充和維護。 8.遍歷迴圈:使用了 for 迴圈對裝置列表進行遍歷操作。
3>.題目的題量:
本題的題量算是一般,因為在主函式的處理方面,增加了一個並聯和並聯之間的串聯,並沒有多大的 變化,只需要呼叫並聯和串聯相關的函式即可,只不過在本次的迭代之中,新增了兩個類,而這兩個 類並沒有增加太多的程式碼的相關內容
4>.題目難度:
在上次的迭代處理好了之後,並聯和並聯的串聯操作,就較好的能處理完成,但是,本次的迭代的互 斥開關較為難處理,所以還是有一定的難度的,所以笨的難度一般,處理好了這個互斥開關還是能寫 出來做到滿分的
-
設計與分析:
-
採坑心得:
addDevices方法不僅新增裝置到列表中,還試圖透過傳入的resistance引數更新總電阻。然 而,這種方法沒有考慮到每個裝置可能有不同的電阻值,並且應該由裝置物件自身來提供其電 阻值。方法命名不一致:Mresistance方法名可能是addResistance的誤寫,這導致了命名不 一致和可能的混淆。型別檢查和向下轉型:在judgeCstate方法中,程式碼使用了instanceof來 檢查裝置的型別,並隨後進行了向下轉型。這種型別檢查通常不是物件導向設計的最佳實踐, 因為它限制了程式碼的靈活性和可維護性。如果可能,最好使用多型性來避免型別檢查和向下轉 型。硬編碼狀態邏輯:在judgeCstate方法中,對於不同型別的裝置(如Switch、 MutexSwitch、GearSpeedController等),硬編碼了狀態判斷的邏輯。這使得新增新型別 的裝置或修改現有裝置的狀態邏輯變得困難。未完成的程式碼:judgeCstate方法的程式碼被截斷 了,這導致我們無法看到完整的邏輯。不完整的程式碼片段可能導致理解和維護困難。 狀態表示不明確:cstate欄位被用來表示電路的狀態(閉合或斷開),但沒有明確的文件或注 釋來解釋這個欄位的確切含義和用法。缺少異常處理:程式碼中沒有包含任何異常處理邏輯,例 如,在新增裝置到列表時,沒有檢查是否成功新增或處理可能的異常。 缺少封裝性:雖然類的屬性被宣告為private(在程式碼片段中未明確顯示,但通常假設),但某 些方法(如setV1_V2)可能允許外部類直接修改內部狀態,這可能破壞封裝性並導致不可預見 的行為。缺乏文件註釋:程式碼片段中缺乏文件註釋,這使得其他開發人員難以理解類的用途、 方法的作用和引數的預期值。缺乏輸入驗證:在setV1_V2和addDevices等方法中,沒有對輸 入進行驗證,例如檢查電壓或電阻是否在合理的範圍內。這可能導致意外的行為或錯誤。
-
改進建議
重構電阻計算邏輯: 移除addDevices方法中的電阻引數,改為在Device類中定義一個獲取電阻值的方法(如 getResistance())。 在Series類中維護一個計算總電阻的方法(如calculateTotalResistance()),該方法遍 歷裝置列表並累加每個裝置的電阻值。 最佳化方法命名: 將Mresistance方法重新命名為addResistance或其他更具描述性的名稱。 使用多型性: 在Device類中定義一個方法(如isOpen()),用於判斷裝置是否處於開啟狀態。 在judgeCstate方法中,遍歷裝置列表並呼叫每個裝置的isOpen()方法來判斷電路是否閉 合。完成judgeCstate方法: 確保judgeCstate方法完整,並且正確地檢查所有裝置的狀態以確定電路的整體狀態。 新增異常處理: 在新增裝置到列表時,可以新增異常處理邏輯來確保裝置被成功新增,或者處理新增過程中 可能出現的異常。 明確狀態表示: 在Series類中新增文件註釋,明確解釋cstate欄位的含義和用法。 增強封裝性: 考慮將某些屬性的訪問級別更改為private,並透過公共的getter和setter方法來訪問和修 改這些屬性。 新增文件註釋: 為類、方法、屬性和其他重要部分新增文件註釋,以便其他開發人員能夠更容易地理解程式碼的 功能和用途。 在設定電壓、電阻或新增裝置時,新增輸入驗證邏輯來確保輸入的值在合理的範圍內,並處理 無效的輸入。 如果Series類需要處理更復雜的電路邏輯,可以考慮使用設計模式(如組合模式、觀察者模式 等)來最佳化程式碼 將裝置(如Switch、MutexSwitch、GearSpeedController等)設計為具有共同介面或基類 的層次結構,以便在Series類中統一處理不同型別的裝置。 編寫單元測試來驗證Series類的功能和行為是否符合預期。這有助於確保程式碼的正確性和穩定 性。
一.家居強電電路模擬程式-4
-
前言:
1>.程式碼主要功能:
本次迭迭代只要是增加了計算個個裝置電壓的兩端引腳電壓的操作,還有計算個個點電壓,還需 要判斷個個裝置的經過的電流的大小是否超過這個裝置的最大電流如果超過則需要輸出提示 基本裝置類和裝置子類: 實現了一個裝置控制系統的基本框架,包括了裝置類(Device)、控制裝置類 (ControlDevice)、開關類(Switch)、分檔調速器類(GearSpeedController)、連續調速器 類 (ContinuousSpeedController)、受控裝置類(ControlledDevice)以及多種具體的受控裝置 類 (如白熾燈、日光燈、吊扇、落地扇等)。 其中,裝置類包括了裝置的基本資訊和屬性,並且裝置類為其他類提供了基本的屬性和方法繼承; 控制裝置類是裝置類的子類,用來實現具體的裝置控制邏輯;開關類實現了開關裝置的功能,可以 切換開關狀態並輸出相應電壓;分檔調速器類實現了分檔調速的功能,可以根據檔位調整輸出電 壓;連續調速器類實現了連續調速的功能,可以根據速度因子調整輸出電壓;受控裝置類是裝置類 的子類,用來實現具體的受控裝置的輸出計算邏輯;最後,具體的受控裝置類(如白熾燈、日光 燈、吊扇、落地扇)分別實現了自身的輸出計算邏輯,根據不同的電勢差計算出相應的輸出值。 其次是並聯和串聯類:這段程式碼主要是實現了電路中串聯電路和並聯電路的計算功能。其中 Series 類表示串聯電路,包括新增裝置、計算總電阻、判斷電路狀態(閉合或斷開)、計算裝置 之間的電壓差等功能;Parallel 類表示並聯電路,包括新增串聯電路、計算總電阻、設定電壓差 等功能在 Series 類中,透過 addDevices 方法可以向串聯電路中新增裝置並計算總電阻,透過 judgeCstate 方法判斷串聯電路中各裝置的狀態,透過 devicesV1_V2 方法計算各裝置的電壓 差。而在 Parallel 類中,透過 addCDevices 方法向並聯電路中新增串聯電路並計算總電阻, 透過 devicesV1_V2 方法設定並聯電路中各串聯電路的電壓差。 對於電壓的計算部分:遍歷第一系列(series1)中的電器裝置,查詢名稱為"M1"的裝置,將該設 備的電阻設定為並聯電阻的值,並重新給"M1"裝置賦予這個電阻值。 根據第一個電路裝置的型別進行判斷,計算總電路的電壓: 如果是開關裝置(Switch),根據開關狀態設定電壓為220.0或0.0。 如果是齒輪速度控制器(GearSpeedController),獲取其輸出電壓。 如果是連續速度控制器(ContinuousSpeedController),獲取其輸出電壓。 否則將電壓設定為220.0。 將計算得到的電壓賦值給總電路,並計算總電路中各個電器的電壓。 遍歷總電路中的裝置,如果裝置名稱是"M1",則將其電壓賦值給並聯電路。 對並聯電路中的每個串聯(Series)進行計算各個電器的電壓。 最後使用排序的程式碼對於個個裝置的型別和編號進行排序輸出個個裝置的狀態
2>.主要知識點:
以下是程式碼涉及到的主要知識點 1.透過 Scanner 和 System.in 來接收使用者的輸入,實現互動式輸入。 2.字串處理:使用了字串操作方法,如 startsWith、substring、split、charAt 等來處理 使用者輸入的字串。 3.多型:在往 devices 列表中新增裝置物件時,利用多型實現了將不同子類物件當作父類物件來處 理。 4.類繼承與物件例項化:定義了 Device 類及其子類 Switch、GearSpeedController、 ContinuousSpeedController、IncandescentLamp、FluorescentLamp、CeilingFan,並根據 使用者輸入的不同型別來例項化相應的子類物件。 5.透過對 devices 中的裝置進行遍歷查詢及強制型別轉換,實現了根據使用者輸入操作來對裝置進行 狀態控制。 6.使用了 switch-case 語句塊進行根據不同條件執行不同的操作。 7.採用了物件導向設計原則,如單一職責原則、開閉原則,使得程式碼結構清晰、易於擴充和維護。 8.遍歷迴圈:使用了 for 迴圈對裝置列表進行遍歷操作。 9. 訪問修飾符(Access Modifiers): private 修飾符用於限制屬性的訪問範圍,確保它們只能在類內部被訪問 10.介面和抽象類(儘管在示例中未直接顯示): 介面和抽象類允許定義不完整的類結構,其他類可以實現這些介面或繼承這些抽象類來提供具體的實
3>.題目的題量:
本次迭代的本題的題量是很多而且本次的新增的內容不是很多但是,本地的電壓反面的處理較為複雜 與麻煩,本次的迭代之中考慮的並聯裡面包含了並聯的操作,在本次的電壓處理中點的更為複雜很容 易產生錯誤,所以本次所迭代的程式碼的數量較為多,較為複雜,最為複雜的是二極體和互斥開關的引 腳電壓的處理,在這方面的程式碼的處理需要編寫相關的程式碼較為多,程式碼的量較多,我本次迭代的代 碼的長度為1000多行所以較為複雜
4>.題目難度:
本次的題目難度較為複雜,在本次的作業中我的測試點只過了七十多分的,整體的難度為一般,但 是對於部分的電壓處理還是較為複雜的
-
設計與分析:
-
採坑心得:
成員變數V1_V2的命名可能不夠直觀,因為它似乎表示兩個電壓之間的差值,但名稱中包含了下 劃線,可能讓人誤解為是兩個獨立的電壓值。建議考慮更清晰的命名,如voltageDifference。 Mresistance方法的命名不符合Java的命名規範,通常應該使用小寫字母開頭,並使用駝峰命名 法。例如,可以將其重新命名為addResistance。 在judgeCstate方法中,檢查電路 中的裝置(如開關和二極體)來確定電路是否閉合。但是,該方法沒有返回任何值,也沒有修改 cstate成員變數。需要修改此方法以返回電路的狀態,或者更新cstate的值。 二極體的狀態:在judgeCstate方法中,我檢查了二極體(Diode)的state成員變數。但是, 二極體是否“正向”通常不僅僅取決於其state變數,還取決於電流的方向和電壓的極性。 新增裝置的方法:在addDevices方法中,我同時新增了裝置和其電阻值。但是,這種方法假設 每個裝置都只有一個固定的電阻值,這可能不適用於所有型別的裝置需要考慮一個更通 用的方法來新增裝置,並允許在稍後設定或修改其電阻值。 電壓和電流的計算:在您的類中,雖然您儲存了電壓和電流的值,但您沒有提供方法來計算這些 值。在串聯電路中,總電壓是各個裝置電壓之和,總電流在各個位置是相等的。需要新增 方法來計算這些值。來簡化我的步驟,在我的方法之中的步驟很多沒有使用函式來多次呼叫
-
改進建議
class Series { private final String name; private double totalResistance; private double current; private boolean isClosed = false; private double voltageDifference; private List<Device> devices; public Series(String name) { this.name = name; this.devices = new ArrayList<>(); } public void addDevice(Device device) { // 假設Device類包含獲取電阻的方法 this.devices.add(device); this.totalResistance += device.getResistance(); // 假設有 getResistance()方法 } public boolean isClosed() { return isClosed; } public void calculateState() { isClosed = true; // 假設初始為閉合 for (Device device : devices) { if (device instanceof Switch && !((Switch) device).isClosed()) { isClosed = false; break; } // 新增對其他裝置型別的檢查... } } // ... 其他方法,如計算電壓、電流等 } // 示例的Switch類 class Switch implements Device { private boolean isClosed; private double resistance; // 當開關閉合時的電阻 // ... 建構函式、getter、setter等 public boolean isClosed() { return isClosed; } // ... 其他方法 }
總結:
在作業7的迭代之中,增加了互斥開關和智慧窗簾兩個類,這兩個類中較為難處理的就是互斥開關的處
理,重點在於互斥開關的類的設計,本次的類的設計之中我將一個互斥開關拆分成了兩個普通開關,與
普通開關不同的是這個開關帶有引腳號2 3,還有一個重點是並聯與並聯的串聯,做好並聯與並聯的串
聯需要將並聯當作是一個帶有電阻的裝置,簡化成一個整體來進行操作,將這個簡化的整體賦值電阻,
在總串聯裝置之中計算電壓,最後將並聯裡的裝置進行計算電流和電壓的操作,處理好這兩個重點基本
就可以完成大部分的測試點
在作業8的迭代之中,第一個重點是並聯裡面包含了並聯的這個功能,需要處理號這個功能就需要將電
路簡化,最間的方法就是將並聯整體看作是一個具有電阻的裝置去處理這個重點,最後容易出錯的點是
在電壓的計算過程之中,電壓的賦值操作,由於是並聯裡面含有並聯所以這個電壓的賦值操作較為麻
煩,容易出錯。第二個重點就是計算個個裝置的引腳電壓的操作,計算引腳的電壓需要計算好這個裝置
的電勢差,還需要計算這個裝置的引腳的初始電壓,而初始電壓的計算需要從開始220起始開始計算,
所以簡單的並聯包含並聯的電路還是能計算出來,但是本題的難點是二極體和互斥開關的計算過程,二
極管的計算需要考慮的條件我也沒有太搞明白,最後四個測試點沒有同學透過,互斥開關的計算也較為
麻煩,主要是互斥開關具有三個引腳
本次的電路系統的四次迭代完成,整體來說還算不錯,透過了大部分的測試點,但是不足的地方還是有
很多,在我自己編寫的程式碼的時候我只會考慮程式碼的邏輯而不太會考慮程式碼的可讀性,所以我的程式碼
的長度還是較為隆長不太容易理解,本次的迭代之中我也學習到了很多的知識點,主要學習到的是根據
題目去編寫相關的程式碼功能這一思路的提升,加油~