声明式UI和命令式UI

本文通过数字时钟实例对比了声明式UI和命令式UI的编程方式,强调了声明式UI的简洁性、可维护性和预测性,以及命令式UI的控制和即时性。随着技术发展,声明式UI在复杂应用中的优势日益明显。
摘要由CSDN通过智能技术生成

声明式 UI(Declarative UI)和命令式 UI(Imperative UI)是开发界面时采用的两种不同的编程范式。它们在如何创建和管理用户界面方面有着根本的不同。

当然,让我们通过以下案例来探讨声明式 UI 和命令式 UI 之间的区别:

案例:构建一个数字时钟界面

假设我们的任务是构建一个数字时钟,显示当前的小时和分钟。

命令式 UI 的方式

在命令式 UI 的设计中,你会具体指定每一步如何更新时钟的显示:

  1. 查看当前时间:获取系统当前的小时和分钟。

  2. 显示时间:在界面上创建或找到显示小时和分钟的地方,并设置它们的文本值为当前时间。

  3. 等待一分钟:等待一定时间(比如一分钟)。

  4. 重复步骤:重复上述过程,每分钟更新时间显示。

在这个过程中,开发者需要编写代码来直接操纵界面元素,比如通过查找 DOM 元素并设置其内容或通过某种方式不断轮询系统时间并更新界面。

声明式 UI 的方式

在声明式 UI 的设计中,你会描述界面应该如何根据当前时间显示:

  1. 定义状态:定义一个状态来存储当前的时间。

  2. 声明 UI:声明一个 UI,它根据当前时间状态来显示时间。

  3. 自动更新:当时间状态改变时,框架自动检测到这一变化,并重新渲染时间显示部分。

在这个过程中,开发者不直接与 UI 元素交互;相反,他们只需更新状态,剩下的渲染工作由框架自动完成。开发者只需要关心“时间应该怎么显示”,而不是“如何去显示时间”。

现实世界的类比

  • 命令式 UI 类似于使用遥控器控制电视机:你按下一个按钮(比如增加音量),然后电视立即响应这个具体的命令。

  • 声明式 UI 类似于设置智能家居系统:你定义了“我离开家时关闭所有电器”的规则,然后当系统检测到你离开家时,它自动执行关闭电器的操作。在这个过程中,你只需定义期望的结果,智能系统会处理实现的细节。

通过这个数字时钟的例子和现实世界的类比,我们可以看到命令式 UI 关注于操作步骤,而声明式 UI 关注于结果状态。声明式 UI 提供了更高层次的抽象,使得开发者可以更专注于应用的状态和逻辑,而不是具体的实现细节。

声明式 UI

在声明式 UI 编程中,开发者描述界面应该呈现的状态,而不是描述如何达到这种状态。开发者定义界面的各种状态,以及这些状态如何映射到 UI 的展现上。框架或库负责解释这些声明,并根据状态的变化自动更新 UI。

优点:

  • 简洁性: 代码通常更简洁,因为只需声明想要的结果。

  • 可维护性: 更新 UI 的状态更简单,不需要直接操作 DOM 或视图元素。

  • 可预测性: 由于界面是根据状态自动渲染的,UI 的状态更加可预测。

缺点:

  • 性能: 在某些情况下,性能可能会受到影响,因为框架需要跟踪状态变化并重新渲染 UI。

  • 学习曲线: 对于习惯了命令式编程的开发者来说,理解声明式编程可能需要时间。

示例框架: React, SwiftUI, Flutter

命令式 UI

在命令式 UI 编程中,开发者通过编写一系列的命令来直接操纵 UI 的状态。这些命令具体说明了如何修改 UI,比如添加一个元素、修改样式或者移除某个组件。

优点:

  • 控制: 提供了更细粒度的控制,因为开发者可以精确指定每一步操作。

  • 即时性: 对 UI 的改变可以立即执行,不需要等待框架处理。

缺点:

  • 复杂性: 随着应用的复杂度增加,手动管理所有的 UI 更新会变得越来越困难。

  • 错误风险: 直接操作 UI 可能导致错误,特别是在复杂的动态界面中。

示例框架: 传统的 jQuery, Android 的早期 UI 开发

对比总结

  • 编程范式: 声明式 UI 侧重于“什么”(描述最终状态),而命令式 UI 侧重于“如何”(具体步骤)。

  • 开发效率和可维护性: 声明式 UI 通常提供了更高的开发效率和可维护性,特别是在复杂应用中。

  • 性能和控制: 命令式 UI 在某些情况下可能提供更好的性能和更精细的控制,但代价是增加了开发的复杂性。

随着现代前端和移动框架的发展,声明式 UI 正变得越来越流行,它提供了一个更高级别的抽象,简化了开发过程,尤其是在构建复杂的用户界面时。

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
介绍:facebook开源了litho一个高效的声明UI框架。运行效果:使用说明:dependencies {   // ...   // Litho   compile 'com.facebook.litho:litho-core:0.2.0'   compile 'com.facebook.litho:litho-widget:0.2.0'   provided 'com.facebook.litho:litho-annotations:0.2.0'     annotationProcessor 'com.facebook.litho:litho-processor:0.2.0'      // SoLoader    compile 'com.facebook.soloader:soloader:0.2.0'     // Optional   // For debugging   debugCompile 'com.facebook.litho:litho-stetho:0.2.0'     // For integration with Fresco   debugCompile 'com.facebook.litho:litho-fresco:0.2.0'     // For testing   testCompile 'com.facebook.litho:litho-testing:0.2.0' }测试是否安装成功可以在activity中使用Litho创建一个view来测试是否安装成功。首先,初始化SoLoader。Litho依赖于SoLoader,它帮助加载由布局引擎Yoga提供的本地库。Application类适合做这件事情:[MyApplication.java] public class MyApplication extends Application {     @Override   public void onCreate() {     super.onCreate();          SoLoader.init(this, false);   } }然后把一个Litho文本控件放到一个activity中,显示“Hello World!”:[MyActivity.java] import com.facebook.litho.ComponentContext; import com.facebook.litho.LithoView;   public class MyActivity extends Activity {     @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);          final ComponentContext c = new ComponentContext(this);       final LithoView lithoView = LithoView.create(       this /* context */,        Text.create(c)             .text("Hello, World!")             .textSizeDip(50)             .build());            setContentView(lithoView);   } }现在运行app应该就能看到屏幕上显示“Hello World!” 了。注:不久前翻译了一篇文章Components for Android: 一个高效的声明UI框架 ,现在判断就是说的这个库了,那个时候还没开源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值