1.09k likes | 1.41k Views
物件導向程式設計. 鄭士康 國立台灣大學 電機工程學系 / 電信工程研究所 / 資訊網路與多媒體研究所. 1. 綱要. 物件導向思維 CRC 卡會議 UML 類別圖 SRP: 單一責任原理 物件導向二十一點模擬程式 0.0.0 版 物件導向二十一點模擬程式 0.0.1 版 物件導向二十一點模擬程式 0.0.2 版. 綱要. 物件導向二十一點模擬程式 0.0.3 版 物件導向二十一點模擬程式 0.0.4 版. 綱要. 物件導向思維 CRC 卡會議 UML 類別圖 SRP: 單一責任原理 物件導向二十一點模擬程式 0.0.0 版
E N D
物件導向程式設計 鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所 1
綱要 物件導向思維 CRC卡會議 UML類別圖 SRP:單一責任原理 物件導向二十一點模擬程式0.0.0版 物件導向二十一點模擬程式0.0.1版 物件導向二十一點模擬程式0.0.2版
綱要 物件導向二十一點模擬程式0.0.3版 物件導向二十一點模擬程式0.0.4版
綱要 物件導向思維 CRC卡會議 UML類別圖 SRP:單一責任原理 物件導向二十一點模擬程式0.0.0版 物件導向二十一點模擬程式0.0.1版 物件導向二十一點模擬程式0.0.2版
物件導向程式設計 利用逐步細分法的函式導向程式設計曾經風行一時 物件和類別的觀念及程式語言普及之後,有必要採用不同的方式思考,以便更直截了當的寫出物件和類別的程式,並且充份發揮物件導向封裝、繼承、多型的特點
程式規劃 版本規劃 (80-20定律、要事第一、工程方法) 測試規劃 良好程式設計習慣 使用研發日誌,與夥伴合作,漸增式與回合式發展程式,維持可持續的發展步調,維護原始碼、註解、重要程式文件 測試驅動方法開發
物件導向程式設計之引入 版本規劃及測試規劃完成,要開始以漸增及回合方式,進行各個版本的進一步設計之時
物件導向思維 什麼是程式要完成的功能? 需要那些物件/類別才能完成程式功能? 物件/類別需要那些行為才能合作完成程式功能? 例: Mission Impossible, RPG 8
綱要 • 物件導向思維 • CRC卡會議 • UML類別圖 • SRP:單一責任原理 • 物件導向二十一點模擬程式0.0.0版 • 物件導向二十一點模擬程式0.0.1版 • 物件導向二十一點模擬程式0.0.2版
CRC卡 • Class (類別)、Responsibilities (負責功能)、Collaborators (合作類別) • 由Kent Beck與Ward Cunningham發明,用以教導其同儕程式設計師物件導向的觀念 • 利用CRC卡會議可使初學者更容易了解物件與類別的意義
參考書籍 N. M. Wilkinson, Using CRC Cards: An Informal Approach to Object-Oriented Development, New York: SIGS Books, 1995. 11
練習 實際演練二十一點遊戲模擬原型的CRC卡會議 12
定義問題 產生類別 演練場景 整理卡片 CRC卡會議 13
產生類別 • 腦力激盪 • 過濾類別 • 初步建立繼承關係 • 描述類別 • 寫出類別名稱及定義 • 初步寫出負責功能(Responsibilities) • 初步寫出資料成員(Attributes) 14
腦力激盪 描述類別 產生類別 過濾物件/類別 建立繼承關係
物件/類別之識別 • 流程敘述中的名詞、代名詞、名詞片語可能需要轉換為物件/類別(CRC卡) • 流程敘述中的動詞、動詞片語可能需要轉換為物件/類別的方法(CRC卡) • 需要相同方法的物件可以歸納出一個類別(CRC卡) • 類別之間的關係可以畫UML類別圖表示 • 主程式及類別的方法可以用虛擬碼進一步描述 16
資料成員與 類別之區分 • 資料成員通常表示類別的狀態變數,而非單獨之類別或型別 • 撲克牌之花色 • 借書資料之到期日期 • 但資料成員如可操作,且可用藍圖描述,可能可以構成一個類別,而資料成員變成一個物件 • 日期 17
必也正名乎 • 物件、類別、狀態、功能之名稱力求精準 • 使用一致命名規範 • 物件、類別、狀態:名詞片語 • 功能:動詞片語 • 條件判斷:形容詞片語、判斷句 • 多字連用,除第一字另外考慮外,各字開頭字母大寫 • 物件、狀態:第一個字小寫起頭 humanPlayer • 類別、功能:第一個字大寫起頭 HumanPlayer 18
演練場景 • 列出場景清單 • 逐一演練場景 • 寫下類別負責功能、合作類別、資料成員 • 先演練簡單場景 • 複雜場景可能包括其他簡單場景 • 例外場景押後演練 19
整理卡片 • 刪除沒用到的類別、方法成員、資料成員 • 發現繼承結構 • 繪出類別圖(Class Diagram) 20
CRC卡正面 類別名稱 父類別 負責功能 合作類別 21
CRC卡背面 描述 成員變數 22
類別Card之CRC卡正面 類別名稱:Card 合作類別 負責功能 知道花色 知道點數 Deck Hand 23
類別Card之CRC卡背面 描述:代表用到的52張撲克牌 成員變數 花色(suit) 點數(rank) 24
類別Deck之CRC卡正面 類別名稱:Deck 合作類別 負責功能 知道剩下的牌 發一張牌 Game Card 25
類別Deck之CRC卡背面 描述:代表牌疊 成員變數 牌(cards) 26
類別 HumanPlayer之CRC卡正面 類別名稱:HumanPlayer 合作類別 負責功能 存入一張牌 知道玩家狀態 決定是否再要一張牌 傳回手牌總點數 Game Hand 27
類別HumanPlayer之CRC卡背面 描述:代表人類玩家 成員變數 手牌(hand) 玩家狀態(status) 28
類別Hand之 CRC卡正面 類別名稱:Hand 合作類別 負責功能 知道手中的牌 知道手牌總點數 Card HumanPlayer ComputerPlayer 29
類別Hand之 CRC卡背面 描述:代表人類玩家或電腦玩家手中的牌 . 成員變數 牌(cards) 30
類別ComputerPlayer之 CRC卡正面 類別名稱:ComputerPlayer 合作類別 負責功能 存入一張牌 知道玩家狀態 決定是否再要一張牌 傳回手牌總點數 Game Hand 31
類別 CRC卡背面 描述:代表電腦玩家. 成員變數 手牌(hand) 玩家狀態(status) 32
類別Game之CRC卡正面 類別名稱:Game 合作類別 負責功能 控制遊戲流程 比較電腦與人類玩家點數 大小 Deck HumanPlayer ComputerPlayer 33
類別Game之CRC卡背面 描述:代表整個二十一點遊戲. 成員變數 牌疊(deck) 人類玩家(humanPlayer) 電腦玩家(computerPlayer) 34
HumanPlayer Game Deck Hand ComputerPlayer Card 類別關係圖
綱要 • 物件導向思維 • CRC卡會議 • UML類別圖 • SRP:單一責任原理 • 物件導向二十一點模擬程式0.0.0版 • 物件導向二十一點模擬程式0.0.1版 • 物件導向二十一點模擬程式0.0.2版
UML • Unified Modeling Language • 由Booch、Rumbaugh、Jacobson三人所創的物件導向軟體圖形表示標準 • 做為軟體系統的設計文件,使系統維護者容易了解修改程式,另一方面則是軟體工程的工具 • 背後有一套軟體工程架構,但只適合大規模軟體開發 • 小範圍程式設計,以較簡易具彈性的Agile Software Development比較實際好用 • 初學者只須了解幾種簡單的圖形,用來了解或記錄程式架構
UML繪製工具 • Rational Rose • 可由UML圖形直接產生程式框架,並能保持程式與UML圖形的一致性,但價格相當昂貴 • JUDE-Community • 免費UML圖形繪製軟體 • 自2009年年底,JUDE-Community軟體已不再提供下載,改提供較進階的astah-Community http://jude.change-vision.com/jude-web/index.html 38
類別UML符號 39
不同類別間傳送資料 • 類別的成員變數通常設為private,不能任意擷取 • 有人因此乾脆將所有成員變數宣告為public,方便取得,卻失去了使用類別封裝的原意 • 這種狀況,通常可以畫出類別圖,觀察可能的資料傳送路徑,再於相關類別使用適當的暫存變數或成員變數和成員函式,進行接力傳送資料
練習 • 以大富翁遊戲模擬為目標,規畫版本,進行CRC卡會議,產生CRC卡,繪出UML類別圖 42
用astah Community畫類別圖 • File>New • Diagram>Class Diagram • 工具列>點選Class符號>在工作區按左鍵 • 左下角>Base標籤>輸入類別名稱 • 左下角>Attribute標籤>Add按鈕>輸入資料狀態名稱、型別、可見度 • 左下角>Operation標籤>Add按鈕>輸入功能函式名稱、傳回值型別、可見度
用astah Community畫類別圖 • 工具列>Association符號旁箭頭>選擇所需Association符號 • 起點類別圖形按左鍵,轉折點按左鍵 • 終點類別圖形連按左鍵兩次 • 按起點、終點類別圖形調整位置 • 或按Shift鍵點選要對齊的圖形>Alignment>選擇調整方式 • Edit>Copy to Clipboard>BMP, PNG • File>Save As …
綱要 • 物件導向思維 • CRC卡會議 • UML類別圖 • SRP:單一責任原理 • 物件導向二十一點模擬程式0.0.0版 • 物件導向二十一點模擬程式0.0.1版 • 物件導向二十一點模擬程式0.0.2版
單一責任原理(SRP: Single-Responsibility Principle) • A class should have only one reason to change • 若某類別擔負多個責任,某一責任相關的改變會妨礙該類別其他責任的達成 • 何以不讓Game類別進行某一玩家是否為21點的計算? *Robert C. Martin, Agile Software Development: Principles, Patterns, and Practices, Pearson Education, 2003 47
一個違反SRP的例子 *Robert C. Martin, Agile Software Development: Principles, Patterns, and Practices, Pearson Education, 2003 48
符合SRP的設計 *Robert C. Martin, Agile Software Development: Principles, Patterns, and Practices, Pearson Education, 2003 49
綱要 • 物件導向思維 • CRC卡會議 • UML類別圖 • SRP:單一責任原理 • 物件導向二十一點模擬程式0.0.0版 • 物件導向二十一點模擬程式0.0.1版 • 物件導向二十一點模擬程式0.0.2版