powerbuilder提示不是下拉窗口_为什么过去状态管理不是问题?

78ced7549769f641ff483399dc12ab17.png

2-tier 架构

远古时期,状态是完全由数据库管理的。数据库提供的连接是有状态的,打开页面的时候开连接,页面上的改动直接提交到当前的数据库连接。数据库连接的状态就是页面状态。

2ebfcc7db07b5c8e9d50fe134ffb7f32.png

3-tier 架构

后来因为互联网类型的应用的发展,数据库无法承受更多的连接。所以页面打开的时候不再开数据库连接了,仅仅在渲染和提交操作的时候才开连接拿数据。在服务端 jsp 直接渲染页面的 B/S 架构年代,状态是这样分布的

6b204c14124cf0d4840f2460c7f58666.png

这样的架构下,状态管理仍然是非常简单的。虽然有 database / jsp / html 三份状态,但是数据源只有 database 一个。所有的改动都需要先提交到 database,然后重服务端 jsp 重新渲染,客户端的 html 重新绘制。从数据迁移的角度来说,database => jsp 的网络带宽是非常高的,在内网情况下甚至 N+1 查询都不是太大的事情。如果查询实在太多了,手工写几个大 SQL 优化一下特定几个 jsp 页面的查询就好了。

4-tier 架构

静态 html 页面的问题是 I/O 太慢了。所有的操作都需要提交到 database,然后再完整重新渲染。虽然 Ruby on Rails 有 Render Partial 之类的优化,可以用 jquery 做一个局部 div 的全刷新。但是仍然需要在网络走一个完整的来回。现代的 Web Ui 需要操作更立即响应,需要在前端浏览器进行本地的计算和状态管理。这就事实上变成了 4 tier 的架构。

3790e4a4c70518fd9652658cb934f97d.png

React + Redux 自身是有状态的一层。然后由单向数据流绑定到了 DOM 上,DOM 本身是没有独立的状态的,完全由 React 驱动。这个架构改动的冲击是非常大的。不是所有的改动都立即提交到数据库了,而是有的时候提交到前端的 store 里就可以重新渲染了,有的时候需要提交命令给后端改数据库。同时数据状态迁移也更难做,外网的带宽低延迟高,不能像 jsp 连数据库那样随意查询。Java 提供的 JSON 接口也需要定义更复杂的数据结构来支持前端页面的渲染需求,以及提供数据校验的结果。再加上前后端分工引起的团队人员上的隔离,这个“带宽低延迟高”的特点也体现在了跨角色的沟通上。

大部分 no code / low code 的解决方案是无法给开发者提供足够的状态控制能力的。因为让开发者独立管理前端状态,比起页面绑定数据库要难太多了。所以市面上的 no code / low code 的平台从状态管理的角度来看是和远古时期的 PowerBuilder / FoxPro 非常类似的理念。

5-tier 架构

更现代的 Ui 要求在界面上有更及时的动效反馈。例如滑动的时候可以有弹簧的效果,页面切换的时候可以有滑出的效果。动画的特点是要求至少 30 fps,也就是在 1000 / 30 ms 的时间内要计算出一帧的数据状态,然后拿去做重渲染。用 javascript 勉强可以达到流畅,但是如果加上 React 的 virtual dom 计算就做不到流畅了。所以在 React / DOM 之间又架了一层“动画状态”层,比如 react-spring。这一层控制动效的状态可以理解为 5th tier。

feb27168837e1f52caccd4da1b895efc.png

从 2-tier 到 5-tier 的驱动力至始至终都是相同的,就是 I/O 开销。因为动画计算不能发送到 React 端去计算,必须在 DOM 内本地计算,也是一种对 I/O 的优化。而不断优化 I/O 的背后是用户对 Ui 体验越来越苛刻的要求。

未来的 N-tier 架构

未来会怎么发展?会不会因为 5G 网络的发展使得 3-tier 架构复兴?目前来看,光速短期只能无法被克服,面向延迟优化的倾向是不会变的,除非现代物理学有重大突破。同时因为大家对于跨屏融合体验的要求越来越高,家里有小度的音箱,有投影仪,有手机。我们预期的是这些设备的体验是一体的,和你在一个显示器上的多个窗口不应该有本质区别。这样带来的结果必然是 5-tier 上还要再架上几层。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 查询前10门课程_数据库面试题:如何查找每门课程的前3名?

看到别人的面经里有类似这样一个问题,我自己试了下,感觉做不出来。DROP TABLE IF EXISTS SC;CREATE TABLE SC (SId varchar(10) DEFAULT NULL,CId varchar(10) DEFAULT NULL,score decimal(18,1) DEFAULT NULL);INSERT INTO SC VALUES (01, 01, 80.0);IN…

Java编程程序异常处理方法

对于java异常处理你是否都掌握了呢,如果是,你是否能在下面这段代码中,迅速找出异常处理的六个问题吗? 1、OutputStreamWriter out …   2、java.sql.Connection conn …   3、try { // ⑸   4、 Statement stat conn.…

[html] img中的src加载失败时如何用默认图片来替换呢?

[html] img中的src加载失败时如何用默认图片来替换呢? img有onerror属性,加载失败时触发error事件 但是这种解决方法在error里面替换的默认图片也加载失败的时候会导致问题,需要注意个人简介 我是歌谣,欢迎和大家一起交流前后端…

学完php在学python_写给PHP程序员的 Python学习指南(建议去看原文)

原文:https://segmentfault.com/a/1190000019710720一、背景人工智能这几年一直都比较火,笔者一直想去学习一番;因为一直是从事PHP开发工作,对于Python接触并不算多,总是在关键时候面临着 基础不牢,地动山摇…

mysql 实例复制_MYSQL教程MySQL 复制详解及简单实例

《MysqL教程MysqL 复制详解及简单实例》要点:本文介绍了MysqL教程MysqL 复制详解及简单实例,希望对您有用。如果有疑问,可以联系我们。MysqL 复制详解及简单实例主从复制技术在MysqL中被广泛使用,主要用于同步一台服务器上的数据至多台从服务…

[html] 解释下什么是CDATA?

[html] 解释下什么是CDATA? CDATA 指的是不由 XML 解析器进行解析的文本数据。XML 文档中的所有文本均会被解析器解析。只有 CDATA 区段中的文本会被解析器忽略。个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很…

kali字典_kali黑客系统wpscan工具扫描wordpress漏洞入侵攻击测试教程

WPScan是Kali Linux默认自带的一款漏洞扫描工具,它采用Ruby编写,能够扫描WordPress网站中的多种安全漏洞,其中包括主题漏洞、插件漏洞和WordPress本身的漏洞。最新版本WPScan的数据库中包含超过18000种插件漏洞和2600种主题漏洞,并…

局部遮罩 shade(二)

其实它和全局遮罩是一样的思想&#xff0c;只不过就要用position了 <script type"text/javascript">function shade(){var p document.getElementById("shade");p.className "d";p.style.display "block";}function shadeDis…

[html] 移动端如何禁止用户手动缩放页面?

[html] 移动端如何禁止用户手动缩放页面&#xff1f; <meta name"viewport" content"widthdevice-width,initial-scale1,maximum-scale1,minimum-scale1,user-scalableno">个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易…

python怎么填充画布_如何在kivy中用图像填充画布?

矩形设置为MyPaintWidget的大小&#xff0c;在父小部件上以默认大小绘制。如果MyPaintWidget是根小部件&#xff0c;那么设置self.size将允许它占用整个窗口空间。(请注意&#xff0c;当前结构只会在on-touch-down事件上调整画布的大小。因此&#xff0c;如果调整窗口大小&…

[html] HTML5的video怎样预加载(支持全量加载)?

[html] HTML5的video怎样预加载&#xff08;支持全量加载&#xff09;&#xff1f; preload"auto"个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

mysql df_MySQL主从复制实战

什么是主从复制使用两个或两个以上的数据库&#xff0c;一部分数据库当做主数据库&#xff0c;而另一部分数据库当做从数据库。系统在主数据库中进行写操作&#xff0c;从数据库记录在主库上所有的写操作&#xff0c;使得主从数据库的数据保持一致。一旦主数据库出现问题时&…

python logistic回归_logistic回归介绍与源码分析

1. 介绍&#xff08;由线性模型引出logistic回归&#xff09;首先介绍一下什么是线性模型呢&#xff1f;线性模型的定义如下&#xff1a;给定 个属性描述的样本 &#xff0c; 代表样本在第 个属性上的取值。线性模型的目的是学习一个函数&#xff0c;它可以通过属性的线性组合来…

[html] 列举几种多列等高布局的方法

[html] 列举几种多列等高布局的方法 1, 使用table布局 .row { display: table; }.row > * { display: table-cell; }2, 使用flex布局.row { display: flex; flex-wrap: wrap; } .row > * { display: flex; flex-direction: column; }个人简介 我是歌谣&#xff0c;欢迎…

当前标签: Entity Framework

当前标签: Entity Framework在Entity Framework中使用泛型 qouoww 2012-04-29 22:39 阅读:1937 评论:4 一步一步学Entity Framework 4.x (3) qouoww 2012-04-27 17:20 阅读:2569 评论:8 一步一步学Entity Framework 4(2) qouoww 2012-04-27 09:10 阅读:2972 评论:7 一步一步…

case mybatis 不同表_解决mybatis case when 报错的问题

在mybatis中使用case when进行条件筛选判断时遇到Failed to process, please exclude the tableName or statementId.这样的报错信息&#xff0c;报错的信息是语法错误但是我在mysql的命令行中运行sql语句是没问题的//我的case when语句WHERE dept.type 1AND(CASE agent.dept_…

python c cmd_在Python cmd模块中处理CTRL-C

我发现了一些使用Ctrl-C实现所需行为的hacky方法.设置use_rawinput False并替换stdin这个(或多或少……)粘在cmd.Cmd的公共接口上.不幸的是,它禁用了readline支持.您可以将use_rawinput设置为false并传递一个不同的类文件对象来替换Cmd .__ init __()中的stdin.实际上,只在此对…

[html] 列举几种瀑布流布局的方法

[html] 列举几种瀑布流布局的方法 flex方法&#xff1a; .waterfall{ //从上到下 display: flex; flex-direction: row; } .column { //从左到右 display: flex; flex-direction: column; width: calc(100%/3); }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。…

Activity、BroadcastReceiver、Service共同工作的简单例子

? Activity 好像是應用程式的眼睛&#xff0c;提供與User 互動之窗。 ? BroadcastReceiver 好像是耳朵&#xff0c;接收來自各方的Intent。 ? Service 好像是手&#xff0c;提供符合Intent 意圖之服務。 10.2.1 操作情境&#xff1a; 1. 此程式一開始&#xff0c;畫面出現兩…