Introduction to Computer Science

Download Report

Transcript Introduction to Computer Science

物件導向虛擬程式設計
鄭士康
國立台灣大學
電機工程學系/電信工程研究所/
資訊網路與多媒體研究所
1
計算機程式設計與作文
• 以程式語言指示計算機工作
• 說明文敘述事物內容
• 同樣以簡潔明確為目標
2
作文技巧與程式設計
•
•
•
•
構思立意( 解法構想 )
布局謀篇( 模組規畫 )
度句裁章( 流程設計 )
用字遣詞( 變數運算 )
3
兒童作文缺失 (1/2)
• 低年級小朋友. . . 尚無法完整表達意念、掌
握形式結構,內容常跳躍,不能聯貫主題
。
• 低年級階段的寫作以「我手寫我口」為主
要訓練方式. . .
• 剛升上中年級的小朋友,在遣詞造句上易
流於口語化,甚至常重複出現相同的語詞
、句型. . .
*蘇國書、林瑋,國語日報兒童園地版兒童寫作觀察報告(九十七年一月到六月)
三之二, 國語日報, 中華民國97年9月18日
兒童作文缺失 (2/2)
• 大部份的小朋友都是想到什麼就寫什麼,
往往把主要內容全寫進某一個段落。這樣
一來,不僅段落雜亂,整篇文章也缺乏分
段的概念。
• 高年級學生. . .需要加強的,則是大多慣用
條列式思考,缺少在每一條列下衍生細膩
描述的能力
*蘇國書、林瑋,國語日報兒童園地版兒童寫作觀察報告(九十七年一月到六月)
三之二, 國語日報, 中華民國97年9月18日
虛擬程式設計
• 程式設計
– 二進位碼
– 組合語言
– 程式語言
• 就解決問題而言,高階程式語言仍是過細
• 必須先想好問題解法,才能轉成程式
• 問題解法先區分模組,寫成演算法,才容
易寫成程式
• 模組區分與演算法構思:虛擬程式設計
6
範例:二十一點
維基百科
http://zh.wikipedia.org/w/index.php?title=Image:Blackjack_game_example.JPG&variant=zh-tw
7
流程
1.
2.
3.
4.
5.
6.
7.
下注
向各家派發一張明牌
向各家派發一張暗牌
莊家明牌是10 或 A , 詢問閒家是否購買保險
莊家打開暗牌
閒家加註、分牌等動作
莊家逐位詢問閒家是否加牌, 直至閒家不加牌或報到, 才詢問下一位
閒家, 輪流詢問閒家直至最後一位閒家加牌完成
8.
莊家如不足 17點便需加牌直至超過或等於 17點
9.
對未有爆煲或報到的玩家, 比點數大小, 大者勝, 可得賠金; 如莊家爆
煲, 未有爆煲或報到的閒家便可得賠金
10. 回收已使用的牌及打賞
注: 回收已使用的牌必須順序回收。如分開大牌和小牌個別回收等不正常
收牌行為,便有出千的可能,並且可能會被請提出異議而被迫離開。
維基百科
http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8D%81%E4%B8%80%E9%BB%9E
&variant=zh-tw#.E5.9F.BA.E6.9C.AC.E7.8E.A9.E6.B3.95
8
點數計算與發牌
• A作一點或十一點,2-10作該牌之點數,J、Q、K作十點。
• 首先由一位玩家作莊家負責發牌,其餘玩家為閒家。閒家
會向莊家投下一定注碼,莊家會以順時鐘方向向眾閒家派
發一張暗牌(即不掀開的牌),然後向自己派發一張暗,
接著莊家會以順時鐘方向向眾閒家派發一張明牌(即掀開
的牌),之後又向自己派發一張明牌。
• 當眾人手上各擁一張暗牌和一張明牌,莊家就以順時鐘方
向逐位閒家詢問是否再要牌(以明牌方式派發),玩家此
時要計算是否要牌,因為排牌局的最終目的,是要玩家手
上擁有的牌總點數達到21點(或最接近又小於21點),然
後和莊家比大小。當一位閒家決定不再要牌後,莊家才向
下一位閒家詢問是否再要牌。
(按: 在一般賭場的賭局,莊家並不一定是發牌者。)
維基百科
http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8D%81%E4%B8%80%E9%BB%9E
&variant=zh-tw#.E5.9F.BA.E6.9C.AC.E7.8E.A9.E6.B3.95
9
爆煲(超過21點)
• 若果閒家要牌後,其手上擁有的牌的總點
數超過21點,便要揭開手上所擁有的牌,俗
稱爆煲,該閒家的注碼會歸莊家。
• 反之若其手上擁有的牌的總點數不超過21點,
該閒家可決定是否繼續要牌。
• 當最後一位閒家決定不再要牌後,莊家就
必須揭開自己所有手上的牌,若總點數少
於17點,就必須繼續要牌;如果莊家爆煲的
話,便向原來沒有爆煲的閒家,賠出該閒
維基百科
家所投住的同等的注碼。
http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8D%81%E4%B8%80%E9%BB%9E
&variant=zh-tw#.E5.9F.BA.E6.9C.AC.E7.8E.A9.E6.B3.95
10
點數決勝與例牌報到
• 如果莊家最終沒有爆煲的話,原來沒有爆
煲的眾閒家便要揭開手上所有的牌,比較
點數決定誰勝誰負,點數較大的取勝。
(例牌例外,詳見下文閒家例牌先報到和
特別規例)
• 若某閒家例牌,必須向立即莊家揭開手上
所有的牌(即俗稱報到),莊家亦必須向
該擁有例牌的閒家賠上一定注碼。
維基百科
http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8D%81%E4%B8%80%E9%BB%9E
&variant=zh-tw#.E5.9F.BA.E6.9C.AC.E7.8E.A9.E6.B3.95
11
保險、加註、分牌
• 當莊家面牌是10或A,閒家可以外加註碼的
一半買保險,以賭莊家的二張牌總和是不
是21點,如莊家不是21點便沒收保險金,如
是21點便以注碼的一倍半賠償。
• 如閒家首兩張牌點數之和為11點,可以選擇
加倍投注,但加註後僅獲發1張牌。有些賭
局容許閒家在首兩張牌總和為10點(甚至任
何點數)時加註。
• 如閒家首兩張牌點數相同,可以選擇分牌,
並須加註。分出每門的下注金額須與原注
相同。若閒家打兩張A分開,則每張A只獲
維基百科
發1張牌,不可再要牌。有些分牌後後不可
http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8D%81%E4%B8%80%E9%BB%9E
再分牌。
&variant=zh-tw#.E5.9F.BA.E6.9C.AC.E7.8E.A9.E6.B3.95
12
二十一點、同花順、五龍
• 如果閒家手中的一張暗牌和一張明牌分別
是一張A牌(可作11點)和一張十點牌(K、
Q、J、10),這副牌叫做二十一點(Black
Jack)(屬例牌),該閒家可向莊家報到,
莊家須向該閒家賠上1倍注碼。
• 有些賭場會加設這一賠彩規例,即玩家的
牌面是同花的「6、7、8」便可即收3倍的彩
金。
• 如果閒家要牌直至手上有5張牌而又沒有爆
煲,這副牌叫做五龍(屬例牌),該閒家
維基百科
可向莊家報到,莊家須向該閒家賠上2倍注
http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8D%81%E4%B8%80%E9%BB%9E
&variant=zh-tw#.E5.9F.BA.E6.9C.AC.E7.8E.A9.E6.B3.95
碼。
13
莊家食夾棍
• 若莊家和眾閒家要以點數決勝(各方都沒
有出現爆煲的情況),若該閒家和莊家手
上所擁有的牌的總點數一樣的話,算莊家
取勝,即俗稱莊家食夾棍,該閒家的注碼
會歸莊家。
• 賭場規則,廿一點是沒有食夾棍這規例,
如閒家和莊家手上牌總點數一樣的話,是
「打和」,閒家可以拿回原先的注碼。
• 注意:莊家是五龍而閒家的點數比莊家大
的話,仍算莊家取勝,不過莊家食夾棍的
維基百科
權利不適用於閒家例牌(Black Jack和五龍)
http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8D%81%E4%B8%80%E9%BB%9E
&variant=zh-tw#.E5.9F.BA.E6.9C.AC.E7.8E.A9.E6.B3.95
的情況,因為閒家Black Jack和五龍屬於例
14
兩則做事方法的名言
• 物有本末,事有始终,知所先後,則近道
矣。
– 《大學》開宗明義
• 學而不思則罔,思而不學則殆
– 《荀子》勸學篇
15
80-20定律、要事第一、工程方法
• 80-20定律
• 要事第一 (First things first)
• 工程方法 (Engineering approach)
–
–
–
–
辨識問題核心 (Core)
訂定優先順序 (Priority)
快速原型製作 (Fast prototyping)
逐步演化 (Evolution)
• 定時定量研究法
16
釐清問題
•
•
•
•
•
核心關鍵
Nice to have
優先順序
問題簡化
從實例簡化開始嘗試
– 做中學
17
工程方法
v 0.3
v 0.2
v 0.2
v 0.2
v 0.1
v 0.1
v 0.1
18
工程方法
• 配合實作逐漸熟悉問題,而非開始即要求
全面了解
• 避免過度分析(analysis paralysis) ,及早獲得
可用程式
• 隨版本演進,有系統地完成程式
• 隨時有產出,增進信心
• 越重要的部份較早完成,經歷越多測試,
較確實可靠穩定;避免後期發現錯誤,須
全面改寫程式
• 越重要的部份越早完成,可依照環境時程
的改變,修改後續版本需求,富有彈性
程式目的
• 使玩家可以與電腦玩二十一點遊戲
20
二十一點遊戲模擬v0.1流程
1. 產生牌疊
2. 電腦(莊家)向玩家(一人)及本身派發一張明
牌
3. 電腦向玩家及本身派發一張明牌
4. 莊家詢問玩家是否加牌, 直至玩家不加牌
或報到
5. 莊家如不足 17點便需加牌直至超過或等於
17點
6. 對未有爆煲或報到的玩家, 比點數大小, 大
者勝, 如莊家爆煲, 玩家勝
21
後續版本規劃
•
•
•
•
•
•
v0.2: 區分明牌暗牌
v0.3: 允許下注
v0.4: 處理莊家食夾棍
v0.5: 處理同花順與五龍
v0.6: 處理保險、加註、分牌
v0.7: 使用多付牌
22
測試規劃
•
•
•
•
規劃程式須能處理的場景實例
增進對問題的確實了解
有助對程式架構與流程的思考
做為各版本程式紙筆測試、偵錯、驗證的
依據
• 場景實例規畫由簡到繁
• 輸入錯誤資料等例外狀況可延後規劃
• 程式的功能與強健(robustness)程度,隨版本
演進與通過的測試場景增加而成長
二十一點遊戲模擬原型之測試規劃:
場景1
玩家
莊家
♠A
♥J
♦10 勝
24
二十一點遊戲模擬原型之測試規劃:
場景2
玩家
莊家
♣3
♥J
♠10
♦ A勝
25
二十一點遊戲模擬原型之測試規劃:
場景3
玩家
莊家
♠8
♥J
♦7
♠2
♣6勝
26
二十一點遊戲模擬原型之測試規劃:
場景4
玩家
莊家
♠8
♥5
♦8
♠9
♣6爆
27
二十一點遊戲模擬原型之測試規劃:
場景5
玩家
莊家
♠8
♥5
♦8停
♠9
♣6勝
28
二十一點遊戲模擬原型之測試規劃:
場景6
玩家
莊家
♠8
♥5
♦8停
♠9
♣8爆
29
物件與類別
• 物件(Object)
– 狀態與功能:例如, 某台特定電視機
• 類別(Class)
– 藍圖:例如, 泛稱電視機
– 狀態:變數(Variables) [資料成員,Data member,
Field,Attribute]
– 功能:函式(Function) [方法成員,Member
function,Method,Operation,Responsibilities]
30
物件導向思維
• 什麼是程式要完成的功能?
• 需要那些物件/類別才能完成程式功
能?
• 物件/類別需要那些行為才能合作完
成程式功能?
• 例: Mission Impossible, RPG
31
參考書籍
• N. M. Wilkinson, Using CRC Cards: An Informal
Approach to Object-Oriented Development, New York:
SIGS Books, 1995.
32
練習
• 實際演練二十一點遊戲模擬原型的CRC卡會
議
33
CRC卡會議
•
•
•
•
定義問題
產生類別
演練場景
整理卡片
34
產生類別
•
•
•
•
•
•
•
腦力激盪
過濾類別
分配卡片
初步建立繼承關係
描述類別
初步寫出方法成員(Responsibilities)
初步寫出資料成員(Attributes)
35
物件/類別之識別
• 流程敘述中的名詞、代名詞、名詞片語
可能需要轉換為物件/類別(CRC卡)
• 流程敘述中的動詞、動詞片語可能需要
轉換為物件/類別的方法(CRC卡)
• 需要相同方法的物件可以歸納出一個類
別(CRC卡)
• 類別之間的關係可以畫UML類別圖表示
• 主程式及類別的方法可以用虛擬碼進一
步描述
36
必也正名乎
• 物件、類別、狀態、功能之名稱力求精準
• 使用一致命名規範
–
–
–
–
物件、類別、狀態:名詞片語
功能:動詞片語
條件判斷:形容詞片語、判斷句
多字連用,除第一字另外考慮外,各字開頭字
母大寫
– 物件、狀態:第一個字小寫起頭 humanPlayer
– 類別、功能:第一個字大寫起頭 HumanPlayer
37
資料成員與 類別之區分
• 資料成員通常表示類別的狀態變數,而非
單獨之類別或型別
– 撲克牌之花色
– 借書資料之到期日期
• 但資料成員如可操作,且可用藍圖描述,
可能可以構成一個類別,而資料成員變成
一個物件
– 日期
38
責任之分配
• 原則上責任分配給擁有最方便完成工作之
資源的類別
39
演練場景
•
•
•
•
•
•
列出場景清單
逐一演練場景
寫下類別負責功能、合作類別、資料成員
先演練簡單場景
複雜場景可能包括其他簡單場景
例外場景押後演練
40
整理卡片
• 刪除沒用到的類別、方法成員、資料成員
• 發現繼承結構
• 繪出類別圖(Class Diagram)
41
CRC卡正面
父類別
負責功能
類別名稱
合作類別
42
CRC卡背面
類別描述
資料成員
43
類別 CRC卡正面
Class Name: Card
Collaborators
Responsibilities
Knows suit
Deck
Knows rank
Hand
44
類別 CRC卡背面
Description: The set of objects to represent the 52
playing cards in the system.
Attributes
suit
rank
45
類別 CRC卡正面
Class Name: Deck
Collaborators
Responsibilities
Knows remaining cards
Card
Deals cards
HumanPlayer
ComputerPlayer
46
類別 CRC卡背面
Description: The set of objects to represent the card
deck from which the playing card is dealt to the
human player and the dealer.
Attributes
cards
47
類別 CRC卡正面
Class Name: Hand
Collaborators
Responsibilities
Knows cards for the player
Card
Compute card points
HumanPlayer
ComputerPlayer
48
類別 CRC卡背面
Description: The set of objects to represent the cards
having been dealt to the human or the computer
player.
Attributes
hand
total points
49
類別 CRC卡正面
Class Name: HumanPlayer
Collaborators
Responsibilities
Knows cards owned by the human
player
Decides whether to ask for one more
card
Save a card from the deck to the hand
Checks if it is BlackJack
Checks if it goes burst
Deck
Hand
Game
50
類別 CRC卡背面
Description: The set of objects to represent the
human player.
Attributes
hand
51
類別 CRC卡正面
Class Name: ComputerPlayer
Collaborators
Responsibilities
Knows cards owned by the computer
player
Decides whether to ask for one more
card
Save a card from the deck to the hand
Checks if it is BlackJack
Checks if it goes burst
Deck
Hand
Game
52
類別 CRC卡背面
Description: The set of objects to represent the
computer player.
Attributes
hand
53
類別 CRC卡正面
Class Name: Game
Responsibilities
Knows deck
Knows human player
Knows computer player
Controls game flow
Collaborators
Deck
HumanPlayer
ComputerPlayer
54
類別 CRC卡背面
Description: The set of objects to represent the game.
Attributes
deck
human player
computer player
55
UML
• Unified Modeling Language
– OO 設計之圖像符號系統
• 工具
– Rational Rose
– JUDE-Community
http://jude.change-vision.com/jude-web/index.html
56
類別UML符號
57
UML 類別圖( Class Diagram )
58
練習
• 以大富翁遊戲模擬為目標,規畫版本,進
行CRC卡會議,產生CRC卡,繪出UML類別
圖
59
JUDE Community
用JUDE Community畫類別圖
• File>New
• Diagram>Class Diagram
• 工具列>點選Class符號>在工作區按左
鍵
• 左下角>Base標籤>輸入類別名稱
• 左下角>Attribute標籤>Add按鈕>輸入
資料狀態名稱、型別、可見度
• 左下角>Operation標籤>Add按鈕>輸入
功能函式名稱、傳回值型別、可見度
用JUDE Community畫類別圖
• 工具列>Association符號旁箭頭>選擇所需
Association符號
• 起點類別圖形按左鍵,轉折點按左鍵
• 終點類別圖形連按左鍵兩次
• 按起點、終點類別圖形調整位置
• 或按Shift鍵點選要對齊的圖形>Alignment>
選擇調整方式
• Edit>Copy to Clipboard>BMP, PNG
• File>Save As …
UML圖的維護
• 程式碼才是最終最正確的說明文件
• UML圖是很好的構想與解說的工具
• 隨著程式進展,UML圖和程式碼逐漸會有
差距
• 建議程式達到一個穩定階段時,可以修改
UML圖,維持UML圖和程式碼的一致性,
方便對內、外的簡報
• 有自動化維護工具,但價錢昂貴,也非目
前必需
63
單一責任原理
(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
64
一個違反SRP的例子
*Robert C. Martin, Agile Software Development: Principles, Patterns, and
Practices, Pearson Education, 2003
65
符合SRP的設計
*Robert C. Martin, Agile Software Development: Principles, Patterns, and
Practices, Pearson Education, 2003
66
由上而下與由下而上
• 由上而下
– 假設底層類別已經存在
– 較易決定下層類別規格
– 主要之呼叫介面測試較多
• 由下而上
– 先實作並測試底層類別(單元測試Unit Test)
– 較易測試類別實體
• 上下夾擊
– 開始時已有一批類別可用
67
一些良好的程式設計習慣
•
•
•
使用研發日誌
夥伴合作程式設計
漸增式與回合式發展
–
•
•
依發展階段提昇程式的強健度
可持續之發展步調
維護原始碼、註解、重要程式文件
68