lad梯形图编程顺序_重新思考编程:再次使顺序图更酷
lad梯形图编程顺序
介绍
Ballerina语言是围绕顺序图的概念设计的。 与使用声明性语言相比,这最初是作为定义集成流的更好方法而存在的。 声明性语言(例如,基于XML和YAML的语言)通常可用于定义基于数据流的技术。 但是,当我们的操作和逻辑的复杂性增加时,它们变得越来越难以管理。 这是当我们开始转向自定义扩展时,例如成熟的编程语言扩展(如Java)或带有JavaScript的脚本选项来填补功能空白。
我们需要一种能够兼顾两者的技术。 它需要具有通用编程语言所具有的灵活性,同时还具有基于高层抽象对解决方案进行建模的功能。 特别是在当前的云时代,我们需要能够以对开发人员更友好的方式对分布式系统进行建模的技术。 在这些类型的动态环境中,我们需要处理具有多个角色,并发执行流和远程端点的软件系统。
用例:银行ATM操作
让我们看一下一种情况,在这种情况下,我们需要设计一个由多个参与者组成的软件系统,每个参与者代表系统的某种功能。 对于单个用例,我们需要对显示所有参与者如何参与的流程进行建模。 对于我们而言,最自然的表示方法是使用序列图。 图1显示了对银行ATM现金提取操作的功能进行建模的方案。
图1:银行ATM取款顺序图
“客户”是触发系统参与者之间交互的外部参与者。 ATM服务将是一种网络服务,它接收来自客户端的请求并连接到核心银行系统,而核心银行系统又与数据库交互以存储和检索帐户信息。
让我们看一下如何在Ballerina编程语言中使用这种方法。 在这里,我们将使用代码优先的方法定义执行流程,并且由于语法与序列图构造完全兼容,因此我们可以自动可视化以序列图形式编写的代码。
芭蕾舞演员之路
可以使用Ballerina在代码中实现上述ATM操作方案,如图2所示。
图2:VS代码中的BallerinaATM服务代码
上面的代码只是最终代码的框架,没有实现完整的业务逻辑。 您可能已经注意到,我们已将VS Code与Ballerina插件一起使用 。
在右上角,有“显示文件概述”选项,单击该选项可打开以下面板。
图3:VS代码中可视化的BallerinaATM服务模型
上图显示了从我们之前实现的框架代码生成的序列图。 入口点是服务资源功能。 参与者显示为“呼叫者”,代表正在调用服务资源的客户。 “默认”参与者是资源功能本身,显示其生命线中的操作。 从资源函数开始,其生命线中将显示更多函数调用,例如checkBalance()和debitAccount()调用,并且它们的内部操作被进一步扩展并合并到同一序列图中以显示其操作。
客户端对象和远程方法
在这些部分中,我们可以看到序列图中的另一个参与者“ accountDB”,它表示我们正在与之交互的数据库。 在Ballerina中,这些是特殊的网络客户端对象,它们具有自己的生命线来表示其功能以及它可以接收的消息。 发送到这些网络客户端的消息或对其进行的调用称为远程方法。 远程方法是客户端对象内部的一种特殊方法,代表通过网络进行的呼叫。 正常方法调用和远程调用之间的区别是通过使用箭头“->”符号来调用远程方法来区分的。
例如,在我们之前的示例中,以下行表示在数据库客户端上完成的客户端操作调用,以检索数据库记录。
var selectRet = check accountsDB->select( "SELECT balance FROM Account WHERE id = ?" ,Account, id);之前我们谈到“调用者”是调用我们服务资源的参与者。 这实际上是我们资源方法的第一个参数的名称,它也恰好是表示我们服务资源的调用方的客户端对象。 以下代码显示了资源函数定义的声明。
resourcefunction withdrawMoney ( http:Caller caller, http:Request request,string id, decimal val ) returns @ tainted error ?类型为http:Caller的调用者实例是Ballerina中的一个客户端对象,资源创建者可以通过调用其远程方法来使用它与调用者进行通讯。 通过使用此模型,我们可以轻松实现消息传递模式,例如双向通信,并与调用方进行多次交互,而不仅仅是在资源方法定义的末尾将结果返回给调用方。 下面的行显示了我们如何使用调用者实例来响应客户端。
var result = check caller->respond( "Fail: no funds" );这里的结果表示从调用方检索到的响应,例如,如果有错误传回给调用方,我们可以在资源方法中执行进一步的操作,而不必忽略它。 这种模式鼓励采用更健壮的方法来处理错误。
并发
Ballerina的并发模型是使用链的概念构建的。 线束是轻量级线程,其中单个操作系统线程可以包含多个线束。 单个线程在线程中一次运行,并且属于单个线程的线程协同执行多任务。 这对在Ballerina中实现非阻塞I / O操作特别有益,在该状态中,子线程允许我们优化CPU时间的使用。
工人是我们在Ballerina中用来表示函数中单链执行的构造。 一个函数可以有多个工作程序,以便在函数中定义并发操作。 下面的图4中显示的功能是对我们之前的场景的更新,在该场景中,我们执行了一些操作来启动系统。
图4:VS代码中的BallerinaATM服务启动代码
在代码中,我们正在联系几个网络端点,检索信息并最后报告某些状态。 网络操作与执行某些计算所需的一些计算代码混合在一起。 即使我们的initSystem函数将在单个线程中运行,也可以通过内部使用strands对执行进行优化。 当I / O操作通过HTTP网络调用进行时,用户空间调度程序将已将线程的物理执行切换到其他工作程序来完成处理。
让我们看一下如何在序列图视图中可视化Ballerina的并发执行。 initSystem函数的图表视图如下图5所示。
图5:VS代码中可视化的BallerinaATM服务启动模型
在这里,我们可以看到工作程序已经成为HTTP客户端旁边序列图的参与者。 工人在其生命线中看到的激活是同时发生的,并且工人之间的任何通信都是通过消息传递,使用Ballerina的send(->)和receive(<-)动作完成的。 另外,在工作程序之间的消息传递场景期间,编译器会进行显式检查,以验证发送和接收操作是否处于一致状态,以避免运行时出现任何死锁场景。
通过这种方式,我们可以轻松地对并发执行及其通信通道建模,并使用顺序图方便地对其进行可视化。 这种编程方法为我们编写的代码提供了自我说明,并总体上提高了生产率。
摘要
我们已经看到了Ballerina是如何设计的,始终可以以有意义的方式生成程序表示形式的序列图。 在针对网络客户端,侦听器,并发结构,消息解析和许多其他方面的语言特殊结构中可以看到这种行为。
可以在此处访问示例场景中使用的框架代码。 有关Ballerina的更多信息,请参阅Ballerina学习页面。 您可以在我们的Slack频道或Google小组中参与用户和开发讨论。
翻译自: https://hackernoon.com/rethinking-programming-making-sequence-diagrams-cool-again-6z1p3yv9
lad梯形图编程顺序
总结
以上是生活随笔为你收集整理的lad梯形图编程顺序_重新思考编程:再次使顺序图更酷的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 计算机芯片制造原理,从沙粒到芯片,原来C
- 下一篇: 161210随笔日记