声明性编程的优点

声明性编程的优点

简述

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的本质更加简单了呢?

总结:

声明化本质就是一种封装,目的是为了便于使用,本质是语法层面的封装,看起来像是声明而非告知计算机怎么做,这就是声明化编程。

声明化编程适用于规范且高度重复的过程或事物。

你可以按照此思想,用过程性语言来实现一个声明性语言。

猜你喜欢

转载自blog.csdn.net/qq_40938169/article/details/83501174