声明式编程和命令式编程

我正在研究两种编程,声明和命令范式的主要范式。 在我的教科书和维基百科上发表了模棱两可的言论之后,我很难过,比如:

声明式: - 专注于计算机要做什么。 - 没有“副作用” - 没有控制流程

当务之急: - 重点关注计算机应该如何做到这一点。 - 如何根据动作顺序来做到这一点

你会如何区分这两种编程模式? 如果你可以扩展上面的陈述,这将是非常有帮助的。


SQL是经典的声明性语言:你说“看看这张表,并给我所有符合这些标准的行”(并且在现实生活中你使用连接,选择列表,但是它是相同的基本声明)。 正如你上面提到的,这个声明告诉计算机你想要什么,而不是如何去做。

在内部,数据库系统使用C语言实现,并且您的SQL查询将被转换为以下必要步骤:

while (another row to process)
    read row from disk
    for (every test)
        if (test fails)
            continue to next row
    add row to result-set

这里要注意的关键之一是显式控制流程:while,for和if。 这些不会出现在声明性语言中。


命令式编程顺序执行可能操纵基础状态的语句。

java中的一些命令式编程:

Customer customer = null;

// first create a customer and have the variable reference it
customer = new Customer(); 
// the state of the customer variable has changed

// set the id on whatever object is *currently* being referenced by the variable
customer.setId(1);
// the state of the Customer object has changed

customer.setFirstName("Bob");
customer.setLastName("McBob");

请注意,如果您按照上述顺序进行操作,则会导致空指针异常:

Customer customer = null;
customer.setFirstName("Foo");   // the customer variable is still null at this point
customer = new Customer();   // too late!

声明式编程没有状态或顺序,只是声明。

这里是一个简单的例子 - 这个XML片段可以被认为是声明性的:

<NewCustomers>
  <Customer>
    <Id>1</Id>
    <FirstName>Bob</FirstName>
    <LastName>McBob</LastName>
  </Customer>
</NewCustomers>

它不会谈论客户对象如何构建,只是声明部分。 如何解释和执行上述内容取决于编程环境。


HTML和Web浏览器分别是每个范例的很好例子。 HTML(和CSS)是声明性语言 - 您告诉Web浏览器标记什么,但不知道如何去做。 换句话说,像<h1>My title</h1>这样的代码行告诉Web浏览器要显示的内容 - 带有文本“我的标题”的标题标签 - 但现在如何在屏幕上实际绘制它。

然而,网络浏览器通常以强制性方式编写。 它采用这些声明性标记定义,并实际指示计算机如何将这些元素绘制到屏幕上。

链接地址: http://www.djcxy.com/p/22907.html

上一篇: declarative programming and imperative programming

下一篇: What is the difference between casting and conversion?