如果你是一名程式設計師,你就會知道編寫程式碼通常是一個耗時且錯誤百出的過程。弄清如何讓程式或網路應用程式按照自己的意願執行,然後再向團隊或股東等其他人解釋,這樣的過程既令人沮喪,又令人滿意。
這就是虛擬碼的用武之地。
虛擬碼是一種使用簡單、自然的語言和程式語言元素相結合來表示程式碼的方式。無論你是剛剛開始程式設計,還是經驗豐富的專業人士,瞭解虛擬碼都是一種節省時間的技巧,你可以隨時將其融入到你的程式設計過程中。
在本文中,我們將深入探討什麼是虛擬碼、如何使用虛擬碼以及為什麼它是任何開發人員的必備工具。
什麼是虛擬碼?
虛擬碼(Pseudocode)是一種表示程式碼的方式,如演算法、函式和其他過程,使用自然語言和類似程式語言的元素組合。
之所以稱為 “偽” 程式碼,是因為它實際上不可執行。相反,它是人類理解和規劃編碼邏輯的一種方式–以人類易於理解的方式描述程式的步驟,同時又足夠詳細,可以快速轉換成特定的程式語言。
下面是一個簡單的虛擬碼示例,在這個示例中,我們正在制定基本的邏輯,以便在訪客瀏覽我們的網站或應用程式時用名字向他們問好:
PROCESS GreetUser INPUT userName DISPLAY "Hello, " + userName + "!" END
正如你所看到的,上述虛擬碼並不是用任何實際語言或框架的語法編寫的。相反,它使用了簡單、普遍易懂的語言和程式設計元素(如 “PROCESS
“、”DISPLAY
“和 “+
“)來代替語法,使任何人都能輕鬆掌握。
這就是編寫虛擬碼的力量之一: 通過將程式碼的意圖用通用語法表達出來,你可以跳過所有程式設計和基於技能的語言障礙。我們將在下一節詳細討論這一點。
編寫虛擬碼的好處
虛擬碼的主要優點之一是,它允許開發人員勾勒出自己的程式碼,而不必拘泥於任何一種特定語言的語法和結構。這樣就更容易發現程式或函式邏輯中的錯誤,而無需編寫或除錯任何實際程式碼。
更重要的是,虛擬碼可以很容易地適應不同的程式語言,因此對於熟悉多種語言並需要在不同語言間轉換想法的開發人員來說,虛擬碼是一個非常有用的工具。想象一下,你可以向 Laravel 開發人員解釋你的 Node.js 指令碼!這對於共同完成一個專案的團隊來說尤其有用,因為虛擬碼可以用作交流想法和功能的通用語言。
以下是虛擬碼為新手和經驗豐富的開發人員帶來的主要好處:
- 提高效率:通過用虛擬碼寫出流程的步驟,開發人員可以在深入研究特定程式語言的細節或語法之前規劃好程式碼,從而節省時間。這可以幫助編碼人員避免錯誤,減少除錯的需要。
- 更易於閱讀:由於虛擬碼編寫得足夠簡單,任何人都能理解,因此開發人員更容易閱讀和理解程式碼,尤其是在與團隊合作或需要重溫舊程式碼的情況下。
- 靈活性更高:由於虛擬碼不依賴於任何特定的程式語言,因此可以很容易地適應不同的語言。因此,對於熟悉多種語言並需要在不同語言間轉換想法的開發人員來說,虛擬碼是一個非常有用的工具。
- 加強協作:虛擬碼可以作為一種通用語言,供開發人員團隊就專案進行交流和協作。這對於共同開發專案的團隊尤其有用,因為虛擬碼可以讓開發人員清晰簡潔地交流想法。
- 本地管理:由於虛擬碼不是可執行的,因此無需像成熟的應用程式那樣線上託管或連線到任何外部指令碼。它可以建立並儲存在本地機器的檔案中,也可以儲存在雲檔案中,甚至可以複製到電子郵件中。
此外,編寫虛擬碼可以在開發過程的任何階段輕鬆實現。即使您以前從未使用過,也可以現在就開始使用,無論您的編碼進度如何,都能立即獲得上述好處。
常見的虛擬碼用例
由於虛擬碼固有的靈活性,虛擬碼有很多用途——甚至在程式設計領域之外。
以下是開發人員常用的幾種情況:
- 規劃和設計流程:虛擬碼可用於規劃流程、函式或演算法的步驟,讓開發人員在用特定程式語言實現之前,就能思考邏輯並確保其正確性。
- 向非技術利益相關者傳達想法:虛擬碼可用於向非技術利益相關者(如專案經理或客戶)清晰解釋流程或演算法的步驟,讓他們輕鬆掌握概念。
- 與團隊合作:虛擬碼可作為一種通用語言,供開發人員團隊就專案進行溝通和協作,而無需考慮他們各自的程式設計專長。
- 使程式碼適應不同的程式語言:由於虛擬碼不依賴於任何特定的程式設計或指令碼語言,因此可以快速、輕鬆地將其改編和翻譯成不同的語言。這對於使用多種語言的開發人員和團隊尤其有用。
- 教授程式設計概念:虛擬碼是教授程式設計基礎知識的有用工具,因為它可以讓學生專注於程式的邏輯和結構,而不會被語法所困擾。
以上只是幾個例子,還有更多例子。利用虛擬碼發揮優勢的可能性幾乎是無限的。
如何編寫虛擬碼
虛擬碼的編寫沒有唯一正確的方法。由於沒有特定的語法,所以虛擬碼非常靈活,這也正是它沒有特定語法規則的原因。
雖然一些語言(如 Pascal 和 Basic)提供了特定語法的虛擬碼指南,但實際上你可以使用任何你喜歡的術語來編寫虛擬碼,只要你的術語無處不在且邏輯可循即可。
不過,大多數開發人員都會遵守一些虛擬碼的基本步驟和準則。接下來我們將深入探討。
編寫虛擬碼的步驟
以下是編寫優秀虛擬碼的一般步驟:
- 開啟文字編輯器:虛擬碼通常在文字或 HTML 編輯器中編寫,你可以選擇自己喜歡的編輯器並開啟一個新檔案。
- 確定目標:確定程式或函式的目的。你想讓它做什麼?
- 將問題分成幾個部分:將問題分解成更小、更容易處理的部分。這可以幫助你更清晰地思考問題,並更容易安排各個部分,使它們在應該工作的時間和地點工作。
- 按步驟組織:按照邏輯順序寫出程式步驟。使用自然語言,避免使用特定的程式設計結構或方法,如控制結構或型別轉換。
- 縮排你的行:使用縮排來顯示程式的結構。例如,您可以縮排屬於迴圈內部的程式碼行。
- 測試:測試你的虛擬碼,確保它清晰、合理。為此,你可以用口頭方式或讓其他人閱讀你的虛擬碼,並向你彙報他們認為虛擬碼應該做什麼。
虛擬碼編寫完成後,您需要將其轉化為可執行指令碼。在專案之外,您還可以通過向開源 Git 倉庫投稿、接受程式碼挑戰、在 StackOverflow 或開發社羣上提問/回答問題等方式來練習。
虛擬碼結構
儘管虛擬碼缺乏定義的語法,但開發人員在編寫虛擬碼時經常會用到幾種常見的程式設計結構。下面讓我們逐一介紹。
序列
序列是按特定順序執行的一組語句。它們用於執行或重複一系列簡單的操作。虛擬碼中常用的序列命令包括 INPUT
、 SET
、 PRINT
、 READ
、 DISPLAY
、 SHOW
和 CALCULATE
。
下面是一個使用了其中一些命令的虛擬碼示例:
PROCESS CalculateCost INPUT price, quantity SET cost = price * quantity PRINT "The cost is: " + cost END
這個虛擬碼定義了一個名為 CalculateCost 的過程,它接收價格和數量,將它們相乘來計算成本,然後顯示結果。
條件語句
條件語句允許程式根據某些條件作出決定,然後在滿足(或不滿足)某個條件時指示程式執行某些語句。虛擬碼中經常使用 IF-ELSE
、 IF-IF ELSE-ELSE
和 CASE
語句。
下面是一個用虛擬碼顯示 IF-ELSE
指令碼的示例:
IF user = returning PRINT "Welcome back!" ELSE PRINT "Welcome!"
在上面的示例中,我們描述的流程是向以前訪問過的使用者顯示 “Welcome back!” 資訊,但只向新使用者顯示 “Welcome!” 資訊。
迭代語句
迭代語句在一個更大的函式或流程中重複一組步驟。迭代語句的任務通常是對列表中的多個專案執行相同的操作,或者重複一個流程,直到滿足某些條件為止。
迭代對於多次重複一組步驟非常有用,可以使用各種型別的迴圈來實現,包括 FOR
、 WHILE
和 DO-WHILE
迴圈。
下面我們來看一些使用 FOR
迴圈遍歷數字列表的虛擬碼:
PROCESS PrintWholeList INPUT listOfNumbers FOR each number in listOfNumbers PRINT number END FOR END
在上述虛擬碼中,我們的 PrintWholeList 程序接收一個數字列表,然後遍歷列表,將每個數字顯示在螢幕上。FOR
迴圈允許程序對列表中的每個專案重複 PRINT
命令。
或者,我們也可以利用常見的虛擬碼來實現與上述迴圈相同的功能。在虛擬碼中,使用關鍵字 REPEAT
和 UNTIL
代替 DO-WHILE 更為常見:
PROCESS PrintWholeList INPUT listOfNumbers SET counter = 0 REPEAT PRINT listOfNumbers[counter] SET counter = counter + 1 UNTIL counter = length of listOfNumbers END
如圖所示,我們可以隨意更換名稱、關鍵字和語法片段。這只是虛擬碼靈活性的一個例子。關鍵是要確保邏輯的穩定性,同時使用足夠普遍、任何人都能讀懂的名稱。
在稍後的虛擬碼示例中,我們將看到這些結構的應用。
虛擬碼最佳實踐
正如我們前面提到的,編寫虛擬碼沒有嚴格的語法,因為它不是一種真正的程式語言。
儘管如此,以下幾條一般準則可以幫助你每次都寫出清晰、有效的虛擬碼:
- 使用自然語言:虛擬碼應使用自然語言而非技術術語,以任何人都能輕鬆理解的方式編寫。
- 保持簡單:避免使用複雜的語言或語法,重點是用簡潔明瞭的方式表達演算法或流程的步驟。
- 具體:編寫虛擬碼時要儘可能具體,包括變數名和具體值等資訊。
- 省略不必要的細節: 如果你正在為採用哪種大小寫約定或是否使用分號而煩惱,那你就想得太多了。讓您的虛擬碼文字儘可能簡單明瞭。
- 使用類似程式設計的元素:雖然虛擬碼不應使用特定的程式語言編寫,但使用迴圈、條件語句和函式呼叫等元素可能會有所幫助,使讀者更容易理解您的程式步驟。
- 使用縮排顯示層次結構:縮排可以用來顯示程式中各步驟的層次結構,從而更容易理解程式的邏輯和結構。
遵循這些指導原則,您就能編寫出清晰有效的虛擬碼,供您和他人用作在特定程式語言或指令碼語言中實現函式或演算法的指南。
虛擬碼示例和轉譯
讓我們來看看一些虛擬碼示例,以及它們在各種語言和框架中被轉譯成可執行程式碼的情況。
PHP
首先,讓我們編寫一些虛擬碼,模仿將給定列表中的所有數字相加的邏輯:
PROCESS FindTotal INPUT listOfNumbers SET sum = 0 FOR EACH number IN listOfNumbers SET sum = sum + number END FOR PRINT sum END
我們的虛擬碼邏輯遵循以下步驟:
- 為函式命名。
- 從終端使用者處獲取數字列表。
- 建立一個名為 sum 的變數,用於儲存計算出的數字總和。
- 逐一遍歷列表中的每個數字,將每個數字加到總和中。
- 新增完所有數字後,結束迭代(迴圈)。
- 顯示所有數字相加後的最終總和。
- 結束函式。
既然我們已經知道了函式的邏輯,就可以將這個虛擬碼翻譯成任何其他語言或框架。讓我們看看轉譯成 PHP 會是什麼樣子:
function findTotal($listOfNumbers) { $sum = 0; foreach ($listOfNumbers as $number) { $sum += $number; } echo $sum; }
Node.js
接下來,讓我們編寫一些虛擬碼,用來檢查訪客的當前時間,然後根據他們的時間向他們傳送適當的問候語:
PROCESS TimedGreeting GET userTime IF userTime > 6:00 + < 12:00 PRINT "Good morning!" ELSE IF userTime > 12:00 + < 18:00 PRINT "Good afternoon!" ELSE PRINT "Good evening!" END
我們的虛擬碼邏輯遵循以下步驟:
- 為函式命名。
- 查詢使用者的時間。
- 如果使用者的時間在早上 6:00 至中午 12:00 之間,則顯示訊息 “Good morning!”
- 如果使用者的時間在中午 12:00 至下午 6:00 之間,則顯示資訊 “Good afternoon!”
- 其他時間則顯示 “Good evening!”。
- 結束函式。
轉譯成 Node.js 可能是這樣的:
function timedGreeting() { const userTime = new Date(); if (userTime.getHours() > 6 && userTime.getHours() < 12) { console.log('Good morning!'); } else if (userTime.getHours() > 12 && userTime.getHours() < 18) { console.log('Good afternoon!'); } else { console.log('Good evening!'); } }
Python
在下一個示例中,讓我們編寫一些虛擬碼,概述反轉使用者提供的字串(在本例中為句子)的邏輯:
PROCESS ReverseString INPUT string SET reversed_string = reverse of string PRINT "The reversed sentence is: ", reversed_string END
我們的虛擬碼邏輯遵循以下步驟
- 為函式命名。
- 提示使用者輸入字串,並接受使用者提供的字串。
- 儲存使用者字串變數的值。
- 對儲存的字串值進行切分,使其反轉,並將結果儲存到一個新變數中。
- 在螢幕上顯示反轉後的字串。
- 結束函式。
如果轉譯成 Python,可能會是這樣的:
string = input("Enter a sentence: ") reversed_string = string[::-1] print("The reversed sentence is: ", reversed_string)
在某些情況下,您的實際翻譯程式碼會比您的虛擬碼短。這沒有問題。只要您的虛擬碼邏輯合理,翻譯後的程式碼也能發揮應有的功能,您就可以忽略長度上的差異。
現實世界的流程
由於虛擬碼的可讀性和靈活性,它甚至可以用來定義編碼世界之外的流程。
比方說,你想列出粉刷臥室的步驟。這樣的虛擬碼可能是這樣的:
PROCESS PaintBedroom INPUT color PREPARE bedroom REMOVE furniture from room COVER floors with drop cloth TAPE off trim PAINT walls SETUP ladder LOAD paint roller with paint ROLL paint onto walls ALLOW paint to dry FINISH REMOVE tape and drop cloth REPLACE furniture DISPOSE of trash END
當然,由於粉刷臥室是一項與計算機無關的物理操作,因此不需要將其轉化為程式語言。但是,只要遵守虛擬碼的最佳實踐和慣例,你就會發現通過虛擬碼來描繪和交流現實世界中的流程是多麼容易。
小結
作為一名開發人員,您應該清楚自己的時間有多麼寶貴。您應該儘可能通過實施能節省時間、精力和挫折感的策略來保護自己的時間。
對於各種語言和技能水平的開發人員來說,編寫虛擬碼都是一項省時省力的絕佳措施,而且無需額外的工具或開銷,就能將其順利整合到工作流程中。通過虛擬碼,開發人員可以清晰簡明地規劃出程式碼,然後再深入細緻地編寫和測試程式碼,從而節省時間、避免錯誤,並更輕鬆地與團隊成員協作。
評論留言