本節書摘來異步社群《android遊戲開發詳解》一書中的第1章,第1.7節,作者: 【美】jonathan s. harbour 譯者: 李強 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
android遊戲開發詳解
我們現在把注意力轉向控制流程(control flow ,也稱為流程控制,flow control),這指的是代碼行将要按照什麼樣的順序執行。還記得代碼執行的基本規則吧,它是說代碼要從上到下地執行。在最簡單的程式中,代碼真的是按照線性方式從上向下執行的。然而,在任何有用的程式中,我們可能會看到,根據某些條件,會跳過一些代碼行甚至重複執行一些代碼行。讓我們來看一些例子。
if-else語句塊用來在代碼中建立分支或多條路徑。例如,我們可以檢查如characterlevel > 10這樣的條件來判斷一個字元串内容,如圖1-6所示。根據characterlevel的值,遊戲可以執行不同的指令。你可以看到圖1-4中有3條路徑。

我們可以建立比上面的例子具有更多或更少分支的if-else語句塊。實際上,我們甚至可以把if語句嵌套在其他的if語句中,以允許“内嵌的”分支。
無論何時,當你寫下關鍵字if的時候,就開始了一個新的if-else語句塊,如圖1-6所示。你可以編寫一個沒有任何else-if或else語句的if語句塊。這絕對沒問題。
在你開始一個新的if-else語句塊之後,每一個額外的else-if都表示一個新的分支。else語句是表示“我放棄”的分支,并且它将會為你處理所有的剩下的情況。
在給定的if-else語句塊中,你隻能選取一個分支。注意,在圖1-6中,如果character level是11,if和else-if語句中的條件似乎都滿足。你可能會認為,這将會導緻charactertitle變成“king”,随後很快又變成“knight”。然而,不會發生這種情況,因為在if-else語句塊中,你的代碼隻能選取一個分支,如圖1-5所示。
再回來看看函數。實際上,我們可以通過if-else語句塊使得函數更為強大。if-else語句塊還是像前面所介紹的那樣工作,但是現在,我們将其包含到函數中,這意味着,我們要留意更多的花括号。看看下面的示例函數,看能否确定哪個開始花括号對應哪個結束花括号。第一個示例中已經為你辨別清楚了。
示例1
示例2
示例3
示例4
現在,我們必須掌握通過讀取花括号來判斷每個代碼塊從哪裡開始以及從哪裡結束的方法,讓我們采取一些步驟。假設我們想要編寫一個函數,它告訴我們一個人是否能夠看一部限制級的電影(我們将根據資格傳回true和false)。我們将設定如下所示的條件。
如果一個人擁有僞造的id,他可以看該電影(不管其年齡多大)。
如果一個人有父母陪伴,他可以看該電影(不管其年齡多大)。
如果一個人沒有僞造的id或者沒有父母陪伴:
如果這個人年齡達到了最小年齡,他可以看該電影。
如果這個人年齡尚未達到最小年齡,他不可以看該電影。
是以,我們必須将if-else語句嵌套(nest)到一個更為通用的條件之中,才能夠處理沒有僞造的id或沒有父母陪伴的人的情況。讓我們來看看代碼,從3個主要分支開始。
程式清單1.12 我能看電影嗎(不完整版本)
現在,在第3個分支中(else語句)添加兩種特定的情況。
程式清單1.13 内部分支
現在,我們可以将程式清單1.12和程式清單1.13放到一起,組成程式清單1.14。
程式清單1.14 我能看電影嗎(完整版)
盡管程式清單1.14中的代碼能夠很好地運作,我們還是可以進行一些優化,如程式清單1.15所示。
程式清單1.15 我能看電影嗎(簡化版#1)
注意,在程式清單1.15中,我們在第2行使用“or”運算符||将兩種情況組合到一條if語句中。我們将所有的“true”的情況組合起來,以繼續簡化該函數,如程式清單1.16所示。
程式清單1.16 我能看電影嗎(簡化版#2)
不管你是否相信,我們可以完全去除掉if-else語句塊而隻是傳回(fakeid || withparent || age >= minimumage)的值,進而更進一步簡化,參見程式清單1.17。
程式清單1.17 我能看電影嗎(簡化版#3)
編寫這樣整潔的代碼,就使得你(以及你的同僚)能夠更加高效地工作,而不需要使用諸如程式清單1.14那樣複雜的邏輯。在整本書中,我們将學習到更多編寫整潔代碼的技巧。