C# 更改程序状态。声明性程序可以双重地视为编程命令或数学断言

C# 更改程序状态。声明性程序可以双重地视为编程命令或数学断言,c#,paradigms,imperative-programming,declarative-programming,C#,Paradigms,Imperative Programming,Declarative Programming,函数式编程:是一种编程范式,它将计算视为对数学函数的评估,并避免状态和可变数据。它强调函数的应用,而命令式编程风格强调状态的变化。 在纯函数式语言(如Haskell)中,所有函数都没有副作用,状态更改仅表示为转换状态的函数 在中,下面的命令式编程示例循环遍历数字1到10,并查找偶数 var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; //With imperative programm

函数式编程:是一种编程范式,它将计算视为对数学函数的评估,并避免状态和可变数据。它强调函数的应用,而命令式编程风格强调状态的变化。 在纯函数式语言(如Haskell)中,所有函数都没有副作用,状态更改仅表示为转换状态的函数

在中,下面的命令式编程示例循环遍历数字1到10,并查找偶数

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's even"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);
var numbersonethrothen=新列表{1,2,3,4,5,6,7,8,9,10};
//通过命令式编程,我们将逐步完成这一过程,并决定我们想要什么:
var evenNumbers=新列表();
foreach(变量编号,单位为一到十)
{如果(数字%2==0)
{
添加(数字);
}
}
//下面的代码使用声明式编程来完成同样的事情。
//在这里,我们说的是“把一切都给我们”
var evenNumbers=numbersonethrotten.Select(number=>number%2==0);

两个例子产生相同的结果,一个既不比另一个好也不比另一个差。第一个示例需要更多的代码,但代码是可测试的,命令式方法使您能够完全控制实现细节。在第二个例子中,代码可以说更具可读性;但是,LINQ不能让您控制幕后发生的事情。您必须相信LINQ将提供所需的结果。

只是为了在移动应用程序开发方面添加另一个示例。在iOS和Android中,我们有界面构建器,可以在其中定义应用程序的UI

使用这些构建器绘制的UI本质上是声明性的,我们可以在其中拖放组件。实际绘图发生在框架和系统的下面并由框架和系统执行

但我们也可以在代码中绘制整个组件,这在本质上是必要的

此外,一些新的语言,如Angular JS,正专注于以声明方式设计UI,我们可能会看到许多其他语言提供相同的支持。就像Java没有任何好的声明方式在JavaSwing或JavaFX中绘制本机桌面应用程序一样,但在不久的将来,它们可能会这样做

命令式编程要求开发人员逐步定义如何进行 代码应该被执行。以命令式的方式给出指示, 你说,“去第一街,左转到Main,开两个街区, 右转到枫树街,在左边第三栋房子停下来 声明性版本可能听起来像这样:“开车去苏家 一个说如何做某事;另一个说需要什么 完成了

与命令式样式相比,声明式样式有两个优点:

  • 它不会强迫旅行者记住一长串的指示
  • 它允许旅行者尽可能优化路线
卡尔弗特,C库尔卡尼,D(2009年)。基本林克。艾迪生·韦斯利。48.

从以下地方偷窃:

  • 命令式编程告诉机器如何做某事(产生你想要的结果)
  • 声明式编程告诉机器你希望发生什么(并且计算机知道怎么做)
两个例子:

1。将数组中的所有数字加倍

迫切地:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )
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]
2。对列表中的所有项目求和

迫切地

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

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

请注意,命令式示例涉及如何创建新变量、对其进行变异并返回新值(即,如何使某些事情发生),而声明性示例则在给定输入上执行,并根据初始输入返回新值(即,我们希望发生的事).

我喜欢剑桥课程的解释+他们的例子:

  • 声明性的-指定要做什么,而不是如何做

    • 例如:HTML描述网页上应该显示什么,而不是如何在屏幕上绘制
  • 命令式-同时指定什么如何
    • intx-什么(声明性)
    • x=x+1-如何

据我的理解,这两个术语都源于哲学,有陈述式和命令式的知识。陈述性知识是对真理的断言,是对事实的陈述,就像数学公理一样。它告诉我们 你知道些什么。命令式知识,或程序性知识,告诉你如何一步一步地达成目标。这就是算法的本质定义。如果你愿意,把计算机编程语言和英语进行比较。陈述句陈述某事。这是一个枯燥的示例,但在Java中有一种声明性的方式显示两个数字是否相等:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}
private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}
另一方面,英语中的祈使句发出命令或提出某种要求。因此,命令式编程只是一个命令列表(做这个,做那个)。在Java中,在接受用户输入时,以下是显示两个数字是否相等的必要方法:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}
private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}
本质上,声明性知识跳过某些元素,在这些元素上形成一个抽象层。声明式编程也有同样的作用。


一种需要编程规范的编程语言,如C/C++、Java、COBOL、FORTRAN、Perl和JavaScript。使用这种语言编写的程序员必须根据数据处理和编程的知识制定适当的操作顺序,以解决问题


一种不需要编写传统编程逻辑的计算机语言; 用户专注于定义输入和输出,而不是过程中所需的程序步骤
var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's even"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);
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]
var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]
var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15
var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15
public static void main(String[] args)
{
    System.out.print("4 = 4.");
}
private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}
Declarative <<=====|==================>> Imperative