原文转自: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#中,特性(Attributes)是实现声明式编程的一种关键工具。特性提供了元数据信息,可以附加到代码的不同元素(如类、方法、属性等)上...
本文将探讨两种主要的编程范式——函数式编程和声明式编程,以及它们在AI框架中的应用。 首先,我们要理解函数式编程和声明式编程的核心概念。函数式编程强调计算过程为纯函数,即无副作用,相同输入永远产生相同...
Stream API的设计非常适合函数式编程,因为它鼓励使用声明式编程风格,而不是命令式风格。 4. **Optional类**: Optional是一个容器类,代表一个值存在或不存在。它帮助防止空指针异常,鼓励程序员显式处理缺失值...
- **对比**: 将声明式编程与命令式编程进行对比。 ##### 1.9.1 一个函数式的flickr - **案例**: 通过一个具体的flickr应用案例来展示函数式编程的威力。 - **实现**: 展示如何使用函数式编程实现该案例。 ##### ...
声明式编程是一种编程范式,它关注的是程序员想要实现的结果,而非如何实现这一结果的具体步骤。在这种编程风格中,程序是用逻辑或数学表达式来描述的,编译器或解释器负责决定执行顺序。Haskell 是声明式编程语言的...
它提供了一种声明式编程风格,可以方便地进行数据过滤、映射、聚合等操作。Stream可以来源于集合、数组,甚至I/O源。例如,我们可以使用`Stream.of()`创建一个流,然后通过`filter()`、`map()`和`collect()`等方法...
声明式编程模型则基于WebFlux HandlerMapping和HandlerAdapter,与Spring MVC类似,但更偏向于非阻塞和异步处理。 1. 函数式编程: 使用`RouterFunction`和`HandlerFunction`,你可以创建一系列处理函数,它们会...
3. 声明式编程: 函数式编程倾向于使用声明式代码,即表达“我想要什么”,而不是“如何去做”。例如,`Array.prototype.map`函数用于创建一个新数组,其元素是原数组元素经过提供的函数处理的结果,而非使用循环...
- 函数式编程是一种编程范式,它强调使用函数作为基本构建块,避免可变状态和副作用,推崇纯函数和声明式编程。 - 在函数式编程中,程序被视为数学函数的组合,这使得代码更加可预测和易于理解。 1.3 **示例** -...
Spring 编程式事务与声明式事务详解 本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...
这种范式主要侧重于声明式编程,其中开发者会描述任务需要完成什么,而不是如何完成这个任务。在函数式编程中,程序由纯函数组成,这些函数的输出仅依赖于输入的参数,且不会对系统状态产生副作用。这样的设计原则...
代码组合(Compose):代码组合是指将多个函数组合成新函数的过程,它使得复杂的变换能够以一种简单和声明式的方式来组织。 范畴学和Monad:范畴学是抽象数学的一个分支,而在函数式编程中,范畴学为我们提供了一种...
10. **函数式反应式编程(FRP)**:将函数式编程与事件驱动编程结合,通过声明式编程处理时间和变化的数据流。 函数式编程的优点包括更好的可读性、可测试性、可并行性,以及减少因状态变化引发的错误。然而,它也...
Litho的核心理念是将UI的描述方式从传统的命令式编程转变为声明式编程,这种转变带来了诸多优势。 首先,声明式编程允许开发者专注于描述UI的状态和视图之间的关系,而不是手动处理视图更新和状态同步。在Litho中,...
函数式编程是一种以数学函数为基本计算单元的编程范式。在函数式编程中,函数是第一类公民,意味着函数可以被当做参数传递给其他函数、作为其他函数的返回值以及赋值给变量。这种编程范式强调的是无副作用、不变性和...
函数式编程基本可以理解具有以下四种特性:属于声明式编程范式、纯函数、不可变性以及引用透明。 在前端开发中,函数式编程可以帮助管理和减少可变状态,让我们在实际开发中,尽可能的将纯函数从不纯的部分中分离...
实际我也是,但是这次想说的不是他们,而是声明式编程(declarative programming)范式和陈述式编程(imperative programming)范式这两个兄弟。 这两种开发范式有些历史,上世纪就已经出现了。小伙伴日常开发都在...