歡迎來到強健與安全的程式編寫世界!

在本章中,我們將學習如何編寫「強健」的代碼。你有沒有試過在使用應用程式時,因為輸入錯誤而導致程式崩潰?或是遇到過一個不需要密碼就能登入的網站?這些程式都不夠強健(Robust)安全(Secure)。學完這些筆記,你將會知道如何確保你的程式能優雅地處理錯誤,並將入侵者拒之門外。別擔心,內容看起來雖然多,但我們會把它拆解成簡單步驟,一步步帶你掌握!

1. 資料驗證:程式的「守門員」

資料驗證(Data Validation)是指電腦進行的一項檢查,確保輸入的資料是合理(sensible)合乎情理(reasonable)的。它不會檢查資料是否 100% 正確,但會檢查該資料是否符合特定的規則。

把它想像成夜店門口的保安:他們會檢查你有沒有身份證以及年齡是否合資格,但他們不一定需要知道你的生平故事!

常見的驗證檢查

根據 AQA 課程大綱,你需要掌握以下三種簡單的常規檢查:

1. 長度檢查(Length Check):檢查資料是否符合最少或最多的字元數限制。
例子:確保密碼長度至少有 8 個字元。

2. 存在檢查(Presence Check):檢查資料是否已被輸入(確保輸入欄位不是空的)。
例子:確保註冊表單中的「電郵地址」欄位沒有留空。

3. 範圍檢查(Range Check):檢查數字或日期是否落在特定的數值範圍內。
例子:如果程式要求輸入月份,輸入的數字必須介乎 1 到 12 之間。

重點總結:

驗證可以阻止程式處理「垃圾」資料,從而防止程式在運行後期崩潰。

2. 驗證身份:你是誰?

身份驗證(Authentication)是確認使用者身份的過程。在你的 GCSE 課程中,重點在於使用使用者名稱(username)密碼(password)的簡單驗證流程。

一個簡單的身份驗證流程通常包括:
1. 要求使用者輸入用戶名。
2. 要求輸入密碼。
3. 檢查密碼是否與該用戶名儲存的密碼相符。
4. 如果匹配,則允許進入;否則顯示「拒絕存取(Access Denied)」。

你知道嗎? 即使我們現在見到 FaceID 或指紋掃描等先進技術,它們本質上都只是身份驗證的不同實現方式!

3. 測試你的代碼

測試(Testing)是運行程式以找出錯誤(漏洞/bugs)的過程。這是開發過程中至關重要的一環,因為即使是最頂尖的程式設計師也會犯錯。一旦發現錯誤,你就必須修正(refine)它。

三種測試數據類型

要正確測試程式,你不能每次都輸入相同的數字。你需要使用不同類型的測試數據(test data)。想像一個接收 \( 1 \) 到 \( 10 \) 之間數字的程式:

1. 正常數據(Normal Data):這是程式應該能夠處理的「典型」數據。
例子:輸入數字 5。

2. 邊界數據(Boundary/Extreme Data):這是處於允許範圍邊緣的數值。
例子:輸入 1 或 10。(邊界數據也包括邊界外一點點的數值,如 0 或 11,用來測試「圍欄」是否有效)。

3. 錯誤數據(Erroneous Data):這類數據類型明顯錯誤,應該被程式拒絕。
例子:當程式預期輸入數字時,輸入「香蕉」這樣的文字或「#」這樣的符號。

快速回顧:測試表

如果允許的範圍是 \( 1 \) 到 \( 10 \):
- 7 是正常數據。
- 1 是邊界數據。
- 10 是邊界數據。
- 15 是錯誤數據。
- "Hello" 是錯誤數據。

4. 識別與分類錯誤

當事情出錯時,錯誤通常屬於以下兩類之一。理解錯誤的類型能讓你更快地修復它們!

語法錯誤(Syntax Errors)

語法錯誤是程式語言中「文法」或「拼寫」上的錯誤。如果有語法錯誤,程式完全無法運行

類比:這就像試圖閱讀一段語無倫次的句子;你甚至無法開始理解它的意思。

常見原因:遺漏括號、關鍵字(如 print)拼寫錯誤,或忘記加上冒號。

邏輯錯誤(Logic Errors)

邏輯錯誤是程式設計方式上的錯誤。程式運行得非常流暢,但輸出的結果卻是錯誤的

類比:這就像按照食譜做蛋糕,但把糖誤當成鹽。你依然做出了蛋糕,但吃起來味道糟透了!

常見原因:將 \( + \) 用成了 \( - \),或者在該用「大於或等於」的地方誤用了「大於」。

記憶小撇步:

Syntax(語法)= Spelling(拼寫錯誤,程式啟動不了)。
Logic(邏輯)= Lost(迷失了,程式跑得動但得到錯誤答案)。

總結:如何讓程式變得強健且安全

1. 使用驗證來確保只有合理的數據能夠進入。
2. 使用身份驗證來確保只有合適的人才能使用程式。
3. 使用正常邊界錯誤數據來測試你的程式。
4. 找出並修正語法邏輯錯誤來優化你的代碼。

你做得很好!繼續在你的程式語言中練習編寫這些常規,很快「強健的程式設計」就會成為你的第二天性!