OOP七,八次作業總結

loye320發表於2024-06-29

OOP四到六次作業總結
一.前言:
第七八次為家庭電路分析程式。
在第七次作業中,家庭電路系統,匹配類設計不當
在第八次作業中,我修改了輸出類,並最佳化類的設計

二,設計與分析:
1.家居強電電路模擬程式-3(第七次作業)
在本次作業中,我對類的設計較為直白,輸出類也沒有進行最佳化,在資料計算為完畢後進行輸出,然而這可能導致排序出現錯誤。
此外,由於匹配原則的修改,對於匹配類的設計出現失誤,使用非必要的迴圈巢狀導致出現錯誤,我對匹配函式進行修改,區別於前兩次作業,匹配的結構更加清晰。
同時,計算方法較為複雜,if條件判斷使用過多,導致部分特殊結構分析出錯。
在後續作業中,我對父類設計與計算方法設計進行最佳化。
此次作業我對類間關係設計進行了最佳化,例如,首先提取資料時分別將其存入Arraylist內,然後在試卷類中使用Arraylist存放電器類,使得對分數進行計算時對T與M類的匹配更加清晰方便。
此次作業的思考讓我對類的設計與類間關係有了更加清晰的認識,進行大型程式的設計時,優先考慮類的關係,這樣思路就比較清晰,然後進行類的設計,然後進行資料讀取的設計。過去思路較為凌亂,總是先考慮類的設計而忽略了類關係的設計,導致手忙腳亂,不停的修改類的設計。
複雜類圖如下:
可見對於匹配的設計過於繁雜,後續進行最佳化

UML圖如下:
對於匯流排類設計也應繼承於Appliance父類,便於遍歷


2.家居強電電路模擬程式-4(第八次作業)
在本次作業中我對輸出類進行最佳化
增設sort方法,便於進行統一排序,最佳化輸出結構。
增設二極體類。
同時我將匯流排類設計為Appliance的子類,增設並聯電路。便於對匯流排進行遍歷。
在遍歷時加入對短路的判斷,在進行電阻計算,斷路判斷後,進行分壓計算式加入對電流判斷,過大短路。
同時對計算方法進行改進,減少if條件判斷的使用。最佳化電壓的計算,最佳化了遍歷結構,便於進行計算。
同時對排序後的輸出進行修改。
但是對於子類的設計仍略顯繁雜,計算方法仍有改進空間。
複雜度:

可見總計算方法較複雜
UML圖如下

三,採坑心得

  1. if結構使用過多,導致許多特殊情況測試失敗,且導致程式難以修改,導致可擴充性大大降低。在進行程式初步設計時,應對特殊情況進行考慮,思考普遍性方法,減少if結構使用,以提高程式可擴充性
  2. 對於資料的讀入,應綜合使用split方法,charAt方法與正規表示式,正規表示式匹配精確且分組方便,便於後續對資料進行處理,但使用步驟較為繁雜,且資料結構發生變化時,需不斷進行修改。Split方法用於對字元產基於某字元的分組,使用很方便,但分組結構會產生錯誤,甚至需要多次使用達到精確分組效果。charAt方法用於對字元某字元進行提取,圖區極為精確,但提取字元較少,使用情況較少。
  3. 對於輸出,在資料計算後進行輸出顯然不夠嚴謹,可能導致排序錯誤,計算混亂等,可以增設輸出類或使對應類實現comparable介面,便於排序,輸出。
    此外,諸如,基礎資料變數初始化時需賦值,類變數的引用,public,private等變數修飾符的使用,這樣的細節問題需注意。
  4. 對於正規表示式的使用,如果在Java字串中編寫正規表示式時,你需要考慮雙重轉義。例如,要匹配一個字面點號(.),你需要在Java字串中寫\.此外,不要在迴圈中重複編譯相同的正規表示式,因為這會降低效能,可能導致迴圈無法結束。預設情況下,正規表示式會嘗試匹配輸入字串的任何部分。如果你想確保整個字串都匹配正規表示式,你應該使用^和$來分別匹配字串的開始和結束。
  5. 對於迴圈巢狀,巢狀的迴圈可能會使程式碼難以閱讀和維護。嘗試簡化邏輯,減少巢狀層數,如果必須使用巢狀迴圈,確保每一層迴圈的目的都很清晰,並且邏輯上能夠很好地組織在一起。

四,改進建議

  1. 提高程式可讀性,例如
    將長方法拆分成多個短方法,每個方法執行一個特定的任務,使用有意義的名稱,使程式碼更易於閱讀和理解。刪除重複的程式碼塊,並使用方法、類或庫來重用程式碼。為程式碼新增適當的註釋,解釋程式碼的目的、行為以及任何重要的假設。
    例如各個類的設計,名稱,方法設計進行最佳化,有利於後續對於程式的修改,以及電壓計算方法的簡化。
  2. 對於集合的使用,善於利用各種集合會使程式大大簡化。Arraylist類似於陣列,方便遍歷修改增加等操作,hashmap中鍵值對的使用使用資料的對應使用更加方便,但同時也由於只能存鍵值對導致遍歷相對繁瑣。set類似於數學中集合,其中元素不重複,不同於前兩個,元素按照大小進行排列。每種資料儲存結構均有其優缺點,明細這一點對程式進行改善。據需求選擇合適的資料結構。例如,如果需要頻繁地插入和刪除元素,LinkedList可能更適合;如果需要快速查詢元素,HashMap或HashSet可能更合適。
    在本次作業中,將各個小電器使用HashMap儲存,會使對匯流排遍歷更加方便簡潔。
  3. 對於程式可擴充性,善於使用介面,抽象類會事半功倍
    介面和抽象類可以定義一組規範,由不同的類來實現這些規範。實現解耦,透過將實現與介面分離,可以提高程式碼的靈活性和可擴充套件性。
    使用模組化設計,使應用程式的組成部分更加清晰,有助於應用程式的擴充套件。每個模組都可以獨立開發、測試和維護。
    例如對於計算方法的設計,進行模組化設計,可大大減少其複雜度。
  4. 學習使用便捷的開發工具,例如idea,可利用其廣泛的外掛市場進行對程式碼的解讀,修改。
  5. 單一職責原則、開放封閉原則、里氏替換原則、介面隔離原則和依賴倒置原則。將常量、配置和引數值儲存在配置檔案或資料庫中,以便於修改和維護。

五,總結
在近幾次作業中,最大的問題仍然是輸出結構與if結構的使用,在後續作業中,我會著重於對這兩方面進行修改
此外,對於各種介面,例如可比較性等,資料集合的使用會使程式設計事半功倍,隨著java學習不斷深入,我對這些資料集合,介面的使用會更加熟練,深入,提高程式便捷性。
善用idea等開發工具,使用其廣泛的外掛,可以便捷的對程式進行解讀,例如類圖,複雜度外掛。
在Java學習後期,我已經掌握了Java語言的基礎知識和核心概念,同時我不斷地深化和擴充套件自己的知識體系,掌握更多的高階特性和技術。我透過實踐來加深對Java語言的理解和掌握。同時,我需要關注Java社群和行業動態,瞭解最新的技術趨勢和最佳實踐,以便不斷提升自己的技術水平。
我認為java語言的上限較高,意味著我仍有很長的學習java之路要走。不斷練習,最重要的是不斷練習,透過編寫各種型別的程式來鞏固所學知識,並逐步提升程式設計能力。

此外,在學習的過程中,只有透過不斷地學習和實踐,才能真正掌握Java語言,並在未來的職業發展中取得更好的成績。