天天看點

日程功能子產品【從模組化到代碼實作】UML + JavaFX

結合 uml 所學和 Javafx 從模組化到實作一個子功能子產品 —— 日程管理。新手上路,類圖到代碼實作的過程還是很曲折但所幸收獲頗豐,記錄一下學習心得。

JAVAFX裡面沒有封裝月曆控件,找了些項目源碼做參照肝了一個,不過為了簡化分析的過程,不會詳細寫其中業務邏輯。

總的來說,從模組化帶代碼實作的功能完成了90%,日程清單和月曆的通信沒寫,預期效果是如果有新增的日程,月曆上相應的月曆塊會有 marked 的标記。這一塊按照我的想法寫代碼會變得很亂,也是模組化過程中沒有認真考慮的點。

日程功能子產品【從模組化到代碼實作】UML + JavaFX
日程功能子產品【從模組化到代碼實作】UML + JavaFX

日程主要是幫助使用者檢視和管理日常事務,使用者可以記錄待辦事件并且設定提醒時間,有助于管理時間和提高工作效率。

而作為成績管理系統學生界面的一個子功能子產品,除了幫助學生管理課程和學習任務,它還需要能自動導入課程考試資訊,便于學生規劃學習進度。

用例圖

從需求分離出對象為學生。把所有有意義的動賓短語先列出來【檢視日常事務】,【管理日常事務】,【記錄待辦事件】,【設定提醒時間】,【自動導入課程考試資訊】。這裡是因為需求比較直覺簡單,一般還需要根據語義找隐藏的功能需求。

進一步分析用例之間的關系,【管理日程事務】即對日程做删改,應該是在標明具體的事務後。【記錄待辦事件】即建立日程,包括【設定提醒時間】等資訊設定。【自動導入課程資訊】應該不是由學生完成的,學生隻能檢視,是以還有參與者 —— 考試管理系統。

畫出用例圖如下

心得:在畫用例圖時并沒有花太多時間打磨,建構的快也修改的快。從需求快速提取用例,在寫用例描述的時候還會再倒回來修改的

日程功能子產品【從模組化到代碼實作】UML + JavaFX
參考老師發的資料,從用例圖如何到類圖,觀點不一。有從活動圖 ——> 類圖以及從詳細的用例描述中抽象出類圖,兩種都參考嘗試了一下。

用例描述

用例編号

S1.1

用例名稱

檢視日程詳細資訊

參與者

學生

觸發條件

點選清單中具體的一項日程

前置條件

學生已經登入,并且在日程界面

後置條件

顯示目标日程的詳細資訊

正常流程

1. 點選清單中目标日程,顯示日程資訊

擴充流程

1. 編輯目标日程,修改事件資訊 2. 删除目标日程

特殊要求

S1.2

新增日程

點選“新增日程”按鈕

添加了新的日程到月曆,對應日期格顯示 marked

1. 點選“新增日程”按鈕,打開日程建立面闆 2. 填寫事件,設定時間段 3. 選擇是否設定提醒時間 4. 點選“送出”按鈕

1. 取消建立日程

S1.3

檢視考試安排

點選“檢視考試安排”按鈕

顯示顯示本學期所有考試安排

1. 點選“檢視考試安排”按鈕,顯示考試安排面闆

1. 添加提醒

日程功能子產品【從模組化到代碼實作】UML + JavaFX
日程功能子產品【從模組化到代碼實作】UML + JavaFX

較為傾向于從用例描述中抽象出類,老師發的資料中也寫到,用例描述占據着皇後的位置,而三王一後中沒有出現活動圖。我在寫完用例描述後對程式也已經有了輪廓。

日程功能子產品【從模組化到代碼實作】UML + JavaFX

學習部落格【深入淺出UML類圖】

從用例描述中,抽象出所有的類。我們先提取實體類,有日程類,以及填充月曆的日期格類。邊界類這裡就是界面類,有日程主界面類,添加日程的界面類,兩個界面類分别都有控制類實作相關的業務邏輯。界面類裡面的部件主要是月曆類,日程清單類,考試清單類。

日程功能子產品【從模組化到代碼實作】UML + JavaFX

先把實體類的屬性寫好,日程類我們很容易可以知道,有日程名稱,開始和截止時間,提醒時間。使用者在填寫事件時,可能還有一些額外的資訊需要提醒自己,那麼就添加一個事件備注屬性。

日期格類應該包含的是目前格子表示的日期,因為我們還可以直接看到這個格子是否有日程,應該是抽象為一個狀态。這裡我預備用布爾型 isMarked 來表示。(當時寫的時候還加了Mark屬性,作為如果存在日程的标記,多餘了。

然後進一步思考類之間的關系,先看聚合關系,ScheduleList 和 ExamList 都是由 Schedule 聚合而來,但 ExamList 屬于特殊的日程,它在這裡隻能檢視不能修改。日期格和月曆Calendar也是聚合關系,我的想法是按月顯示,那關系就是一個月曆中由35個日期格。

考試清單,日程清單和月曆都屬于主界面的部件。最後得到類圖如下

日程功能子產品【從模組化到代碼實作】UML + JavaFX

主界面我直接用的做平時成績管理系統的界面稍加改動,已經有基本布局和css渲染。添加新日程界面根據用例描述,就是有對日程基本資訊的編輯,然後确認取消按鍵。

下面是靜态初始界面,還沒有實作任何功能隻是個UI。

日程功能子產品【從模組化到代碼實作】UML + JavaFX
日程功能子產品【從模組化到代碼實作】UML + JavaFX
日程功能子產品【從模組化到代碼實作】UML + JavaFX

月曆是用GirdPane寫的,每一個日期格都繼承AnchorPane,便于在内部進行布局

日程功能子產品【從模組化到代碼實作】UML + JavaFX

ScheduleList 有 Schedule 的聚合,初始化我們從資料庫導入資料(因為用到資料庫的地方較少,就不分離出來的(絕不是懶:/,删除和修改的方法這裡暫時不寫。

ExamList 直接從資料庫初始化資料之後不再會變化,是以它包含的應該是 final static 的 Schedule 數組,與上面類似就已經完成了。

日程功能子產品【從模組化到代碼實作】UML + JavaFX

月曆類其中涉及細節較多,這裡把它當作已經封裝好的月曆控件FXCalendar。根據類圖,我們要完成的時在按上月和下月的按鈕時,月曆要做出變化。

兩個按鈕觸發的行為實作代碼

可以看到上面調用了 changeCalendar() 方法來實作月曆的變化,下面是 changeCalendar() 代碼實作

在主界面按下添加日程按鍵是觸發新增日程界面資訊,每次都會産生一個新的界面,一個主界面可以有多個添加日程界面。

我們從類圖中得知,主要有填入事件資訊,是否需要提醒,确認添加和取消操作。(這裡在編寫的時候就發現,類圖的不足之處,打開提醒應該是由控制類來完成。

填入事件資訊是在界面中完成的

确認添加事件 getNewScheduleButton()

确認和取消都會觸發視窗的關閉,而視窗是在主界面控制類生成的,在這裡需要擷取目前按鈕所在視窗來關閉

是否提醒

到這裡,添加日程界面和控制類都完成了

這裡有個十分迷惑的小bug,雖然處理了。但還是不知道為什麼,希望有大佬解惑

<code>ClickedID</code>是在監聽日程清單中被滑鼠選中的事件編号。

檢視選中日程時,生成對話框來提示選中日程的所有細節。

list 做出的相應操作

日程功能子產品【從模組化到代碼實作】UML + JavaFX

從類圖到代碼仍舊花了不少時間在不斷思考如何組織和實作,一度想不管結構全部累在一起,這裡類圖起了一個很大的規範作用。它在設計階段,規範好整個架構,讓我先對業務流程有了大緻的輪廓。如果感覺有錯誤,可以在類圖階段就修改,而不是等到實作時修改代碼,減小犯錯成本。

一個是命名規範,當時設計類圖命名比較草率,導緻在代碼累積下來後不能見名知意,是以重構了代碼并且修改類圖中類和方法的命名;

第二個是方法的參數和傳回值,類圖設計時我對每個方法都寫了形參和傳回值,但具體實作時大機率會發生變化,比如删除日程那隻需要傳遞日程ID,而不是把Schedule傳過去;

其出現兩個問題,其一是在根據類圖實作代碼時發現有些細節沒有考慮到,需要在實作時再花時間來設計。其二是根據類圖的設計無從下手,有我Java功底尚淺的原因,但也可能是因為設計的不合理。

類圖設計的快,可能會有細節被忽略;類圖設計的慢,不斷打磨精細,如果後續要修改,可能因為投入了較多的時間成本不想修改。

這次從模組化到實作,收獲很大,真的感受到一個好的模組化可以讓整個功能實作更加高效。我的模組化可能還很不規範,之後還是多實踐和總結!

本文來自部落格園,作者:01kkkrill,轉載請注明原文連結:https://www.cnblogs.com/krill/p/15612609.html

繼續閱讀