物件導向的程式設計在遊戲開發中使用(六):數與抽象數
我並不是遊戲開發的從業人員,甚至連軟體開發都不是,但至少我是程式設計師。
我認為,一個【物件導向】的理念在學習過程中的重要性遠大於對於程式碼本身含義的認識。 這一點可以在諸多書籍中得到論證,但很奇怪的一件事是,絕大部分的視訊入門教程和並沒有過多的強調這一點。
系列收藏夾:https://cowlevel.net/collection/3476202
嘿,你做的不錯!你已經有了一個計算器對嘛?
或者你沒有,因為這沒必要。我要做的並不是要告訴你們計算器要怎麼寫,而是要怎麼吧一個過程更加的物件導向
那麼換個問題,你們已經瞭解到了一些簡單的,封裝和職責之類的事情對吧。
但是我們並沒有從其中收穫好處,反而增加了我們的工作量
0需求
那麼這部分我們就開始著手準備一些真正使我們受益的工作
或許你還記得,我們使用了
- number *= 10
- number += num
來增加我們數字的位數,而且他很有用。正在你非常高興的時候,你(內心中的)老闆敲了敲你的桌子“嗨,你的計算器做的不錯,可惜它只能計算軟體提供的數字,我們的客戶需要它能計算其他的一些什麼,比如一個分數?”
顯然,違逆老闆不是一個好的選擇,你只能去修改你的程式碼
這部分很複雜,但是我會盡力將他講的通俗。
通俗並不是什麼好事,但在這種情況下是必要的
1功能分析
顯然我們需要一個數字,這個數字可以決定並改變自己的型別,當我們輸入新內容,這個數字將把新內容加入他們自己的後方,然後這個數字可以與其他數字做加減法。
再附加一個額外功能,我們會比較數字的種類,讓複雜的數主導運算。
因此,我們設計分為兩個部分,一個萬能數,代表一個數字,維護著數字型別和數字內容,以及一個抽象的數字,完成數字內容的工作
2抽象數
我們的第一個抽象數實現他本來的功能
- var number = 0
- var nClass = "AbsBaseNumber"
- func get_class():
- return nClass
- pass
顯然Godot的get_class並不是這麼好用
- func set_number(num):
- number = num
- pass
- func can_push(num):
- return (num is int)
- pass
對輸入的內容進行判斷,而符合基本數字要求的是int
- func push_number(num):
- number *= 10
- number += num
- pass
把輸入的num推到自己的資料內
- func get_data():
- return number
- pass
- func get_number():
- return str(number)
- pass
使用number會得到一個可顯示的字串,
而使用data則可以獲得一個可使用的data,這個data並不一定是實際上的數,可能會包含許多資訊,這些資訊會被負責計算的數字加以運用
由於我們現在只有一類抽象數,並不需要考慮一個高階抽象數被從一個低階抽象數轉換所需要的內容
同樣,我們也沒有考慮當高階抽象數運算時,get_data()該如何運作,或許在處理高階數字的時候,我們需要先獲取他的類,再用獨特的演算法對應處理這個數字
3數
在有了抽象的數字後,我們使用一個數字類來控制抽象數字
- func push_number(num):
- if number.can_push(num) :
- number.push_number(num)
- pass
用來向數字推入一個符號,由於我們只有一種抽象數,因此並沒有考慮無法推入數字的情況。
我們在未來會加入“升級”方式,逐個詢問抽象數,直到有一個肯接受我們的輸入
- func get_data():
- return number
- pass
- func get_number():
- return number.get_number()
- get_data會獲取數所表示的抽象數,而get_number則會返回一個可顯示在螢幕上的字串
- func set_number(num):
- number = num
- pass
- func can_operation(num):
- return NM[number.get_class()] >= NM[num.get_data().get_class()]
- pass
判斷當前抽象數能否控制這個運算,或許未來會有更復雜的環境需要更復雜的條件
我們既然已經把增加數字和獲取顯示的功能交給數字處理
我們要更改核心邏輯處理相應事物的部分,
把他們修改成 get_number()和push_number()
4運算
到現在為止都一切順利,但是運算的職能被我們交給了math類來做
現在我們要收回這部分功能
但,慢著,我們把一個簡單的數字變成了一個複雜的三層結構
我們現在需要 萬能數→ 抽象數→ 數
在抽象的部分,他可以知道他自己,我們通過更高層的邏輯來限制輸入的抽象數在他處理範圍之內。
number是自身儲存的資料,而num是傳入的抽象數,我們使用get_data來獲取對方儲存的資料加以運算
- func do_add(num, ans):
- ans.set_number(number + num.get_data())
- return ans
- pass
- func do_sub(num, ans):
- ans.set_number(number - num.get_data())
- return ans
- pass
將當前數字作為運算的控制者時,會先呼叫被控制的data,並返回一個抽象數ans
而在萬能數的部分,我們需要根據自己的抽象數建立一個相同等級的抽象數作為答案接收,放入一個萬能數的答題卡
number是自身儲存的抽象數,為了保證儲存答案的部分等級與其本身相同,我們使用自身儲存來賦值一個臨時變數來接受答案
num是傳入的一個萬能數,我們使用get_data來拿到他的抽象數
把對方的抽象數交給自身抽象數進行處理,我們在此之前需要完成等級判定
- func operation(num, type, ans):
- var tNum = number
- if type == BusiLogic.BT["ADD"]:
- number.do_add(num.get_data(), tNum)
- ans.set_number(tNum)
- elif type == BusiLogic.BT["SUB"]:
- number.do_sub(num.get_data(), tNum)
- ans.set_number(tNum)
- elif type == BusiLogic.BT["EQU"]:
- ans = self
- else :
- ans.set_number( tNum.set_number(0) )
- return ans
- pass
而最後,我們需要改寫這項工作之前的主人
建立一個新的萬能數,作為答案儲存
- var tNum = MyNumber.new()
- if num1.can_operation(form[0]):
- tNum = num1.operation(form[0], symb, tNum)
- else:
- tNum = form[0].operation(num1, symb, tNum)
選擇合適的控制者控制整個運算
系列文章
物件導向的程式設計在遊戲開發中使用(一):類
物件導向的程式設計在遊戲開發中使用(二):方法
物件導向的程式設計在遊戲開發中使用(三):三大特性
物件導向的程式設計在遊戲開發中使用(四):五大原則
物件導向的程式設計在遊戲開發中使用(五):基本計算器
物件導向的程式設計在遊戲開發中使用(六):數與抽象數
作者:Kingfeng
來源:奶牛關
原地址:https://cowlevel.net/article/2053862
相關文章
- 物件導向的程式設計在遊戲開發中使用(二):方法物件程式設計遊戲開發
- 物件導向的程式設計在遊戲開發中使用(一):類物件程式設計遊戲開發
- 物件導向的程式設計在遊戲開發中使用(五):基本計算器物件程式設計遊戲開發
- 物件導向的程式設計在遊戲開發中使用(三):三大特性物件程式設計遊戲開發
- 物件導向的程式設計在遊戲開發中使用(七):享受勞動果實物件程式設計遊戲開發
- 章10——物件導向程式設計(高階部分)——抽象類物件程式設計抽象
- php中的程式導向與物件導向PHP物件
- 物件導向變成 VS 函數語言程式設計物件函數程式設計
- 物件導向程式設計物件程式設計
- Facebook 開源 Skip 物件導向+函數語言程式設計語言物件函數程式設計
- python物件導向之抽象工廠設計模式Python物件抽象設計模式
- javascript:物件導向的程式設計JavaScript物件程式設計
- JS物件導向的程式設計JS物件程式設計
- Scala的物件導向程式設計物件程式設計
- 課時37:類與物件:物件導向程式設計物件程式設計
- go 併發程式設計案例三 golang 中的物件導向程式設計Golang物件
- 好程式設計師Java教程分享Java物件導向與程式導向程式設計師Java物件
- 遊戲立項與開發中的6種開發導向遊戲
- 什麼是物件?什麼是抽象?怎麼理解物件導向的程式設計思想?物件抽象程式設計
- Python物件導向程式設計Python物件程式設計
- 程式設計思想 物件導向程式設計物件
- js物件導向程式設計JS物件程式設計
- 十三、物件導向程式設計物件程式設計
- 十六、物件導向程式設計物件程式設計
- Python 物件導向程式設計Python物件程式設計
- 物件導向與程式導向物件
- 程式導向與物件導向物件
- JS物件導向程式設計(一):物件JS物件程式設計
- 理解Js中物件導向程式設計的繼承JS物件程式設計繼承
- [筆記]物件導向的程式設計筆記物件程式設計
- 物件導向的程式設計和函數語言程式設計基本相同的證據 - vavr物件程式設計函數VR
- 使用Java實現物件導向程式設計——第六章 框架集合Java物件程式設計框架
- JAVA物件導向--抽象類Java物件抽象
- 物件導向分析與設計(OOAD)物件
- 函數語言程式設計 vs 物件導向程式設計 vs 程式式程式設計的JS演示比較 - DEV函數程式設計物件JSdev
- 物件導向程式設計C++物件程式設計C++
- Python OOP 物件導向程式設計PythonOOP物件程式設計
- python技能--物件導向程式設計Python物件程式設計