Power Fx 是 Microsoft Power Platform 使用的低程式碼語言。 它是一種通用型、強型別、宣告式且函數式的程式語言。
Power Fx 會以人性化的文字表示。 這是一種低程式碼語言,製作者可以直接在類似 Excel 的公式列或 Visual Studio Code 文字視窗中使用。 低程式碼中的「低」源自語言的簡潔與簡單,使得製作者與開發者都能輕鬆完成常見的程式設計任務。 它讓從從未程式設計者從無程式碼開始,到對資深專業人士來說的「專業程式碼」開發,中間沒有學習或重寫的障礙。 多元團隊能合作並節省時間與成本。
Note
- Microsoft Power Fx 是 Power Apps 中的畫布應用程式公式語言的新名稱。 本概述及相關文章仍在進行中,Microsoft 正從 canvas 應用程式中擷取該語言,並將其整合至其他 Microsoft Power Platform 產品,並以開放原始碼形式提供。 若要深入了解並體驗現今的語言,請從 Power Apps 文件中的開始使用畫布應用程式中的公式,並註冊免費 Power Apps 試用版。
- 在本文中, 製作者 指的是可能在程式設計技能光譜兩端使用某項功能的使用者。 開發人員指的是功能較進階且可能超出一般 Excel 使用者的範圍。
Power Fx 會將物件與類似宣告式試算表公式整合。 例如,將 UI 控制項的可視屬性視為 Excel 工作表中的單元格,並具有一個基於其他控制項的屬性來計算其值的關聯公式。 邏輯公式會自動重新計算該數值,類似試算表的方式,這會影響控制項的可見性。
此外,Power Fx 也會在需要時提供命令式邏輯。 工作表通常沒有可以將更改提交至資料庫的按鈕,但是應用程式通常可以。 宣告式和命令式邏輯使用相同的表達語言。
Microsoft 將以開源軟體形式提供 Power Fx。 目前它已整合進 canvas 應用程式中,Microsoft 正著手從 Power Apps 中擷取,供其他 Microsoft Power Platform 產品及 開放原始碼 使用。 更多資訊:GitHub 上的 Microsoft Power Fx
本文為語言和設計原則的概觀。 要深入了解 Power Fx,請參閱以下文章:
Think 試算表
如果您可以像在 Excel 中構建工作表一樣輕鬆地構建應用程式,感覺如何?
如果您可以利用現有的試算表知識,感覺如何?
這些問題啟發了 Power Apps 和 Power FX 的誕生。 每天有數億人用 Excel 製作工作表。 讓我們帶給他們簡單且使用他們已經熟悉的 Excel 概念的應用程式。 透過將 Power Fx 從 Power Apps 中分離出來,我們將找到這些問題的解答,讓您能建立自動化、虛擬助理或其他網域。
所有的程式設計語言 (包括 Power Fx) 都有運算式:一種表示數字、字串或其他資料類型的計算方式。 例如,大多數語言中的 mass * acceleration 代表 mass 和 acceleration 的乘積。 你可以把表達式的結果放進變數、用作程序的參數,或是將它嵌套在更大的表達式中。
Power Fx 則更進一步。 運算式本身並沒有說明計算的內容。 由製作者決定將其放置在變數中或將其傳遞給函數。 在 Power Fx 中,您不是只編寫沒有特定含義的運算式,而是編寫一個公式將運算式繫結到識別碼。 您會編寫 force = mass * acceleration 作為計算 force 的公式。 當 mass 或 acceleration 變更時,會 force 自動更新為新值。 運算式描述了一個計算過程,公式給出了該計算的名稱並將其用作配方。 這就是我們將 Power Fx 稱為公式語言的原因。
舉例來說,此 Stack Overflow 公式會以相反順序搜尋字串。 在 Excel 中,看起來就像是下方的影像。
Excel 中內含公式的公式欄螢幕擷取畫面:=RIGHT(A1,LEN(A1)- FIND("|", SUBSTITUTE(A1," ","|", LEN(A1)-LEN(SUBSTITUTE(A1," ","")))) Cell A1 contains the text「大家好! 很高興見到你!」儲存格 A2 包含文本「你!」
Power Fx 使用相同的公式,將儲存格參考取代為控制項屬性參考:
Power Apps 中 Power Fx 公式列的螢幕擷取畫面。 公式為 =RIGHT(Input.Text,Len(Input.Text)- FIND("|", SUBSTITUTE(Input.Text," ","|", Len(Input.Text)-Len(Substitute(Input.Text," ","")))) 在公式下方的輸入框中,輸入文字「大家好! 很高興見到你!」會一個字母一個字母地出現。 同時在標籤方塊中,會出現最後一個單詞的字母。 當全文顯示在輸入方塊中時,單字「你!」會出現在標籤方塊中。
當 Input 控制值改變時, Label 控制項會自動重新計算公式並顯示新值。 這裡沒有其他語言中常見的 OnChange 事件處理程序。
另一個例子則使用螢幕顏色的 Fill 公式。 當控制紅、綠、藍的滑桿變換時,背景顏色也會自動改變,並重新計算。
這裡沒有其他語言中常見的 OnChange 事件滑桿控制。 根本沒有辦法明確地設置 Fill 屬性值。 如果顏色未按預期工作,則需要查看此公式以了解為什麼它不起作用。 您無需在應用程式中搜尋,索即可找到在意外時間設置屬性的代碼,沒有時間要素。 始終保持正確的公式值。
當滑塊設置為深色時,紅色、綠色和藍色的標籤將更改為白色以進行補償。 此變更透過每個標籤控制項的 Color 性質上一個簡單的公式來實現。
這個公式很棒的地方在於它與顏色的變化是 Fill 隔離的:這兩個計算方式完全不同。 Power Fx 邏輯通常由許多獨立的較小公式組成,而不是大型整合程序。 這種結構讓它們更容易理解,也能在不破壞現有邏輯的情況下進行增強。
Power Fx 是一種宣告式語言,就像 Excel 一樣。 製作者定義了他們想要的行為,但是取決於系統來確定和最佳化如何以及何時完成它。 為了使其實用,大多數工作都是透過沒有副作用的純函數完成的,這使得 Power Fx 也是一種函數式語言 (就像 Excel 一樣)。
一律啟用
工作表的一個定義方面是它們始終存在,並且變更會立即反映。 工作表裡沒有編譯或執行模式。 當你修改公式或輸入數值時,工作表會立即重新計算以反映變更。 任何偵測到的錯誤都會立即浮現,且不會影響練習表的其他部分。
Power Fx 也實現了同樣的效果。 它使用增量編譯器,持續讓程式與所操作的資料保持同步。 變更會自動在程式的圖表中傳播,影響相依計算的結果。 這些計算可能驅動控制器的屬性,如顏色或位置。 增量編譯器也會透過 IntelliSense、建議、自動完成和類型檢查提供了豐富的公式編輯體驗。
在接下來的動畫中,訂單號碼會顯示在依賴滑桿控制的標籤控制中,儘管下方標籤有兩個錯誤。 此應用程式非常活躍,並且具有互動性。 透過輸入 .InvalidName 來修復公式的首次嘗試會立即顯示一條紅線並顯示錯誤,但該應用程式仍會持續執行。
輸入 .Employee時, Data 面板會新增 Employees 資料表,取得該資料表的元資料,並立即提供欄位建議。 你只要從一張桌子走到另一張桌子,系統就會對應用程式的參考資料做出必要的調整。 新增 .Customer 時也會發生同樣的事情。
每次變更後,滑桿將持續最後一個值,並且所有變量都將保留其值。 整個過程中,訂單號碼仍會顯示在最上方標籤中,如預期所示。 這個應用程式全程都在處理真實資料,持續運作。 你可以儲存它,然後離開,其他人也能像 Excel 一樣開啟並使用它。 沒有建置步驟,沒有編譯,只有發佈步驟來判斷應用程式的哪個版本已經準備好。
低程式碼
Power Fx 以簡潔而強大的公式描述商務規則。 大多數邏輯簡化為單一線條,並具備豐富的表達力與對複雜需求的控制。 目標是將製作者需要理解的概念數量減少到最少,理想情況下,不超過 Excel 使用者的已知概念。
例如,若要查詢訂單中員工的名字,您可以撰寫 Power Fx,如以下動畫所示。 除了 Excel 概念外,此處唯一新增的概念是點 "." 代表資料結構的符號,在這個例子中就是 .Employee.'First Name'。 動畫會顯示 Power Fx 公式各部分的對應,以及需要在等效 JavaScript 中明確編碼的概念。
讓我們更深入地看看 Power Fx 為我們所做的一切,以及它因為公式是宣告式而擁有的優化自由度:
異步:中的所有 Power Fx 數據作都是異步的。 製作者不需要指定此名稱,也不需要在呼叫結束後同步作業。 製作者根本不需要了解這個概念,也不需要知道什麼是 promise 或 lambda 函數。
本地和遠端: Power Fx 對本地記憶體中的數據使用相同的語法和函數,並遠端連接資料庫或服務。 使用者不必考慮這種區別。 Power Fx 自動將它可以處理的事委派給伺服器,以更有效地處理篩選和排序。
關係數據:訂單和客戶是兩個不同的表,具有多對一關係。 OData 查詢需要具有外鍵知識的「$expand」,類似於 SQL 中的 Join。 公式中沒有這些內容,實際上,資料庫金鑰是製作者不需要了解的另一個概念。 製作者可以使用簡單的點符號來存取記錄中的完整關係圖。
投影:在編寫查詢時,許多開發人員會編寫
select * from table,這會帶回所有數據列。 Power Fx 會分析整個應用程式所使用的所有欄,即使是跨公式相依性也一樣。 預測會自動最佳化,且製造商也不需要知道「預測」的含義。僅檢索所需的內容:在此示例中,該
LookUp函數意味著只應檢索一條記錄,這就是返回的全部內容。 如果使用Filter函數要求更多的記錄,可能會有成千上萬條記錄符合條件,一次僅返回一頁資料,每頁 100 條記錄。 使用者必須透過圖庫或資料表手勢來查看更多資料,系統會自動為他們帶來更多資料。 製造商可以推論大型資料組合,而無需考慮將資料要求限制為可管理的區塊。只在需要時執行:你為標籤控制的屬性定義一個公式
Text。 隨著所選變數的變更,將自動重新計算LookUp並更新標籤。 製造商不需要為 Selection 編寫 OnChange 處理常式,也不需要記住該標籤依附於它。 如前所述,這是聲明性編程,製造商在標籤中指定了他們想要的內容,而不是如何或何時獲取標籤。 如果這個標籤因為出現在不可見的螢幕上而看不見,或它的Visible屬性是假的,你可以把這個計算延後,等標籤顯示出來,如果這種情況很少發生,就等於把它排除掉。Excel 語法轉換 :許多使用者知道 Excel 中字串串接中使用 & 符號(&)。 JavaScript 會使用加號 (+),而其他語言會使用點 (.)。顯示名稱和當地語系化:
First Name用於公式, Power Fx 而nwind_firstname用於 JavaScript 等效項。 Microsoft Dataverse 和 SharePoint 中,除了唯一的邏輯名稱外,還有資料行和資料表的顯示名稱。 在這種情況下,顯示名稱通常更加適合使用者,但是它們還有另一個重要的特質,就是它們可以本地化。 如果您有使用多種語言的團隊,則每個團隊成員都可以使用自己的語言查看資料表和欄位名稱。 在所有使用案例中,Power Fx 會確保將正確的邏輯名稱自動傳送至資料庫。
無程式碼
你不需要讀寫 Power Fx 來開始表達邏輯。 你可以透過簡單的開關和介面建構器來表達許多自訂和邏輯。 這些無程式碼工具是為了讀寫 Power Fx 而設計的,所以有足夠的空間讓使用者能更進一步。 然而,無程式碼工具永遠無法提供完整語言的全部表現力。 即使使用無程式碼建構工具,公式列在 Power Apps 中仍是核心位置,教育創作者了解他們正在做什麼,讓他們能開始學習 Power Fx。
讓我們來看看幾個例子。 在 Power Apps 中,屬性面板為控件的屬性提供了「無程式碼」開關和旋鈕。 實際上,大多數屬性值都是靜態的。 您可以使用顏色生成器變更 Gallery 的背景色彩。 請注意,公式欄會反映了此變更,將公式更新為另一個 RGBA 叫用。 隨時,你都可以到公式列,將這個變更更進一步——在這個例子中,透過 來 ColorFade 調整顏色。 色彩屬性仍顯示在屬性面板中,但是懸停圖標上會顯示 fx 圖標,並導向公式欄。 可以透過兩種方式進行:刪除 ColorFade 叫用,將使顏色返回到屬性面板可以理解的顏色,並且可以再次使用它來設置顏色。
以下還有一個較複雜的範例。 資源庫會顯示 Dataverse 的員工清單。 Dataverse 提供相關的表格資料。 你可以選擇其中一個視圖,公式會改成使用這個視圖名稱的 Filter 函式。 你可以使用兩個下拉選單,在不碰公式列的情況下調整正確的表格和檢視。 但是,假設您想更進一步,並新增排序。 你可以在公式列新增這個功能,屬性面板也會顯示效果圖示,並引導修改到公式列。 同樣地,如果你把公式簡化成屬性面板能讀寫的,那它就能被使用。
這些例子很簡單。 Power Fx 是描述無程式碼互動的絕佳語言。 它簡潔有力,易於理解。 它提供了在低程式碼「無懸崖」下常常需要的空間。
專業程式碼
低程式碼開發者有時會開發需要專家協助的解決方案,或由專業開發者接手維護與強化。 專業人員還認識到,與建構專業工具相比,低程式碼開發可以更輕鬆,更快速且成本更低。 並非每種情況都需要 Visual Studio 的全部功能。
專業人士會希望使用專業工具來提高生產力。 你可以將 Power Fx 公式儲存在 YAML 原始碼檔中,這些檔案可透過 Visual Studio Code、Visual Studio 或其他文字編輯器輕鬆編輯。 將公式儲存在 YAML 檔案中,可以讓你透過 GitHub、Azure DevOps 或其他原始碼控制系統,將 Power Fx 置於原始碼控制之下。
Power Fx 支援公式型元件進行共用和重複使用。 它支援元件屬性的參數,使得能夠建立純粹的使用者自訂函式,並持續有更多功能。
此外,Power Fx 也非常適合用於將專業人員所建立的元件和服務彙集在一起。 現成的連接器提供數百個資料來源與網路服務的存取。 自訂連接器讓 Power Fx 能與任何 REST 網路服務通訊。 程式碼元件使 Power Fx 能在螢幕與頁面上與完全自訂的 JavaScript 互動。
設計原則
簡單
Power Fx 的設計目標是創客族群,因為他們的成員並未接受過開發者訓練。 語言盡可能使用該受眾已知道或能快速掌握的知識。 成功所需的概念數量保持在最低限度。
簡單對開發人員也有好處。 對開發者而言,Power Fx 旨在成為一種低程式碼語言,縮短建置解決方案所需的時間。
Excel 一致性
Microsoft Power Fx 語言借用了大量的 Excel 公式語言內容。 它善用許多同時使用 Excel 的創作者對 Excel 的知識與經驗。 類型、運算子和函數語義盡可能接近 Excel。
如果 Excel 沒有答案,Power Fx 接下來就會轉向 SQL。 在 Excel 之後,SQL 是第二種最常用的聲明性語言,它可以提供有關 Excel 所不具備的資料作業和強型別輸入的指南。
宣告式
製造商說明了他們希望自己的邏輯做些什麼,如何或何時去做。 這種方法讓編譯器能透過平行執行運算、延遲工作直到需要,以及預先取取並重用快取資料來優化。
例如,在 Excel 工作表中,作者定義儲存格間的關係,但 Excel 決定何時及以何種順序評估公式。 同樣地,你可以把應用程式中的公式想像成根據使用者操作、資料庫變更或計時器事件,根據需要「重新計算」。
功能
使用沒有副作用的純功能。 這種方法使邏輯更易理解,並賦予編譯器最大優化自由度。
與 Excel 不同,應用程式本質上會改變狀態。 例如,應用程式有按鈕可以將紀錄變更儲存在資料庫中。 因此,有些功能確實有副作用,但盡可能限制這些副作用。
組合
盡可能加入能與現有功能良好結合的功能。 你可以把強大的函式分解成更小的部分,這樣你就能更輕鬆地獨立使用。
例如,資源庫控制項沒有單獨的 Sort 和 Filter 屬性。 相反地,你將 和 Filter 函式組合Sort成一個屬性Items。 你可以用雙向編輯器將 UI 用於表達 Sort 和 Filter 行為 Items 的 UI 疊加在屬性之上。
強型別
所有值的類型在編譯時已知。 這種方法能在撰寫時及早發現錯誤並產生豐富的建議。
多型型別是支援的,但在使用它們之前,必須將其型別釘在靜態型態上,而該型別必須在編譯時已知。 提供了 IsType 和 AsType 函數用於測試和轉換類型。
類型推斷
類型是從其使用中衍生而未宣告的。 例如,將變量設定為數字會導致將變量的類型建立為數字。
類型使用衝突會導致編譯時錯誤。
區域設置敏感的小數點分隔符
世界上的某些區域使用點 (.) 做為小數分隔符號,某些則使用逗號 (,)。 Excel 遵循此區域慣例。 其他程式語言通常使用標準點(.)作為全球所有使用者的十進位分隔符。 為了使各個級別的製造商都盡可能地容易上手,對於在法國長大並直使用該語法的人來說,3,14 是一個十進制數字。
小數點分隔符的選擇對用於函數呼叫參數和連結運算子的列表分隔符具有級聯影響。
| 作者語言的小數分隔符號 | Power Fx 小數分隔符號 | Power Fx 清單分隔符號 | Power Fx 鏈結運算子 |
|---|---|---|---|
| 。 (點) | 。 (點) | , (逗號) | ;(分號) |
| , (逗號) | , (逗號) | ;(分號) | ;; (雙分號) |
更多資訊:全球支援
非物件導向
Excel 不是物件導向,Power Fx 也不是。 例如,在某些語言中,字串的長度表示為字串的屬性,例如 JavaScript 中的 "Hello World".length。 Excel 和 Power Fx 而是用 Len( "Hello World" ) 的功能來表達這一點。
具有屬性和方法的元件是物件導向的,Power Fx 可輕鬆使用它們。 但如果可能,建議採用功能性方法。
可延伸
製作者可以使用 Power Fx 來建立他們的元件和功能。 開發人員可以透過編寫 JavaScript 來建立元件和功能。
適合開發人員
雖然創客是主要目標,但盡可能讓開發者友善。 如果不違反前面描述的設計原則,就用開發者能欣賞的方式來做。 例如,Excel 無法新增註解,因此可以使用類似 C 的行註解和內嵌註解。
語言革命
不斷進步的程式設計語言既必要又棘手。 無論目的為何,所有人都擔心變更可能會破壞現有程式碼,並要求使用者學習新的模式。 Power Fx 非常重視向下相容性,但 Power Fx 團隊也堅信他們不一定每次都能完美,社群可以共同學習什麼是最好的。 程式語言必須演進,而 Power Fx 從一開始就設計來支援語言演進。
每份儲存的 Power FX 文件都會包含語言版本的標記。 如果 Power Fx 團隊想要做不相容的更改,他們會寫一個所謂的「反向相容轉換器」,下次修改時會自動重寫公式。 如果變更是團隊需要教育使用者的重大事項,應用程式會顯示訊息並附上文件連結。透過這項功能,Power Fx 仍能載入多年前以預覽版 Power Apps 所建構的應用程式,儘管自那時起發生了許多變更。
例如,Power Fx 團隊引入 ShowError 了顯示紅色背景錯誤橫幅的功能。
用戶很喜歡,但他們也要求能顯示成功橫幅(綠色背景)或資訊橫幅(藍色背景)。 因此,團隊設計了一個更通用 Notify 的函式,該函式會為通知類型再加一個參數。 團隊本可以直接加入 Notify 並維持 ShowError 原有的設定,但他們 ShowError 卻選擇了 Notify。 他們移除了之前正在生產中的一個函式,換成了其他功能。 因為有兩種方式可以做同樣的事情,這項改變會造成混淆——尤其是對新用戶而言——更重要的是,會增加複雜度。 沒有人抱怨、每個人都讚賞變更,然後繼續進行下一個通知功能。
這是將同一款應用程式載入最新版本 Power Apps 後的外觀。 使用者無需執行任何動作即可進行此轉換,在打開應用程式時會自動發生。
透過這項功能,Power Fx 能比大多數程式語言更快且更積極地演進。
無未定義的數值
某些語言 (例如 JavaScript) 會對未初始化的變量或缺少的屬性使用未定義值的概念。 為了簡化起見,Power Fx 避免了這個概念。 其他語言未定義的執行個體將被視為錯誤或空白值。 例如,所有未初始化的變量都以空白值開頭。 所有資料類型的值都可以為空白。