1. 程式人生 > >面向物件實戰

面向物件實戰

一 引子

學完了面向物件的基礎知識後,很明顯你還是不知該如何下手,凡是都得有個章法

此刻有經驗的人可能會想到瀑布模型、螺旋模型、迭代開發、敏捷、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        具備所有許可權,對於選課系統來說,並不需要管理員的屬性,因此在領域模型中,管理員是沒有屬性的
學校               學校名,地址,課程列表,班級列表
課程               課程名,週期,價錢,大綱
班級               班級名,所屬學校,課程
學員               學員名,
講師               講師名
上課記錄          班級,課程節次,日期

 

四:連關係

五:實現吧親