面向物件實戰
一 引子
學完了面向物件的基礎知識後,很明顯你還是不知該如何下手,凡是都得有個章法
此刻有經驗的人可能會想到瀑布模型、螺旋模型、迭代開發、敏捷、RUP等一堆軟體工程相關的軟體開發流程,但對於大部分人來說這些流程僅僅只是專案管理上的流程
本節我們就帶大家來了解下,作為一名程式設計師基於面向物件開發程式的開發流程:
需求模型->領域模型->設計模型->實現模型
二 需求模型之5w1h8c
1. 需求VS功能
需求:客戶想要的效果,對客戶有價值的事情
功能:系統為了實現客戶的價值而提供的能力/功能
舉例:
汽車:駕駛是需求,剎車、加速、轉彎是功能
印表機:列印是需求,進紙、設定、與電腦連線等是功能
pos機:買單是需求,商品掃描、金額彙總、收銀等是功能
2. 需求的重要性
1/3的專案失敗或陷入困境是因為需求原因導致的
garbage in,garbage out
屎上了生產餅乾的流水線,最後產出的是像餅乾一樣的屎
修復需求錯誤的問題成本極高
1 編碼階段修復發現一個錯誤耗費人類是1個單位
2 測試階段修復需求錯誤的成本是5-10倍
3 維護階段(產品上線後),修復需求錯誤成本是20倍
ps:在需求階段修復錯誤,成本只需要0.1-0.2即可
結論:需求錯了,幾乎要把軟體專案重做一遍
3. 需求分析的目的
1 記錄員,記錄客戶的需求
2 分析員,和客戶一起分析,完善需求
3 引導員,能夠引導客戶的需求
4. 需求分析的方法
需求分析518方法,簡稱我要發,具體就是5w1h8c
5w:
when:使用者想在什麼時間用,例如半夜備份的任務,很明顯我們得知該需求需要自動化執行
where:使用者想在什麼地方用,例如垃圾桶室內和室外的區別,同樣的事物放到不同地方用肯定不一樣
who:使用者想讓誰來用,不僅是人,也可以是一個系統
what:使用者想要我們程式的輸出結果是什麼,如圖片,文件,系統
why:問一問使用者為什麼要這麼做,(你不問,他基本不說),包括客戶所有覺得不爽的事情
ps:why是核心
1h:how
用例方法
8c:8個constraint約束
效能performance
效能是系統提供相應服務的效率。主要包括響應時間、吞吐量
效能是很多系統架構設計的關鍵約束條件之一
例如,同樣一個web網站,雖然都是提供資訊給使用者流量,設計一個日訪問量1w的網站與日訪問量10億的網站,二者的設計截然不同
成本cost
成本指為了實現系統而需要付出的代價
成本也是很多系統架構設計的關鍵約束之一
例如客戶只願意花100w,而我們卻設計了一個耗費1000w的系統
時間time
指客戶要求什麼時候交付
可靠性reliability
指系統長時間正確執行的能力,銀行、證券、電信這些公司,對宕機時間要求很嚴格
安全security
指對資訊保安的保護能力,涉及到錢、身份證、社會保險號等需求對這個要求很高
合規性compliance
指滿足各種行業標準、法律法規、規範等,例如3C、SOX、3GPP,ITUT
技術性technology
有的客戶可能要求我們採用某種技術
例如客戶現在都是windows伺服器,要求我們基於windows平臺開發
相容性compatibility
指我們的產品與客戶其他已有的產品或系統的相容能力,要知道現在很少有產品是孤立執行的,特別是在大企業、大公司中,多個系統都是相互互動、互相配合的。新的系統必須能夠和已有的系統配合,否則將無法執行
ps:
5w+1h屬於功能屬性
8c屬於質量屬性
三 需求模型之用例的寫法
寫用例的技巧
三段法:NEA 1 正常處理(normal):分析正常流程 2 異常處理(exception):分析每一步異常情況和對應的處理 3 替代處理(alternative):分析每一步是否有其他替代方法,以及如何做
用例的書寫格式
#1. 用例名稱一般情況下,用例名稱即需求名稱 #2. 場景 場景即用例發生的環境,正好對應5w中的:when,where,who #3. 用例描述 描述詳細的用例內容,對應5w中的what和how 即使用者應該怎樣做,以及每個步驟中的輸出,但不要求每個步驟都有一定的輸出,可以有也可以沒有,也可以有多個 #4. 用例價值 描述用例對應的客戶價值,對應5w中的why #5. 約束和限制 即真個需求流程中相關的約束和限制條件,對應518方法中的8C
用例編寫案例
#用例名答題系統 #場景: when:8.10開始 where:老男孩 who:linux學院,網路客戶 #用例描述: 1 linux學院提供50道題 2 每個客戶無需輸入任何個人資訊就可以參與答題,隨機選擇20道題,給客戶回答,每道題5分, 3.答題結束後,輸入手機號,提交,算總分 4 60分參與抽獎,<60分贈送基礎視訊 #使用者價值: 答題有獎,答題提交時輸入自己的手機號獲取成績,獲得潛在客戶的聯絡方式,為後期將客戶轉成學員做準備 #約束: 暫無
四 領域模型
需求分析階段不區分面向物件還是面向過程
領域模型是完成從需求分析到面向物件設計的一座橋樑
#定義:領域模型是對領域內的概念或現實世界中物件的視覺化表示,又稱為觀念模型,領域物件模型,分析物件模型 #它專注於分析問題領域本身,發掘重要的業務領域概念,並建立業務領域概念之間的關係
領域模型主要兩個作用:
#1 發掘重要的業務領域概念 #2 建立業務領域概念之間的關係
歸納領域建模的方法就是:
#1 從用例中找名詞(找完後需要刪除不是領域物件的名詞,具體刪除什麼,與不同領域有關,沒有統一標準,靠經驗) #2 加屬性(有些屬性並沒有在用例中明確給出,靠行業經驗自己新增) #3 連關係(畫UML圖)
五 設計模型
面向物件類設計的具體步驟第一步:領域類對映(不是全盤拷貝) 類篩選:並不是每個領域類都會出現在軟體中 名稱對映:對應 屬性對映:對應,照搬 提煉方法:領域類中並沒有方法,在用例中找動詞 第二步:應用設計原則和設計模式 第三步:拆分輔助類(領域類可以在實現階段拆分為幾個類)
六 實現模型
選取一種支援面向物件的語言實現我們的設計
七 答題系統案例
第一步:需求分析(寫用例)
#用例名 答題系統 #場景: when:8.10開始 where:老男孩 who:linux學院,網路客戶 #用例描述: linux學院提供50道題 每個客戶無需輸入任何個人資訊就可以參與答題,隨機選擇20道題,給客戶回答,每道題5分, 3.答題結束後,輸入手機號,提交,算總分 60分參與抽獎,<60分贈送基礎視訊 #使用者價值: 答題有獎,答題提交時輸入自己的手機號獲取成績,獲得潛在客戶的聯絡方式,為後期將客戶轉成學員做準備 #約束: 暫無View Code
第二步:領域模型(找名詞,加屬性,連關係=>出圖)
#找名詞: linux學院,題,客戶,得分,獎,視訊 #篩選:去掉與領域無關的名詞。視訊應該算作一種獎品 linux學院,題,客戶,得分,獎
#加屬性 加屬性 名詞 屬性 備註 linux學院 NA 對於答題系統來說,並不需要linux學院的屬性,因此在領域模型中,linux學院是沒有屬性的 題 題目編號,題目型別,題目描述,答題選項,正確答案,分數 客戶 客戶編號,姓名,性別,年齡,手機號 答題記錄 記錄編號,客戶編號,題目編號列表,總分數,時間 通過答題記錄就可以知道使用者是誰,以及使用者答過的題目 獎品 獎品編號,獎品名字
#連關係:畫圖 1:答題記錄是客戶與題的關係類,而客戶與獎品之間可以建一個關係類,這樣以後單查關係類就可以知道誰得了什麼獎品 2:找動詞: 建立題目 隨機選擇題目 答題 提交 算總分 抽獎
第三步:設計模型(略)
第四部:實現模型
連結: https://pan.baidu.com/s/1jHYFKWI 密碼: wimc
第八 UML圖
待整理
類圖中通過加號(+)來表示 public
通過減號(-)表示 private
通過井號(#)表示 protected
第九 作業
角色:學校、學員、課程、講師 要求: 1. 建立北京、上海 2 所學校 2. 建立linux , python , go 3個課程 , linux\py 在北京開, go 在上海開 3. 課程包含,週期,價格,通過學校建立課程 4. 通過學校建立班級, 班級關聯課程、講師 5. 建立學員時,選擇學校,關聯班級 5. 建立講師角色時要關聯學校, 6. 提供兩個角色介面 6.1 學員檢視, 可以註冊, 交學費, 選擇班級, 6.2 講師檢視, 講師可管理自己的班級, 上課時選擇班級, 檢視班級學員列表 , 修改所管理的學員的成績 6.3 管理檢視,建立講師, 建立班級,建立課程 7. 上面的操作產生的資料都通過pickle序列化儲存到檔案裡 作業要求
思路:
一:選課系統用例
#用例名稱選課 #場景 who:學生,老師,管理員 where:老男孩 when:任意時間 #用例描述(使用者怎麼做,或者說使用者想怎麼用): 1. 管理員建立學校:北京和上海兩個校區 2. 管理員建立課程:python,go,linux 3. 管理員建立班級:python週末18期,python脫產7期,linux架構35期 4. 管理員建立學員:小晴,花野真衣,川島芳子 5. 管理員建立講師:alex,egon,wupeiqi,yuanhao 6. 講師建立上課記錄:python週末班18期day7 7. 講師為day7這節課所有學生批改作業,為每個學生打分 8. 學員楊磊檢視自己的詳細資訊:所在學校,報名課程,所在班級 9. 學員楊磊在python18期day7提交了作業 10.學員楊磊查看了自己在day7作業的成績列表,然後自殺了 11.學員小晴跟egon表白了,當天下午就去領了結婚證 #用例價值 幫老男孩解決課程管理問題 #約束 暫無
二:找名詞:
管理員,學校,課程,班級,學員講師,上課記錄,作業,分數,學員詳細資訊,成績列表,結婚證 篩選:去掉與行業或者說領域無關的名詞 管理員,學校,課程,班級,學員,講師,上課記錄,作業,分數,學員詳細資訊,成績列表
三: 加屬性:
名字 屬性 備註 管理員 NA 具備所有許可權,對於選課系統來說,並不需要管理員的屬性,因此在領域模型中,管理員是沒有屬性的 學校 學校名,地址,課程列表,班級列表 課程 課程名,週期,價錢,大綱 班級 班級名,所屬學校,課程 學員 學員名, 講師 講師名 上課記錄 班級,課程節次,日期
四:連關係
五:實現吧親