?一個較大的程序一般應(yīng)分為若干個程序模塊,每一個模塊用來實現(xiàn)一個特定的功能。所有的高級語言中都有子程序這個概念,用子程序?qū)崿F(xiàn)模塊的功能。比如在C語言中,子程序的作用是由函數(shù)完成的,一個C程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成,由主函數(shù)調(diào)用其它函數(shù),其他函數(shù)也可以相互調(diào)用,同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。在Blockly中,也支持函數(shù)的定義和使用。
?在程序設(shè)計中,常將一些常用的功能模塊編寫成函數(shù),放在函數(shù)庫中供公共選用,所以要善于利用函數(shù),以減少重復(fù)編寫代碼的工程量。
?在C語言和別的語言中,函數(shù)的一個明顯的特征就是使用時帶括號(),必要的話,括號中還要包含數(shù)據(jù)和變量,稱為參數(shù)(Parameter),參數(shù)是函數(shù)需要處理的的數(shù)據(jù)。根據(jù)參數(shù)的有無,可將函數(shù)簡單的分為無參函數(shù)和有參函數(shù)。
?這段話對于沒有接觸過C語言或其他編程語言的同學(xué)可能比較抽象,不過不必?fù)?dān)心,接下來我們會通過Blockly向您詳細(xì)的解釋。
?(1)無參函數(shù)的定義
?上圖是我們從Blockly工具箱中拖出的一個函數(shù)塊,其中:對函數(shù)進行參數(shù)的設(shè)置,無參函數(shù)不需要用到此選項
對工具箱中的Blockly有了簡單的了解之后,嘗試動手設(shè)計自己的函數(shù)。
?上圖是一個簡單的無參函數(shù),它的函數(shù)名就叫“無參函數(shù)”,當(dāng)你從工具箱拖動一個塊在編輯區(qū)的同時,在工具箱中的函數(shù)選項卡中會生成一個對應(yīng)的函數(shù)塊,當(dāng)再用到此函數(shù)時,就可以像使用其他工具箱中的塊一樣直接使用。
(2)有參函數(shù)的定義?與無參函數(shù)不同,有參函數(shù)需要在“設(shè)置”中對參數(shù)進行設(shè)置,拖動“輸入名稱:x”至右側(cè)“輸入”中,并對參數(shù)進行命名即可。
?同時,像無參函數(shù)一樣,你也可以在左側(cè)工具箱“函數(shù)”選項卡中看到對應(yīng)的塊。
(3)函數(shù)的返回值?函數(shù)的另外一個明顯的特征就是返回值,既然函數(shù)可以進行數(shù)據(jù)處理,那就有必要將將處理結(jié)果告訴我們,所以很多函數(shù)都有返回值,所謂的返回值就是函數(shù)的執(zhí)行結(jié)果。
?當(dāng)創(chuàng)建的函數(shù)需要返回值時,可直接從工具箱中拖動自帶返回值的函數(shù)塊,可見工具箱中生成的函數(shù)塊左側(cè)帶有凸起的連接。
?這種方式生成的函數(shù),只有當(dāng)函數(shù)執(zhí)行完成后才會返回值,如果在函數(shù)執(zhí)行過程中就已經(jīng)產(chǎn)生了想要的結(jié)果,也可以拖動"如果..返回"結(jié)束正在執(zhí)行的函數(shù),并返回執(zhí)行結(jié)果。
?注意:?"如果..返回"在使用時,只有當(dāng)函數(shù)最初設(shè)計有返回值時才有返回值,否則只是簡單的結(jié)束正在執(zhí)行的函數(shù)。
?下面來做一個小練習(xí),設(shè)計一個求x, y中最大者的函數(shù),名為Max(x, y)。
?可以按照思維導(dǎo)圖,一步一步進行Max(x, y)函數(shù)的設(shè)計。在進行程序設(shè)計時,無論你是簡單的學(xué)習(xí),還是進行復(fù)雜的開發(fā),在動手之前,一定要對你所設(shè)計的程序有一個良好的規(guī)劃,磨刀不誤砍柴工,好的習(xí)慣很重要,它可以加速你編程水平的提升,提高你的編程效率。
?當(dāng)你設(shè)計完成后,剩下的就是測試驗證程序結(jié)果了,測試時不需要很復(fù)雜,如果可以,最簡單的就是使用"打印"。
?在前幾章的學(xué)習(xí)中,每章開篇我們的小游戲環(huán)節(jié),每個小游戲雖然是可視化編程,和我們學(xué)習(xí)的Blockly很像,但是又有所不同,而這些不同由何而來?這就是我們本章所講的重點,Blockly開發(fā)工具(Blockly Developer Tools),通過它用戶可以自定義新塊,這使得Blockly可擴展性大大提升,同時也是Blockly的靈活和強大之處。
?本節(jié)面向希望在Blockly中創(chuàng)建新塊的開發(fā)人員。它的基本要求是,有一個
?可以編輯的Blockly的本地副本,大體上熟悉了Blockly的使用,并且對JavaScript有一個基本的理解。
?Blockly帶有大量的預(yù)定義塊,從數(shù)學(xué)函數(shù)到循環(huán)結(jié)構(gòu)的一切,然而為了與外部應(yīng)用程序接口,必須創(chuàng)建自定義塊以形成API。 例如,當(dāng)創(chuàng)建繪圖程序時,可能需要創(chuàng)建“繪制半徑R的圓”塊。而在大多數(shù)情況下,最簡單的方法是找到一個已經(jīng)存在的真正相似的塊,復(fù)制它,并根據(jù)需要修改它。
?第一步是創(chuàng)建一個塊; 指定其形狀,字段和連接點。 使用Blockly Developer Tools是編寫此代碼的最簡單的方法,或者,可以在學(xué)習(xí)API之后手動編寫該代碼,高級塊可以響應(yīng)于用戶或其他因素而動態(tài)地改變它們的形狀。
?第二步是創(chuàng)建生成器代碼以將新塊導(dǎo)出為編程語言(例如JavaScript,Python,PHP,Lua或Dart)。為了生成既干凈又正確的代碼,必須注意給定語言的操作列表順序,創(chuàng)建更復(fù)雜的塊需要使用臨時變量和調(diào)用函數(shù),當(dāng)輸入使用兩次并需要緩存時,這是尤為重要的。
?Blockly開發(fā)工具是一個基于Web的開發(fā)工具,可自動完成Blockly配置過程的各個部分,包括創(chuàng)建自定義塊,構(gòu)建工具箱和配置Web Blockly工作區(qū)。
?使用該工具的Blockly開發(fā)者進程包括三個部分:
?1、使用塊工廠和塊導(dǎo)出器創(chuàng)建自定義塊。
?2、使用Workspace Factory構(gòu)建工具箱和默認(rèn)工作空間。
?3、使用Workspace Factory配置工作空間(當(dāng)前是僅限Web的功能)。
?定義一個塊需要使用到Blockly開發(fā)工具中的塊工廠(Block Factory),塊工廠主要分為三個區(qū)域:
?(1)編輯區(qū):對新增塊進行設(shè)計和編輯
?(2)預(yù)覽區(qū):對編輯區(qū)編輯的塊進行實時預(yù)覽
?(3)代碼區(qū):代碼區(qū)分為兩個部分Language code和Generator stub,其中Language code 區(qū)指定和控制新增塊所呈現(xiàn)的形狀,Generator stub區(qū)負(fù)責(zé)新增塊所要生成的代碼。
?在編輯區(qū)的左側(cè),可以看到4個基本塊,Input,F(xiàn)ield,Type和Colour,它們是四個原料庫,使用者可以從這些庫中獲取所需要的任意“原料”,來合成自己的新塊。
?先從最簡單的介紹,顏色(Colour)塊,它默認(rèn)定義了九種基本顏色,直接將你想要的顏色拖到右側(cè),拼接到對應(yīng)的colour的凹槽,便可立即在預(yù)覽區(qū)看到新塊的顏色。
?如果默認(rèn)色彩中沒有你想要的顏色,可以拖動任意色彩塊到編輯區(qū)拼接完成后,點擊色塊中的數(shù)字,在色塊的下方出現(xiàn)一個圓形的調(diào)色盤,轉(zhuǎn)動調(diào)色盤,選擇你喜歡的顏色。
?在Blockly中,同一類型的塊通常采用相同的顏色,所以新塊的顏色選擇不能僅憑喜歡,還需要前后兼顧。
?一個新塊不僅需要有顏色,還需要與其他塊進行銜接,這就需要設(shè)計新增塊的輸入和輸出,它們將決定新增塊的功能、屬性和類別。<>br?接下來看一看輸入(Input),這是新增塊與其他塊連接的接口之一。
?輸入可以分為三種類型:值輸入(value input),聲明輸入(statement input),模擬輸入(dummy input)。首先以值輸入為例,拖動值輸入至右側(cè)與Inputs連接,可看到預(yù)覽區(qū)新增塊多了一個凹槽:
?根據(jù)需要,使用者還可以添加多個輸入值,但要注意多個輸入值的名字不能相同,否則會出現(xiàn)警告,而且在后續(xù)調(diào)用的時候,也會沖突報錯,新塊名字也是如此,不能與其他塊同名,就好比如果班里有兩個學(xué)生名字一樣,那老師點名提問的時候就有可能出現(xiàn)兩個同學(xué)同時起立的尷尬。
?在值輸入中還可以添加域(field),比如加入最簡單的文本域,即可在輸入中提示對應(yīng)的文本,域中的下拉選擇框可設(shè)置文本的對齊方式。
?這些設(shè)置完畢,選擇新塊的輸入方式,擴展式和嵌入式:
?有了輸入之后,別的塊就可以很容易的通過凹槽加入到新塊了,但是,這時另外一個值得考慮的問題又出現(xiàn)了,怎樣將新增塊加入到其他的塊之中呢?我們有五種選擇:
?看完值輸入之后,再一起來看一下另一個常用的輸入類型,聲明輸入(statement input),它通常用作條件控制和循環(huán)控制。
?使用值輸入和聲明輸入,可以很容易的設(shè)計出編程中常用的條件語句和循環(huán)語句:
?任務(wù)一:自己動手定義一個新塊,并描述它的功能。
?塊由其名稱引用,因此要創(chuàng)建的每個塊都必須具有唯一的名稱。 用戶界面強制執(zhí)行此操作,并在您“保存”新塊或“更新”現(xiàn)有塊時清除。
?您可以在先前保存的塊之間切換,或通過單擊庫按鈕創(chuàng)建新的空塊。更改現(xiàn)有塊的名稱是快速創(chuàng)建具有類似定義的多個塊的另一種方法。
?塊被保存到瀏覽器的本地存儲,清除瀏覽器的本地存儲將刪除您的塊。 要無限期保存塊,您必須下載庫。 您的塊庫將下載為可導(dǎo)入的XML文件,以將您的塊庫設(shè)置為下載文件時的狀態(tài)。請注意,導(dǎo)入塊庫將替換當(dāng)前的庫,因此您可能需要先備份導(dǎo)出。
?導(dǎo)入和導(dǎo)出功能也是維護和共享不同組自定義塊的推薦方式。
?如果你設(shè)計了塊,并且想要在應(yīng)用程序中使用它們的時候,可以在塊導(dǎo)出器重完成塊定義和生成器的導(dǎo)出。
?存儲在塊庫中的每個塊都將顯示在塊選擇器中。 單擊塊以選擇或取消選擇要導(dǎo)出的塊。 如果要選擇庫中的所有塊,請使用“選擇”→“所有存儲在塊庫”選項。 如果使用“工作區(qū)出廠”選項卡構(gòu)建了工具箱或配置了工作區(qū),則還可以通過單擊“選擇”→“在工作區(qū)工廠中使用”選擇所有使用的塊。
?導(dǎo)出設(shè)置允許您選擇要定位的生成語言,以及是否需要所選塊的定義。 選擇這些文件后,點擊“導(dǎo)出”即可下載文件。
?工作區(qū)工廠可以方便地配置工具箱和工作區(qū)中的默認(rèn)塊組。 您可以使用“工具箱”和“工作區(qū)”按鈕在編輯工具箱和起始工作區(qū)之間切換。
(1)構(gòu)建工具箱?此選項卡有助于構(gòu)建工具箱的XML,該材料假定使用者熟悉工具箱的功能,如果您在此處要編輯工具箱的XML時,可以通過單擊“加載到編輯”加載它。(2)沒有類別的工具箱?如果您有幾個塊,它們沒有任何類別,想要顯示它們的時候,只需將它們拖動到工作區(qū)中,您將看到您的塊出現(xiàn)在工具箱的預(yù)覽中。
(3)有類別工具箱?如果你想要顯示塊類別,點擊“+”按鈕,并選擇下拉項目為新類別。 這將向您的類別列表中添加一個類別,您可以選擇和編輯。 選擇“標(biāo)準(zhǔn)類別”以添加單個標(biāo)準(zhǔn)塊類別(邏輯,循環(huán)等)或“標(biāo)準(zhǔn)工具箱”以添加所有標(biāo)準(zhǔn)塊類別。 使用箭頭按鈕重新排序類別。
?要更改所選類別名稱或顏色,請使用“編輯類別”下拉菜單。 將塊拖動到工作區(qū)中將將其添加到所選類別。
(4)選擇工作區(qū)選項?為配置選項設(shè)置不同的值,并在預(yù)覽區(qū)域中查看結(jié)果。 啟用網(wǎng)格或縮放會顯示更多配置選項。 此外,切換到使用類別通常需要更復(fù)雜的工作空間; 當(dāng)您添加第一個類別時,會自動添加垃圾桶和滾動條。
(5)將預(yù)加載塊添加到工作區(qū)?這是可選的,但如果要在工作空間中顯示一組塊,則可能需要:?a當(dāng)應(yīng)用程序加載時顯示
?b當(dāng)觸發(fā)事件(提高級別,單擊幫助按鈕等)時顯示
?將塊拖動到編輯空間中,可以在預(yù)覽區(qū)中查看它們。 您可以創(chuàng)建塊組,禁用塊,并在選擇某些塊時創(chuàng)建陰影塊。
(6)導(dǎo)出?工作區(qū)工廠提供以下導(dǎo)出選項:
?◎Starter Code:生成html和javascript以注入您的自定義Blockly工作區(qū)。
?◎工具箱生成XML以指定您的工具箱。
?◎工作區(qū)塊生成可以加載到工作區(qū)中的XML。
(7)更多創(chuàng)建自定義塊的信息,可參考Google Blockly:
https://developers.google.com/blockly/guides/create-custom-blocks/overview
?在之前的學(xué)習(xí)中,我們通過使用Blockly,學(xué)習(xí)一些基礎(chǔ)程序設(shè)計中的經(jīng)典的例子,并通過Blockly的可視化代碼編輯器,進行了編程的實踐練習(xí),我們所接觸和使用的這些,并不是Blockly設(shè)計的初衷。Blockly是一個庫,它為Web和Android應(yīng)用程序添加了一個可視化代碼編輯器,Blockly編輯器使用互鎖的圖形塊來表示代碼概念,如變量,邏輯表達式,循環(huán)等,它允許用戶應(yīng)用編程原則,而不必?fù)?dān)心語法或命令行上閃爍的光標(biāo)。
?每個人不可能精通甚至熟悉每一種語言,但有時候,在學(xué)習(xí)、工作中又可能會用到所未接觸過的語言,如果我們沒有額外的時間且精力,尤其當(dāng)這種語言再極少使用時,我們可能不樂意去花時間和精力去學(xué)習(xí),但又不得不用,于是經(jīng)常陷入兩難。針對這一常見現(xiàn)象,我們就可以使用Blockly作為代碼生成工具。
(1)假如現(xiàn)在我們需要一個判斷平年閏年的Python代碼的小例子,但我們之前又沒接觸過Python,我們又不想學(xué)習(xí)Python,那么就可以打開Blockly,在編輯區(qū)拖動塊來編寫:
拖動完成,驗證無誤,點擊Python選項卡,復(fù)制代碼至你的Python環(huán)境中,即可直接運行。
Python環(huán)境中的運行結(jié)果:
(2)假如現(xiàn)在需要一個JavaScript的執(zhí)行腳本,而且我們對JavaScript也有所了解,我們也可以嘗試在Blockly中進行編程開發(fā),比如這個猜數(shù)字的小游戲:
上面是程序的主體部分,包括循環(huán)、提示和中斷。
在程序之前,創(chuàng)建了三個變量并進行了初始化:
?步長:用于計數(shù),針對猜的次數(shù)進行不同的提示。
?Target:存放隨機生成的目標(biāo)數(shù),與所猜數(shù)Number進行比較。
Flag:開關(guān)變量,用于標(biāo)記是否猜對,從而決定是否提示下方內(nèi)容。
同樣,驗證無誤后,點擊JavaScript選項卡,復(fù)制js代碼并保存。
將保存后的js代碼導(dǎo)入到html文件中測試。
當(dāng)然,也可以把猜數(shù)字小游戲的Python代碼導(dǎo)出,同樣可執(zhí)行。
注意:
◎ Python代碼的導(dǎo)出執(zhí)行,當(dāng)程序涉及輸入且輸入的是數(shù)字時,需要使用int(),將輸入的字符串型“數(shù)字”強制類型轉(zhuǎn)換成整型。
如果不進行強制類型轉(zhuǎn)換,執(zhí)行腳本時可能會報錯,即使不報錯,結(jié)果也可能不正確。但這一問題在JavaScript導(dǎo)出代碼中不存在,兼容性良好。
◎?qū)τ贘avaScript代碼的測試,可以導(dǎo)入到html中,在瀏覽器中執(zhí)行,測試效果與Blockly中效果相同。html代碼如下:
本條注意事項專門針對沒有JavaScript基礎(chǔ),但是對Blockly代碼生成工具又感興趣,想親手測試驗證的讀者。?關(guān)于Blockly作為代碼生成工具的使用,我們這里只舉了兩個基礎(chǔ)的,有代表性的例子,當(dāng)然如果你學(xué)有余力或者對所生成的目標(biāo)代碼十分熟悉,可以自行嘗試更加有趣、更加復(fù)雜的例子,如果你覺得這并不能滿足你的需求,那么可以嘗試自己動手定義你想要的塊,生成代碼的格式、類型和種類。
?隨著Blockly逐漸的完善,它被越來越多的人所熟知,同時,憑借它可視化編程,良好的可擴展性等特點,很多的開發(fā)者利用Blockly進行二次開發(fā),因此衍生出許多優(yōu)秀的產(chǎn)品和工具。
?前面曾提到過,Blockly的初衷是針對開發(fā)人員設(shè)計的,它是一個針對有經(jīng)驗的開發(fā)人員的復(fù)雜庫。從用戶的角度來看,Blockly是一種直觀,可視化的構(gòu)建代碼的方法。從開發(fā)人員的角度來看,Blockly本質(zhì)上是一個包含正確語法、生成代碼的文本框, Blockly可以導(dǎo)出多種語言,例如JavaScript,Python,PHP,Lua,Dart等,下面是對Blockly進行二次開發(fā)的步驟:
a.集成塊編輯器。 Blockly編輯器包括用于存儲塊類型的工具箱和用于排列塊的工作空間。
b.創(chuàng)建應(yīng)用程序的塊。 一旦你的應(yīng)用程序中有Blockly,你就需要創(chuàng)建塊供用戶編碼,然后將它們添加到您的Blockly工具箱。
c.構(gòu)建應(yīng)用程序的其余部分。 本身,Blockly只是一種生成代碼的方法, 你的應(yīng)用程序的核心在于如何處理該代碼。
?可能單純的文字描述比較抽象,難以理解,以FreDuino為例,它是基于Blockly二次開發(fā)而成的一個遠(yuǎn)程硬件控制平臺。
a.集成塊編輯器,在工具箱里增添了與硬件外設(shè)進行交互的編碼塊。
b.創(chuàng)建應(yīng)用程序塊,實現(xiàn)了Blockly塊與硬件控制代碼之間的轉(zhuǎn)換。
c.在構(gòu)建應(yīng)用程序部分,通過與硬件外設(shè)建立通信,實現(xiàn)代碼的上傳,進而完成與硬件的交互。
?FreDuino就是通過上述三個步驟而誕生的,實現(xiàn)了對硬件外設(shè)的遠(yuǎn)程可視化控制。
?1. 寫一個判斷素數(shù)的函數(shù),在主函數(shù)輸入一個整數(shù),輸出是否是素數(shù)。
?2. 設(shè)計定義一個自己的工具塊。
?3. 編寫函數(shù),給出年、月、日,計算該日是該年的第n天,并嘗試將其導(dǎo)出的代碼在其他語言環(huán)境中調(diào)試運行。