声明性编程的优点
简述
SQL是一种声明性质的编程语言。而所谓声明性质的语言是说,你不再需要告诉电脑你需要怎么做,你只需要告诉你的电脑需要作什么就好了。
两段类比
例如你想从一个一个数组中找到所有大于0的数,在类C语言(一种伪代码)中,你可能会这么编写程序:
for(int i=0;i<100;i++)
{
if(array[i]>0) print(array[i]);
}
上面就是传统的过程性编程,你告诉电脑具体的代码,编译成汇编语言,作为机器指令一条一条执行。
而对于声明性语言(SQL)则是如下:
select Value
from array
where array.value>0
你无需再关心循环的过程。代码更加容易阅读,也很容易维护。
当然,你为此付出的代价就是你能做的细微化控制减少了。例如你不能在找到第一个合适的数据后退出。也不能找到连续两个大于0数据出现的位置。
这儿两者的代码量可能是差不多的。但对于更加复杂的循环来说,结果就不一样了。
//找到一个系中既选修了英语,又选修了化学,且两者得分都高过90分的人。并输出他们的姓名和各自得分。
//已知数据是每门课的选修学生姓名,得分等信息。
for(int i=0;i<StudentNum;i++)
{
if(ChemecialGrade[i].value>90)
{
name=ChemecialGrade[i].name;
for(int j=0;j<StudentNum;j++)
{
if(EnglishGrade[j].name=name)
print("他的姓名是:",name,
"化学得分:",ChemecialGrade[i].value,
"英语得分:",EnglishGrade[j].value);
}
}
}
//已经实现的结构体 分数|数值,获得人姓名
struct Grade {value,name}
而使用SQL的结果则简单得多:
select name,ChemecialGrade.value,EnglishGrade.value
from ChemecialGrade,EnglishGrade
where ChemecialGrade.name=EnglishGrade.name
AND ChemecialGrade.value>90
AND EnglishGrade.value>90
本质
SQL语言并非什么全新的语言,只不过是全新的语法罢了。SQL的本质就是循环。
声明性语言的本质是对某一类过程的封装。不是将其封装为函数的方式,因为函数的调用是呆板的,而是将其封装为语法的形式。语法的使用只需要几个简单的单词,就可以完成很多的工作。
不妨这么认为,
对于重复度极其高的,流程单一的动作,将其声明化封装起来,很有价值。
例如C#就原封不懂采取了内置SQL语言来声明化封装。在C#中,当你需要查询数组,字典等的某个数据时,可以很方便快捷。
在你自己设计语言的时候(如果有这一天的话),也可以为之添加一些声明化的要素。
如果你是一个某学科的工作者,你可以用一门过程性语言自己去创造一个声明性语法。本质上就是一个包含语法高亮与检查的编译器,一套语法规则,以及从外界导入文件,并拆解分析的过程性代码。
一个很好的例子体现在画图上。虽然函数式画图有点儿类似声明化的画图。但其仍旧没有声明化绘图来得直观明了。虽然绘图比起查询数据起来的确花样繁多得多,但我猜测,多年以后,绘图也会用声明化的方法高度统一起来。
以声明性的角度看HTML语言
最后,我们再来看声明化编程的重头。HTML语言。
HTML语言包含很多元素。如标题,段落,表格,图片,按钮等。
你无需关注他们实施的细节,你只需要用一个简单的标签,就可以很快捷的”画出”上面那些东西,甚至的,你还可以为之设定颜色,字体,大小等要素。
(我们称之为标签语言,但其本质是声明化编程。实现这些元素的代码已经封装了起来。)
网页是千奇百怪的,但其要素却是高度相似的,与上边高度相似的动作不同,这儿高度相似的是事物以及其属性。
不止如此的,CSS甚至将版式也用声明化的方法高度封装了起来,js的诸多库提供的动作也有声明化的特点。
这么一想,是不是HTML的本质更加简单了呢?
总结:
声明化本质就是一种封装,目的是为了便于使用,本质是语法层面的封装,看起来像是声明而非告知计算机怎么做,这就是声明化编程。
声明化编程适用于规范且高度重复的过程或事物。
你可以按照此思想,用过程性语言来实现一个声明性语言。