私有變數使用時機

有其他老師詢問:全域(Global)變數和私有(Private)變數用的時機有什麼差別?比如說分身的時候或其他的時候。

這個問題,傑夫老師主要來回答:私有變數如果不在分身使用,還有什麼時機可以使用?

全域變數很好理解

首先,全域變數就是無論是各個角色甚至背景都可以使用它、改變它,初學時一定都是這麼理解的,所以程式也都是這麼寫的。

私有變數不用在分身的時機

這就像是物件導向設計的封裝概念,每個角色(就是物件)有許多自己的變數(稱為屬性)來記錄自己的狀態,而這些變數就只有自己可以更改,別的角色就只能透過偵測積木來讀取但無法改變。下面的圖就看到籃球 Basketball 中座標、方向...及另外新增的 mass 與 velocity 都是屬於籃球的私有變數。

取得其他角色私有變數的偵測積木

取得其他角色私有變數的偵測積木

使用的時機就在於,假設有個遊戲有三個角色 Ball, Baseball, Basketball,而這三顆球都有它們各別的速度,便可建立三個私有變數都稱為velocity,而這個速度變數又會因為設計需要被其他角色讀取,那就可以利用偵測積木來得到。

說了那麼多,看例子「量轉換」https://scratch.mit.edu/projects/684833092(只是個程式範例,請不要挑戰我物理)
三顆球與貓都有自己的 mass 與 velocity,所以這
個專案中所有的變數是私有變數

Scratch專案:動量轉換

點擊任何一顆球就會飛向貓咪,撞擊貓咪後貓咪飛出去的速度由動量轉換公式求出

其中 Ball 的程式,注意 velocity 會漸漸變小,而其他兩顆球的程式非常相似,差別在 velocity 有各別的變化方式。

Ball 的程式 velocity 會漸漸變小

Cat 的 velocity 就由打到的球的 mass 與當時的 velocity 計算出來,而這兩個變數值與球的方向都是由偵測積木取得。

m,v 兩個變數值與方向都是由偵測積木取得

球的 mass, velocity 變數值與方向都是由偵測積木取得

但學生一定會問說這用全域變數也一樣呀!?
除了說明運用私有變數是程式設計的封裝概念外,在 Scratch 中倘若今天要再新增一顆 Beachball,而且它要用到的變數與其他的球是一樣的,那只要選出新的 Beachball 角色後,把任何一顆球的程式拖給 Beachball,Beachball 的私有變數就自動產生了,不用為了 Beachball 去新增變數,方便很多喔~

私有變數用在分身的時機

那就太多例子了,可以看傑夫老師其他關於分身的文章:分身編號分身管理分身同步

例如每個分身都有自己的屬性(如移動速度),就一定要用私有變數。但要注意,這時候這個偵測積木就沒有用了,因為這個積木讀取的是「本尊」的變數值,並不是任何一個(尤其不是你期望的那個)分身的數值。

傑夫老師歡迎各界來詢問、討論 Scratch, Python 的事情,請到知否程式首頁就可找到聯絡老師的方式喔,Bye now~