結合 uml 所學和 Javafx 從模組化到實作一個子功能子產品 —— 日程管理。新手上路,類圖到代碼實作的過程還是很曲折但所幸收獲頗豐,記錄一下學習心得。
JAVAFX裡面沒有封裝月曆控件,找了些項目源碼做參照肝了一個,不過為了簡化分析的過程,不會詳細寫其中業務邏輯。
總的來說,從模組化帶代碼實作的功能完成了90%,日程清單和月曆的通信沒寫,預期效果是如果有新增的日程,月曆上相應的月曆塊會有 marked 的标記。這一塊按照我的想法寫代碼會變得很亂,也是模組化過程中沒有認真考慮的點。
日程主要是幫助使用者檢視和管理日常事務,使用者可以記錄待辦事件并且設定提醒時間,有助于管理時間和提高工作效率。
而作為成績管理系統學生界面的一個子功能子產品,除了幫助學生管理課程和學習任務,它還需要能自動導入課程考試資訊,便于學生規劃學習進度。
用例圖
從需求分離出對象為學生。把所有有意義的動賓短語先列出來【檢視日常事務】,【管理日常事務】,【記錄待辦事件】,【設定提醒時間】,【自動導入課程考試資訊】。這裡是因為需求比較直覺簡單,一般還需要根據語義找隐藏的功能需求。
進一步分析用例之間的關系,【管理日程事務】即對日程做删改,應該是在標明具體的事務後。【記錄待辦事件】即建立日程,包括【設定提醒時間】等資訊設定。【自動導入課程資訊】應該不是由學生完成的,學生隻能檢視,是以還有參與者 —— 考試管理系統。
畫出用例圖如下
心得:在畫用例圖時并沒有花太多時間打磨,建構的快也修改的快。從需求快速提取用例,在寫用例描述的時候還會再倒回來修改的
參考老師發的資料,從用例圖如何到類圖,觀點不一。有從活動圖 ——> 類圖以及從詳細的用例描述中抽象出類圖,兩種都參考嘗試了一下。
用例描述
用例編号
S1.1
用例名稱
檢視日程詳細資訊
參與者
學生
觸發條件
點選清單中具體的一項日程
前置條件
學生已經登入,并且在日程界面
後置條件
顯示目标日程的詳細資訊
正常流程
1. 點選清單中目标日程,顯示日程資訊
擴充流程
1. 編輯目标日程,修改事件資訊 2. 删除目标日程
特殊要求
無
S1.2
新增日程
點選“新增日程”按鈕
添加了新的日程到月曆,對應日期格顯示 marked
1. 點選“新增日程”按鈕,打開日程建立面闆 2. 填寫事件,設定時間段 3. 選擇是否設定提醒時間 4. 點選“送出”按鈕
1. 取消建立日程
S1.3
檢視考試安排
點選“檢視考試安排”按鈕
顯示顯示本學期所有考試安排
1. 點選“檢視考試安排”按鈕,顯示考試安排面闆
1. 添加提醒
較為傾向于從用例描述中抽象出類,老師發的資料中也寫到,用例描述占據着皇後的位置,而三王一後中沒有出現活動圖。我在寫完用例描述後對程式也已經有了輪廓。
學習部落格【深入淺出UML類圖】
從用例描述中,抽象出所有的類。我們先提取實體類,有日程類,以及填充月曆的日期格類。邊界類這裡就是界面類,有日程主界面類,添加日程的界面類,兩個界面類分别都有控制類實作相關的業務邏輯。界面類裡面的部件主要是月曆類,日程清單類,考試清單類。
先把實體類的屬性寫好,日程類我們很容易可以知道,有日程名稱,開始和截止時間,提醒時間。使用者在填寫事件時,可能還有一些額外的資訊需要提醒自己,那麼就添加一個事件備注屬性。
日期格類應該包含的是目前格子表示的日期,因為我們還可以直接看到這個格子是否有日程,應該是抽象為一個狀态。這裡我預備用布爾型 isMarked 來表示。(當時寫的時候還加了Mark屬性,作為如果存在日程的标記,多餘了。
然後進一步思考類之間的關系,先看聚合關系,ScheduleList 和 ExamList 都是由 Schedule 聚合而來,但 ExamList 屬于特殊的日程,它在這裡隻能檢視不能修改。日期格和月曆Calendar也是聚合關系,我的想法是按月顯示,那關系就是一個月曆中由35個日期格。
考試清單,日程清單和月曆都屬于主界面的部件。最後得到類圖如下
主界面我直接用的做平時成績管理系統的界面稍加改動,已經有基本布局和css渲染。添加新日程界面根據用例描述,就是有對日程基本資訊的編輯,然後确認取消按鍵。
下面是靜态初始界面,還沒有實作任何功能隻是個UI。
月曆是用GirdPane寫的,每一個日期格都繼承AnchorPane,便于在内部進行布局
ScheduleList 有 Schedule 的聚合,初始化我們從資料庫導入資料(因為用到資料庫的地方較少,就不分離出來的(絕不是懶:/,删除和修改的方法這裡暫時不寫。
ExamList 直接從資料庫初始化資料之後不再會變化,是以它包含的應該是 final static 的 Schedule 數組,與上面類似就已經完成了。
月曆類其中涉及細節較多,這裡把它當作已經封裝好的月曆控件FXCalendar。根據類圖,我們要完成的時在按上月和下月的按鈕時,月曆要做出變化。
兩個按鈕觸發的行為實作代碼
可以看到上面調用了 changeCalendar() 方法來實作月曆的變化,下面是 changeCalendar() 代碼實作
在主界面按下添加日程按鍵是觸發新增日程界面資訊,每次都會産生一個新的界面,一個主界面可以有多個添加日程界面。
我們從類圖中得知,主要有填入事件資訊,是否需要提醒,确認添加和取消操作。(這裡在編寫的時候就發現,類圖的不足之處,打開提醒應該是由控制類來完成。
填入事件資訊是在界面中完成的
确認添加事件 getNewScheduleButton()
确認和取消都會觸發視窗的關閉,而視窗是在主界面控制類生成的,在這裡需要擷取目前按鈕所在視窗來關閉
是否提醒
到這裡,添加日程界面和控制類都完成了
這裡有個十分迷惑的小bug,雖然處理了。但還是不知道為什麼,希望有大佬解惑
<code>ClickedID</code>是在監聽日程清單中被滑鼠選中的事件編号。
檢視選中日程時,生成對話框來提示選中日程的所有細節。
list 做出的相應操作
從類圖到代碼仍舊花了不少時間在不斷思考如何組織和實作,一度想不管結構全部累在一起,這裡類圖起了一個很大的規範作用。它在設計階段,規範好整個架構,讓我先對業務流程有了大緻的輪廓。如果感覺有錯誤,可以在類圖階段就修改,而不是等到實作時修改代碼,減小犯錯成本。
一個是命名規範,當時設計類圖命名比較草率,導緻在代碼累積下來後不能見名知意,是以重構了代碼并且修改類圖中類和方法的命名;
第二個是方法的參數和傳回值,類圖設計時我對每個方法都寫了形參和傳回值,但具體實作時大機率會發生變化,比如删除日程那隻需要傳遞日程ID,而不是把Schedule傳過去;
其出現兩個問題,其一是在根據類圖實作代碼時發現有些細節沒有考慮到,需要在實作時再花時間來設計。其二是根據類圖的設計無從下手,有我Java功底尚淺的原因,但也可能是因為設計的不合理。
類圖設計的快,可能會有細節被忽略;類圖設計的慢,不斷打磨精細,如果後續要修改,可能因為投入了較多的時間成本不想修改。
這次從模組化到實作,收獲很大,真的感受到一個好的模組化可以讓整個功能實作更加高效。我的模組化可能還很不規範,之後還是多實踐和總結!
本文來自部落格園,作者:01kkkrill,轉載請注明原文連結:https://www.cnblogs.com/krill/p/15612609.html