声明式编程——抽象程度更高,关注是什么(what),而非如何做(how)

CSDNAngularJS的设计理念是什么?灵感来自于什么?

MiskoAngularJS遵循的设计理念是——构建UI应该是声明式的。这也是AngularJS中标识符(directives)想法的灵感来源。

因此有了下文的摘录:

声明式编程和命令式编程的比较

先统一一下概念,我们有两种编程方式:命令式和声明式。

我们可以像下面这样定义它们之间的不同:

  • 命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。
  • 声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)

声明式编程和命令式编程的代码例子

举个简单的例子,假设我们想让一个数组里的数值翻倍。

我们用命令式编程风格实现,像下面这样:

var numbers = [1,2,3,4,5]

var doubled = []

for(var i = 0; i < numbers.length; i++) {

  var newNumber = numbers[i] * 2
  doubled.push(newNumber)

}
console.log(doubled) //=> [2,4,6,8,10]

我们直接遍历整个数组,取出每个元素,乘以二,然后把翻倍后的值放入新数组,每次都要操作这个双倍数组,直到计算完所有元素。

而使用声明式编程方法,我们可以用 Array.map 函数,像下面这样:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {

  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

map 利用当前的数组创建了一个新数组,新数组里的每个元素都是经过了传入map的函数(这里是function(n) { return n*2 })的处理。

map函数所作的事情是将直接遍历整个数组的过程归纳抽离出来,让我们专注于描述我们想要的是什么(what)。注意,我们传入map的是一个纯函数;它不具有任何副作用(不会改变外部状态),它只是接收一个数字,返回乘以二后的值。

声明式编程很奇怪吗?

如果你之前没有听说过map 和 reduce 函数,你的第一感觉,我相信,就会是这样。作为程序员,我们非常习惯去指出事情应该如何运行。“去遍历这个list”,“if 这种情况 then 那样做”,“把这个新值赋给这个变量”。当我们已经知道了如何告诉机器该如何做事时,为什么我们需要去学习这种看起来有些怪异的归纳抽离出来的函数工具?

在很多情况中,命令式编程很好用。当我们写业务逻辑,我们通常必须要写命令式代码,没有可能在我们的专项业务里也存在一个可以归纳抽离的实现。

但是,如果我们花时间去学习(或发现)声明式的可以归纳抽离的部分,它们能为我们的编程带来巨大的便捷。首先,我可以少写代码,这就是通往成功的捷径。而且它们能让我们站在更高的层面是思考,站在云端思考我们想要的是什么,而不是站在泥里思考事情该如何去做。

声明式编程语言:SQL

也许你还不能明白,但有一个地方,你也许已经用到了声明式编程,那就是SQL。

你可以把SQL当做一个处理数据的声明式查询语言。完全用SQL写一个应用程序?这不可能。但如果是处理相互关联的数据集,它就显的无比强大了。

像下面这样的查询语句:

SELECT * from dogs
INNER JOIN owners

WHERE dogs.owner_id = owners.id

我可没说SQL是一种很容易懂的语言,也没说一眼就能把它们看明白,但基本上还是很整洁的。

SQL代码不仅很短,不不仅容易读懂,它还有更大的优势。因为我们归纳抽离了how,我们就可以专注于what,让数据库来帮我们优化how.

我们的命令式编程代码会运行的很慢,因为需要遍历所有 list 里的每个狗的主人。

而SQL例子里我们可以让数据库来处理how,来替我们去找我们想要的数据。如果需要用到索引(假设我们建了索引),数据库知道如何使用索引,这样性能又有了大的提升。如果在此不久之前它执行过相同的查询,它也许会从缓存里立即找到。通过放手how,让机器来做这些有难度的事,我们不需要掌握数据库原理就能轻松的完成任务。

声明式编程的总结

声明式编程让我们去描述我们想要的是什么,让底层的软件/计算机/等去解决如何去实现它们。

在很多情况中,就像我们看到的一样,声明式编程能给我们的编程带来真正的提升,通过站在更高层面写代码,我们可以更多的专注于what,而这正是我们开发软件真正的目标。

转自:http://www.vaikan.com/imperative-vs-declarative/

参考:https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch6.html#声明式代码

时间: 2024-08-09 06:35:30

声明式编程——抽象程度更高,关注是什么(what),而非如何做(how)的相关文章

阿里云人工智能小Ai是比深度学习更高阶的算法

(上图为阿里云人工智能科学家闵万里) 4月8日,在<我是歌手>的第四季总决赛中,出现了一个不速之客,这就是扬言能预测歌王的阿里云人工智能机器人小Ai.开场前,小Ai预测黄致列夺冠概率第一,尽管最终的歌王是李玟,但小Ai成功预测了前三名. 在了解阿里云人工智能机器人小Ai的基本运作过程后,记者认为小Ai的算法其实已经不仅是深度学习,而是在深度学习之上的更高阶算法,并就此向阿里云人工智能科学家闵万里求证,得到的回复:是的. 小Ai算法高阶在哪里? 尽管阿里云方面没有透露关于小Ai更多算法方面的信息

打听别人工资的7个话题,让你薪水更高

你打听过同事的工资吗?你的同事问过你的工资吗?你怎么看待这件事儿呢?这就是这篇文章要聊的话题,包括但不限于: 同工不同酬现象 打探工资的常见途径 你为什么会打听别人的工资 职业的本质 商业价值与工资的本质 如何面对同事工资比自己高 怎样凸显自己的商业价值 Ok,先从一个小故事开始啦,也许这里的阿巧就是你吧. 同工不同酬 五号是公司发工资的日子,阿巧心情超好,就等待着下午那个短信--"您的个人账户于--存入xxx元,当前余额xxx元[中国银行]".可是等来短信后没多久,她就无意中看到了同

Struts 2.x仍然明显落后于时代。 Struts 2.x这一类老牌Web MVC开发框架仅能用于开发瘦客户端应用,无法用来开发对于交互体验要求更高的应用。

后来我在工作中陆续使用过Struts 1.x和Struts 2.x.我曾经把一个开源的基于Struts 1.x的自助式广告联盟应用移植到Spring MVC,还基于Struts 2.x做过网站开发.Struts 1.x的主要问题是框架的侵入性太大,不利于代码重用和单元测试.Struts 2.x确实进步很大,完全基于POJO,学习曲线低了很多,还支持零配置(不需要XML配置,甚至也不需要Annotation).尽管如 此,Struts 2.x仍然明显落后于时代.  Struts 2.x这一类老牌W

Java新手学习路线,0基础学习Java怎样效率更高?

Java是老牌编程语言,拥有扎实的群众基础和广阔的市场应用,从业人员薪资也普遍较高.很多人想要加入到Java开发行列,不过0基础学习Java怎样效率更高? 很多0基础学习Java的同学想知道怎样学习效率更高?小编以为,学习Java需要一个系统的过程,而根据你未来的职位方向不同,学习也各有侧重.目前来说,Java就业方向包括Web开发.大数据开发.Android开发以及各种后端服务开发领域,但不论你选择哪一个,都要从最基础的知识点学习. Java基础知识点多且杂,初学者在开始的时候需要认识什么是J

如何为新的应用获取更高的关键字排名

最近的一项研究发现,移动应用程序,几乎63%都是通过应用程序商店搜索发现.这也表示在App Store搜索是用户发现和下载应用程序最常用的方法.因此,对于app开发商来讲,如何让自己的应用程序在AppStore榜单上有更高的关键词排名是一件很重要的事情.对于大多数的应用程序,搜索是最常用的方法,而且带来的安装量也很客观. ASOtop1正是一家做app海外搜索排名优化和应用好评的公司!他们推出了TryMyApps和BestReviewApp这两款工具很好的解决了app开发商对搜索下载量以及应用好

.NET快速信息化系统开发框架 V3.2-&gt;WinForm版本新增新的角色授权管理界面效率更高、更规范

角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能)权限.可以对所有角色.用户.模块(菜单).操作(功能)权限进行集中批量设置,角色户授权范围的设置(类似于用户授权范围的设置),表字段权限的设置以及表约束条件权限的设置等. 在角色授权管理模块可以对指定角色进行相应权限的分配与收回,添加与移除角色所拥有的用户,对角色所拥有的操作功能.模块访问权限等进行

打破牢笼,展望更高层次的世界

笔者袁永福是一个十多年的老程序猿出来创业多年,期间经历许多曲折和磨难,成功的在炮火连天的商业战场上活了下来,并持续发展中.其中不少体会,于是提出本文的主题--打破牢笼,展望更高层次的世界. 回顾过去,我认为每个程序猿都关在一个透明的牢笼中,限制了思维.蒙蔽了眼界.蹉跎了岁月而不自知,如果不尝试走出去是一辈子都不能感知到牢笼的存在.这个牢笼就是技术本身. 一些程序员就要说,我们就是靠技术吃饭的,天天考虑各种编程技巧,技术怎么成为束缚我们的牢笼呢?那是因为很多人只是看到软件技术的表象而没看到本质.[

OSChina 周五乱弹 —— 生命诚可贵,改 BUG 价更高?

周五!!!每天醒了都想做一件轰轰烈烈的大事,可是我还木有男神电话,这让我如何是好?心中纵使有万千宏图大愿无法实现,这一天看来又是非常平凡的一天了- @李察德-泰森  :我有女神的电话号码,每天都能知道她睡醒没有.打电话给她,没人接就是还没醒:打电话给她,挂掉了,就是醒了.你们不要太羡慕我! 2014 没剩下几天了,这一年,无论平凡或者有何轰轰烈烈的经历,都应该开始总结一下了,温故而知新- @jeffsui  : 父亲住院20天了,经历了一次又一次大喜大悲.回到家,一个人静静想了很多.2014年,

Kotlin将Realm提升到更高层次

作者:Víctor Manuel Pineda 时间:Feb 14, 2017 原文链接:https://antonioleiva.com/kotlin-realm-extensions/ 当有人问我,最喜欢Kotlin什么,我很难找出其突出特性. 数据类型.拉姆达(Lambda)表达式.类型推断.委托- 所有这些都担当起一系列完整的.有意义的提升,使其在这些方面不同于其基础的Java. 探索Kotlin扩展 当然,这些特性其中任何一个都是我使用最多的扩展.在所有我的Android项目中,我都利