原文转自:https://zhuanlan.zhihu.com/p/26085755
从年会看声明式编程(Declarative Programming)
和声明式编程相对应的是命令式编程(Imperative Programming),大部分语言的hello world都是从命令式编程开始的。
什么是声明式编程?可以从一个现实中的例子来说明,这个例子就是年会。
举个年会的栗子?
作为我国科技公司的一个特色,每年春节前后都要举行年会,忙活了一年怎么都要热闹热闹,搞点娱乐活动,而且一定要有员工参与的娱乐活动,也就是要员工表演节目,表演节目就需要恰当的道具,所以,采购道具是年会准备中的重要一环。
每个公司准备年会节目道具的流程可能都会不一样,这里说一下我司Hulu的方法,技术公司的流程是非常技术化的,可谓声明式编程的楷模。
在Hulu,每个组都要在年会出节目,HR和各组节目负责人协调道具的采购,这个过程是这样:
HR告知每一个节目负责人:“你们节目需要什么道具?告诉我,我会去买。”
然后,每个节目负责人会和自己的组员商量节目内容,最后给HR一个道具列表,之后就等着HR通知去领道具就行了。
结束了!这就是声明式编程的思想。
你可能会问:就这么简单?
回答:就这么简单,所有的采购、运输、协调,都由HR来做了。
没有对比就没有伤害,如果是用命令式编程的思想来处理,我们看看是怎样一个过程:
HR告知每一个节目负责人:“要开年会了,你们有XXXXX元的预算,自己想办法去买,怎么买去哪买自己搞定,记得要发票,拿发票填报销申请,清楚了吗?”
各节目负责人:“好吧。”
HR又补了一句:“对了,买完之后记得告诉我道具有多大,不然不知道租多大车运去年会现场。”
各节目负责人齐声说:“知道了。”
然后,每个节目负责人就去淘宝天猫或者京东上去找道具,和店家讨价还价,下单,要发票,回来之后填报销申请,然后还要告诉HR道具有多大,嗯,每个节目负责人都要忙这么一圈。
我真心希望,你所在公司不是用这种命令式编程的方式来采购年会道具的。
现在,你看到了“声明式编程”和“命令式编程”的差别了吗?
在声明式编程中,开发者要做的事情只是描述“我要的是什么样子”,至于具体怎么做,并不是开发者要关心的事情。在React中,每个组件通过render函数返回“这个组件应该长得什么样”,而不去描述“怎么样去让这个组件长成这个样子”。
在声明式编程的Hulu年会道具采购方式中,HR相当于React,各节目负责人相当于基于React开发的组件,各节目负责人只描述自己需要什么,而具体的采购、报销、运输事务都由HR完成。
与此相对的,在命令式编程的方式下,每个节目负责人都操碎了心,处理的事务很多,各组重复劳动不说,还容易出错。
声明式编程的好处
声明式编程让开发者的工作简化了在年会的例子里,HR和各节目负责人的接口清晰而简单,节目负责人不用操心怎么买,不用操心怎么报销,不用操心怎么运输,专心搞艺术创作就行。
当然,有人也许要抬杠,说:不还是有HR在操这些心吗?
一个人操心总好过一群人操心吧,而且,我相信HR比你更会讨价还价,也更会买。
React也一样,也许你能够用jQuery写出超厉害的代码,但是React处理DOM更专业,不会比你处理得更差。
声明式编程减少了重复工作
各节目负责人的采购和报销,其实都是重复的劳动,毫无创意可言,这种事情交给HR统一来操作,肯定会效率更高,而且不容易出错,简单说,HR干这些事情专业啊,专业的事情就交给专业的人去做。
React让开发者不用再记忆jQuery那变幻无穷的DOM操作方式了,一样也是避免了重复劳动,减少了出bug的可能。
声明式编程留下了改进的空间
假如说,突然发现我司突然有人贡献了一个超级会员卡,在某电商网站上买东西一折优惠,我们当然想要用上,因为这是一个巨大的改进。
在命令式编程风格下,因为每个节目负责人自己操作采购,那就要把这张超级会员卡送到每一个节目负责人手上去买;在声明式编程风格下,各节目负责人不操心采购,只要把这张卡交给HR一个人就搞定了。
在React的世界里,如果React有一个重大的内部结构改进,比如React Fiber,虽然算法改头换面,但是组件却几乎不用改,因为组件只操心“显示什么”而不操心“如何显示”啊,当然不受影响了。
声明式编程提供了全局协调能力
还是举个例子,假如我们的年会节目预算有一百万(我说的是假如),在命令式编程的风格下,HR怎么确保不要超了预算呢?如何防止预算没有被充分使用呢?
似乎没有好办法,要是完全靠各组负责人自觉,保不准某个组真的买了九十九万的道具,那就完了,所以,一般HR用平均分或者给按人头给每个组一个报销额度上限,超额部分不给报销,这样当然可以避免超支。
但是,也有可能某些组比较朴素,群口响声,道具只买了十几个折扇,这样就白白浪费了预算,HR完全不知道如何协调,因为这些采购操作都是各组操作的,不到报销的时候她不知道钱怎么花的呀。
在声明式编程的风格下,各组的采购都由HR来控制,HR就能够全局控制一下,发现某组实际想要买的道具价格很低,那其他组的道具就可以多花一些钱,这样一百万基本都能花光,这样一来,预算就充分发挥作用了。
HR也不用要求各节目负责人上报道具大小,因为收货人是HR,她自然知道道具是多大。
在React的未来,每个组件还是只声明“想要画成什么样子”,但React却可以改进协调算法,让React组件根据不同优先级来渲染,提高用户感知性能,但是React组件的代码不需要改变,也是一样的道理。
总结
希望这个年会的例子能让大家加深对声明式编程的理解,也祝愿大家下次有一个快乐而不操心的年会,给大家拜个早年,早了11个月。
给我司打个广告,想要了解Hulu公司在北京分舵的更多资讯,知晓技术公司的日常,请扫描下面的二维码关注“Hulu”。
aHR0cDovL3dlaXhpbi5xcS5jb20vci9fRU1yTTBURUFobDlyUUJROXhicQ== (二维码自动识别)
相关推荐
特性-声明式编程,采用c#编写。采用活用c#的"特性"这个技术点
【AI框架基础】系列第四篇!最后一篇啦,函数式编程和声明式编程有什么区别?AI到底应该用什么编程范式?希望跟大家一起学习探讨完,能够把AI框架的编程模式搞清楚!
spring编程式事务与声明式事务详解,超详细!
实际我也是,但是这次想说的不是他们,而是声明式编程(declarative programming)范式和陈述式编程(imperative programming)范式这两个兄弟。 这两种开发范式有些历史,上世纪就已经出现了。小伙伴日常开发都在...
声明式编程流:主动式流声明式程序员。 通过以下URL查看谁在线:
全面分析_Spring_的编程式事务管理及声明式事务管理.
1.实现方式:符号式编程vs命令式编程 2.图的定义:动态定义vs静态定义 3.可视化:tensorboard vs nothing
Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握。本教程从基础知识开始,详细分析了 Spring 事务管理的使用方法,为读者理清思路。
第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 第2章 对象和Visual Basic 第3章 定制对象 第4章 公共语言运行库 第5章 用Visual Basic进行声明式编程 第6章 异常处理和调试 第7章 测试驱动的开发第Ⅱ部分 业务...
第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 第2章 对象和Visual Basic 第3章 定制对象 第4章 公共语言运行库 第5章 用Visual Basic进行声明式编程 第6章 异常处理和调试 第7章 测试驱动的开发第Ⅱ部分 业务...
第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 第2章 对象和Visual Basic 第3章 定制对象 第4章 公共语言运行库 第5章 用Visual Basic进行声明式编程 第6章 异常处理和调试 第7章 测试驱动的开发第Ⅱ部分 业务...
org-dp.el —使用Org元素进行声明式本地编程 作者:Thorsten Jolitz版本:1.0 URL: : 包装要求:((cl-lib“ 0.5”)) 元数据 评论 使用Org元素进行声明式本地编程的函数。 它们允许声明应该做什么,并将低级工作...
命令式编程已成为过去!无需使用传统方法来构建代码-使用for循环,线性控制流和变量-metamine使您可以使用方程式而不是语句来编写代码。这些方程式是不变且永恒的:诸如x = y + 1类的方程式可以放在源代码中的任何...
C# C#是一种通用的多范式编程语言,它包含静态类型,强类型,词法范围,命令式,声明式,函数式,泛型,面向对象和面向组件的编程学科。类和对象。 C#中的所有内容都与类和对象以及其属性和方法相关联。例如: 在...
spring编程式和声明式事务管理,事务放在dao,存演示版本!懂!
23 声明式API与Kubernetes编程范式.pdf
——Lambda表达式函数式编程是什么命令式编程(Imperative)声明式编程(Declarative)函数式编程(Functional)总结函数式编程的好处Lambda表达式函数式接口五种形式1.无参数2.有单个参数3.有多个参数4.实现有多行5.带...
Spring 声明式事务和Spring 编程式事务
RxJava提供了一系列操作符和扩展,使得开发人员可以以声明式方式编写异步代码,并能够轻松地处理异步任务、事件和数据流。 响应式编程是一种编程范式,它强调在数据流系统中,以流式方式处理异步事件。与传统的命令...
4.掌握基于AOP的声明式事务编程 按照三层架构构建web项目,在业务层添加事务控制。 1.创建web project项目命名为aopweb 2.添加spring支持、hibernate支持 3.配置WEB-INF/applicationContext.xml提供基于AOP的声明...