OOP第三次部落格作業

Gaadwd發表於2024-06-29

目錄
  • 前言:
  • 設計與分析:
    • opp-7-家居強電電路模擬程式-2
    • opp-8-家居強電電路模擬程式-2
  • 踩坑心得:
    • opp-5-家居強電電路模擬程式-3踩坑和心得:
    • opp-5-家居強電電路模擬程式-4踩坑和心得:
  • 總結:

前言:

oop-7相比與oop-6僅增加了兩個電子元件,一個互斥開關,一個受控窗簾,除了最佳化了排序類,其他程式碼基本上沒有進行修改,可以說基本上實現了開閉原則。因此本次大作業也未花費多少時間,是八次大作業裡花費時間最少的,一個好的設計確實可以大大加快任務的完成速度。
oop-8增加了引腳電壓的的輸出,作業難度大大增加,複雜電路的電壓分配對於我來說有點太過複雜了,還增加了一個二級管,不過這並未給本次作業增加多少難度,難點在解決引腳電壓的輸出問題上,最後程式碼的增加量倒是不大,之前的程式碼也並未做太大的修改,主要問題就是電路的電壓問題搞不明白。
難度(1-10):
oop-7:5
oop-8:10
知識點:
(1)類與物件:Java物件導向程式設計的核心,透過定義類和建立物件,實現大作業中的基本且必要操作。
(2)字串與陣列:處理輸入資訊的關鍵,字元陣列儲存char型別資料,支援資訊訪問、宣告、初始化、對比和轉換。
(3)正規表示式:高效處理輸入資訊,匹配特定字元和擷取字串,結合字串轉換,在大作業中發揮重要作用。
(4)ArrayList應用:資料儲存與呼叫的便捷選擇,避免類陣列越界問題,提升資料儲存安全性與便利性。
(5)抽象與繼承:資料類定義時採用繼承,最佳化類整理與操作,統一處理各類電器時僅需呼叫父類方法。
(6)介面的使用。

設計與分析:

opp-7-家居強電電路模擬程式-2

類圖:

  • 之前的類有父類(Electronic),以及它的子類:開關類(Switch)、兩種燈類(FluorescentLamp,IncandescentLamp)、兩種調速器類(BinningGovernor,ContinuousGovernor)、吊扇類(CeilingFan),還有一個代理類(Agent),該類負責處理輸入資訊。串聯類(Tandem)、並聯類(Parallel)、落地扇類(FloorFan),這三都是電子元件類(Electronic)的子類。排序類(SortPrint)。
  • 本次大作業新增類:互斥開關類(MutexSwitch)、受控窗簾類(Curtain).
  • 因為受控窗簾的開啟程度受房間亮度的影響,所以本次大作業在兩種燈和窗簾中新增了光照屬性(brightness),在Agent類中新增了public void setBrightness() 方法給所有窗簾的brightness屬性賦值。
  • 對於互斥開關,我的處理方式是一個開關創造了兩個物件,二者除了序號(int id),其他全部相同,他們分別連線於不同的電路中,追後輸出序號0的資訊(它的電阻,開閉情況等屬性皆為陣列形式,陣列大小為二)。最後排序類會刪除名字重複的物件,只保留一個並排序。
  • 大體執行思路為(在接收全部輸入資訊後):計算電路總電阻->用220v電壓(如果有調速器按調後電壓計算)除總電阻得總電流->電子元件透過傳入的總電流計算其所分到的電壓->依照該電壓輸出對應的工作狀態。
    程式碼SourceMontor的生成報表內容:

    程式碼長度1081,最大深度為5(主要是因為Agent類裡處理資訊時if和for的巢狀太多),平均深度1.21.

opp-8-家居強電電路模擬程式-2

類圖:

  • 相比上次大作業,本次大作業新增二極體類(Diode),繼承於Electronic類。
  • 在父類Electronic新增方法public double enterV_outV(double enterV)(部分子類對該方法進行了重寫),新增了屬性enter_V和out_V用於處理引腳電壓的輸出問題。
  • 大體執行思路為(在接收全部輸入資訊後):計算電路總電阻->用220v電壓(如果有調速器按調後電壓計算)除總電阻得總電流->電子元件透過傳入的總電流計算其所分到的電壓->用public double enterV_outV(double enterV)方法對1、2引腳的電壓進行賦值->依照該電壓輸出對應的工作狀態和引腳電壓。
    程式碼SourceMontor的生成報表內容:

    程式碼長度1287,其他資訊較前一次無太大區別

踩坑心得:

opp-5-家居強電電路模擬程式-3踩坑和心得:

本次大作業寫的十分順暢並未遇到除小細節(電阻敲錯了,自動生成return 0沒改成return R)之外的問題。

opp-5-家居強電電路模擬程式-4踩坑和心得:

1,引腳順序問題:
在之前的程式碼中我只考慮了進入電壓和輸出電壓,這在普通用電器上並無問題,但並不能滿足二極體和互斥開關(它們能反連),第一個解決方法是在處理資訊時識別引腳號,但是工作量大容易出錯,最後我採用的第二個解決方法是在二極體和互斥開關中新增方向屬性,若為反,則逆序輸出enter_V和out_V,該方法只有兩種類處理資訊時需要識別引腳號。
2,斷路的前後電壓問題:
例如對於一個斷開的開關,它的後電壓為零,前電壓不為零,未修改前的方法前後電壓相等(都為前者電壓),後續電子元件的電壓也為該電壓,原out_V的計算為enter_v-V(該V為電器本身分到的電壓,因斷路,電流為零,V=I*R=0),最後在開關類重寫public double enterV_outV(double enterV)方法解決該問題(新增了開閉判定)。
3,互斥開關倆物件資訊不互通問題:
由前面所述,同一開關有兩物件他們分別連倆個電路,最後刪除一個,但他們的進出電壓資訊不互通,零2和3引腳有一個未賦值,最後在刪除前新增程式碼互通訊息後解決該問題

for(MutexSwitch m:agent.mutexSwitches)
        {
            if(this.mutexSwitches.size()<1)
            {
                this.mutexSwitches.add(m);
            }
            else
            {
                boolean flag=true;
                for(int i=0;i<this.mutexSwitches.size();i++)
                {
                    if(this.mutexSwitches.get(i).getName().equals(m.getName()))
                        flag=false;
                }
                if(flag)
                    this.mutexSwitches.add(m);
            }

        }
        for(MutexSwitch m:this.mutexSwitches)
        {
            for(MutexSwitch M:agent.mutexSwitches)
            {
                if((M.getName().equals(m.getName()))&&(M.getId()!=m.getId()))
                {
                    m.t_enterV[M.getId()]=M.t_enterV[M.getId()];
                    m.t_outV[M.getId()]=M.t_outV[M.getId()];
                }
            }
        }

4,還有區域性短路引腳電壓問題,複雜電路引腳電壓問題(未解決)

總結:

本次介紹了兩個連續的大作業專案:oop-7和oop-8,它們分別模擬了家居強電電路的不同版本。oop-7在原有基礎上增加了互斥開關和受控窗簾兩個電子元件,最佳化了排序類,並遵循了開閉原則,使得程式碼修改量小且高效。oop-8則進一步增加了引腳電壓的輸出和二極體類,作業難度顯著提升,主要集中在解決引腳電壓輸出問題上。

  • oop-7特點

增加了互斥開關和受控窗簾兩個電子元件。
最佳化了排序類,遵循開閉原則。
實現了光照屬性以影響窗簾的開啟程度。
程式碼修改量小,大作業完成時間較短。

  • oop-8特點

增加了引腳電壓的輸出和二極體類。
父類Electronic新增方法處理引腳電壓。
作業難度大幅提升,主要集中在引腳電壓的計算和輸出上。
程式碼長度雖未顯著增加,但理解和解決電壓問題較為複雜。

  • 透過這兩個大作業專案,不僅加深了對Java物件導向程式設計的理解,還鍛鍊瞭解決實際問題的能力,特別是在處理複雜電路模擬方面的能力得到了顯著提升。