Power Fx 是将跨 Microsoft Power Platform 使用的低代码语言。 它是一种强类型、声明性、一般用途的函数式编程语言。
Power Fx 用对人类友好的文本表示。 它是一种低代码语言,制作者可以直接在类似 Excel 的公式栏或 Visual Studio Code 文本窗口中使用。 低代码中的“低”是由于语言的简洁性和简单性,让制作者和开发人员都可以轻松进行一般的编程任务。 它可以进行从面向没有编程经验的用户的无代码到面向经验丰富的专业人士的“专业代码”的全面开发,无需通过学习或重写来解决二者之间的差异,从而使不同的团队可以协作并节省时间和费用。
Power Fx 将对象与类似于声明性电子表格的公式绑定在一起。 例如,将 UI 控件的 Visible 属性视为 Excel 工作表中的单元格,它具有基于其他控件的属性来计算其值的关联公式。 公式逻辑会自动重新计算该值,这与电子表格的方式类似,这会影响控件的可见性。
此外,Power Fx 也根据需要提供命令性逻辑。 工作表通常没有可以将更改提交到数据库的按钮,但是应用通常会有。 相同的表达式语言用于声明性和命令性逻辑。
Power Fx 将作为开源软件提供。 它目前已集成到画布应用中,您现在就可以在其中体验一下。 我们正在从 Power Apps 中提取它,以用于其他 Microsoft Power Platform 产品并用作开放源代码。
让我们更深入地了解 Power Fx 可为我们执行的所有工作,以及因为公式是声明性的而必须优化的自由度:
- 异步:Power Fx 中的所有数据操作都是异步的。 制作者不需要对此进行指定,也不需要在调用结束后同步操作。 制作者根本不需要知道此概念,也不需要了解什么是 promise 或 lambda 函数。
- 本地和远程:Power Fx 使用与数据库或服务中本地内存中和远程数据相同的语法和函数。 用户不需要考虑此区别。 Power Fx 自动将相关内容委派到服务器以更有效地处理筛选器和排序。
- 关系数据:订单和客户是两个不同的表,具有多对一关系。 OData 需要“$expand”以及有关外键(类似于 SQL 中的联接)的知识。 公式中没有此内容,实际上,数据库密钥是制作者无需了解的另一个概念。 制作者可以使用简单的点表示法从记录中访问关系的整个图形。
- 投影:编写查询时,很多开发人员会编写 select * from table,这会返回所有数据列。 Power Fx 分析在整个应用中,甚至跨公式依赖关系使用的所有列。 投影会自动优化,同样,制作者不需要知道“投影”的含义。
- 仅检索所需内容:在此示例中,LookUp 函数意味着只应检索一条记录,这就是返回的全部内容。 如果使用 Filter 函数请求更多记录—可能有数千条记录符合条件,一次将仅返回一页数据,每页大约 100 条记录。 用户必须对库或数据表进行手势操作来查看更多数据,系统会自动为他们引入数据。 制作者可以推出大型数据集,而无需考虑将数据请求限制为可管理的区块。
- 仅在需要时运行:我们为标签控件的 Text 属性定义了一个公式。 当所选变量发生更改时,LookUp 将自动重新计算并且标签将更新。 制作者不需要为“选择”编写 OnChange 处理程序,也不需要记住此标签依赖于它。 这是如前所述的声明性编程:制作者指定他们想要在标签中包括哪些内容,而没有指定获取它的方式或时间。 如果此标签不可见是因为它在屏幕上不可见,或者它的 Visible 属性为 false,我们可以将此计算推迟到标签可见之后,来有效地消除这种情况(如果这种情况很少发生)。
- Excel 语法翻译:很多用户都使用 Excel,其中大多数人都知道与号 (&) 用于字符串连接。 JavaScript 使用加号 ( ),其他语言使用点 (.)。
- 显示名称和本地化:First Name 用于 Power Fx 公式,而 nwind_firstname 用于 JavaScript 等效项。 在 Microsoft Dataverse 和 SharePoint 中,除了唯一的逻辑名称外,还有列和表的显示名称。 在这种情况下,显示名称通常要对用户友好得多,但是它们还有另一个重要的品质,就是它们可以本地化。 如果您有一个多语言团队,每个团队成员都可以使用自己的语言查看表和字段名称。 在所有用例中,Power Fx 都会确保将正确的逻辑名自动发送到数据库。
无代码
您不必读取和写入 Power Fx 就可以开始表达逻辑。 可以通过简单切换和 UI 生成器表达许多自定义和逻辑。 这些无代码工具被构建为读取和写入 Power Fx,以确保有足够的净空让用户进一步利用它,同时也要承认无代码工具将永远无法提供完整语言的全部表达能力。 即使与无代码生成器一起使用,公式栏也在 Power Apps 中处于前沿和中心位置,用于培训制作者将代表他们执行哪些操作,以便他们可以开始了解 Power Fx。
让我们来看看一些示例。 在 Power Apps 中,属性窗格为控件的属性提供无代码切换和旋钮。 实际上,大多数属性值都是静态值。 您可以使用颜色生成器来更改 Gallery 的背景颜色。 请注意,公式栏将反映此更改,将公式更新为其他 RGBA 调用。 您随时可以转到公式栏,进一步进行操作—在本示例中,是使用 ColorFade 调整颜色。 颜色属性仍会显示在属性面板中,但是将鼠标悬停在上面时会显示 fx 图标,您将被定向到公式栏。 这可以通过两种方式完全实现:删除 ColorFade 调用将使颜色返回到属性面板可以理解的内容,您可以再次使用它来设置颜色。
下面是一个更复杂的示例。 库显示来自 Dataverse 的员工列表。 Dataverse 提供表数据的视图。 我们可以选择这些视图之一,公式将更改为使用包含此视图名称的 Filter 函数。 两个下拉菜单可用于拨入正确的表和视图,而无需接触公式栏。 但是,假设您需要进一步处理,添加排序。 我们可以在公式栏中执行此操作,属性面板将再次显示 fx 图标并将修改定向到公式栏。 同样,如果我们将公式简化为属性面板可以读取和写入的内容,可以再次使用它。
这些都是简单的示例。 我们认为 Power Fx 是描述无代码交互的良好语言。 该语言简明、强大且易于分析,并提供对低代码“无差异”所需的常用净空。
专业代码
低代码制作者有时会构建需要专家帮助或由专业开发人员接管的东西,以进行维护和增强。 专业人士也赞同,与生成专业工具相比,低代码开发更容易、更快速且成本更低。 并非所有情况都需要 Visual Studio 的完整功能。
专业人士希望使用专业工具来提高效率。 Power Fx 公式可以存储在 YAML 源文件中,这些文件可以使用 Visual Studio Code、Visual Studio 或任何其他文本编辑器轻松地进行编辑,并支持通过 GitHub、Azure DevOps 或任何其他源代码控制系统将 Power Fx 置于源代码管理下。
Power Fx 支持基于公式的组件,以便共享和重用。 我们宣布了支持组件属性的参数,支持创建纯用户定义的函数,并在此过程中进行更多增强。
此外,Power Fx 还适用于将专业人士生成的组件和服务组合在一起。 现成连接器提供对数百个数据源和 Web 服务的访问权限,自定义连接器使 Power Fx 可以与任何 REST Web 服务通信,代码组件使 Power Fx 可以与屏幕和页面上完全自定义的 JavaScript 进行交互。
设计原则
简单
Power Fx 主要针对未受过开发人员培训的制作者受众。 如果可能,我们使用此访问群体已知或者可以快速汲取的知识。 成功所需的概念数将降到最低。
设计简单对开发人员也有益。 对于开发人员访问群体,我们旨在设计一种可以减少生成解决方案所需时间的低代码语言。
Excel 一致性
Microsoft Power Fx 语言大量借用 Excel 公式语言。 我们寻求利用很多也使用 Excel 的制作者的 Excel 知识和经验。 类型、运算符和函数语义尽可能与 Excel 接近。
如果 Excel 没有答案,我们接下来会期待 SQL。 在 Excel 之后,SQL 是下一种最常用的声明性语言,它可以提供有关 Excel 不提供的数据操作和强键入的指导。
声明性
制作者描述他们希望自己的逻辑做 什么,而不是确切的 如何 或 何时 做。 这让编译器可以通过并行执行操作,将工作推迟到需要时以及预取和重用缓存的数据来进行优化。
例如,在 Excel 工作表中,作者定义单元格之间的关系,但是 Excel 决定何时以及以什么顺序对公式进行求值。 类似地,应用中的公式可以根据需要基于用户操作、数据库更改或计时器事件,被视为的“recalc-ing”。
函数式
我们偏爱没有副作用的纯函数。 这样可以使逻辑更容易理解,并为编译器提供最大的优化自由。
与 Excel 不同,应用本质上确实会改变状态—例如,应用具有将更改保存到数据库中记录的按钮。 因此,某些函数确实有副作用,尽管我们已尽可能限制它。
组合
在可能的情况下,添加的功能可以与现有功能很好地结合在一起。 强大的函数可以分解为较小部分,它们更易于单独使用。
例如,库 控件没有单独的 Sort 和 Filter 属性。 相反,Sort 和 Filter 函数将组合成一个 Items 属性。 表达 Sort 和 Filter 行为的 UI 通过为此属性使用双向编辑器,被放置在 Items 属性的上层。
强类型
所有值的类型在编译时已知。 这允许在创作时及早检测到错误并提供丰富的建议。
支持多态类型,但是必须先将其类型固定为静态类型,并且必须在编译时知道该类型,才能够使用它们。 提供 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 Apps 预览版构建的应用,不管那之后发生了多少更改。
例如,我们引入了 ShowError 函数来显示带有红色背景的错误横幅。
虽然用户喜欢它,但他们还请求我们提供一种显示成功横幅(绿色背景)或信息性横幅(蓝色背景)的方法。 因此,我们提出了一个更通用的 Notify 函数,来为通知类型获取第二个参数。 我们本来可以添加 Notify 并按原样保留 ShowError,但是我们改为用 Notify 代替 ShowError。 我们删除了以前一直使用的函数,用其他函数代替了它。 由于有两种方法可以做同一件事,因此,这会引起混乱—特别是对于新用户,最重要的是,这会增加复杂性。 没有人抱怨,所有人都赞成此更改,然后迁移到下一个通知功能。
这是相同的应用在加载到最新版本的 Power Apps 中时的外观。 用户无需执行任何操作即可进行此转换,它将在打开应用时自动发生。
凭借这一才能,Power Fx 可以比大多数编程语言更快、更进取。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。