Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的声明式编程_Java_Declarative - Fatal编程技术网

java中的声明式编程

java中的声明式编程,java,declarative,Java,Declarative,我有一个关于声明式编程的问题,看看我对这个概念理解得有多好。我有一个任务,要求我用Java以“声明式”的方式制作一个数独谜题求解器。查找这意味着什么,我发现了很多含糊不清的定义,说明程序应该以这样一种方式编写,即描述必须做什么,而不是指定如何做。环顾四周,我发现了一个有趣的例子,有人用一个列表来解释它,特别是过滤列表中的奇数 命令式样式(称为函数): 声明式样式(调用上下文): 因此,在声明式样式中,指定了要保留的元素,但没有指定列表的生成方式。这被抽象到列表的API中 我的简单问题是:这种方法

我有一个关于声明式编程的问题,看看我对这个概念理解得有多好。我有一个任务,要求我用Java以“声明式”的方式制作一个数独谜题求解器。查找这意味着什么,我发现了很多含糊不清的定义,说明程序应该以这样一种方式编写,即描述必须做什么,而不是指定如何做。环顾四周,我发现了一个有趣的例子,有人用一个列表来解释它,特别是过滤列表中的奇数

命令式样式(称为函数):

声明式样式(调用上下文):

因此,在声明式样式中,指定了要保留的元素,但没有指定列表的生成方式。这被抽象到列表的API中

我的简单问题是:这种方法是否意味着列表库不是声明性的,因为算法被移动到了那里?在这种情况下,术语“声明性”适用于程序调用此库的部分。因此,程序是否不可能是100%声明性的,因为(当然)某个地方需要一个算法来指定如何完成事情?如果我在这里错了,请纠正我,因为这是我理解陈述性概念的核心

在任何情况下,我都在考虑将数独解算器作为我自己的库(包含所有“命令式”逻辑,包装为“声明式”函数编程风格)和解决数独问题应采取的步骤规范(作为对这些库的调用)的组合来编写。我还认为我可以使用命令模式作为包装器,在Java中将函数作为参数传递,从而进一步使解算器类更具“声明性”。我已经对此进行了试验,并尝试了一些类似于
newList=startList.filter(new OddNumberCommand())
的方法,使用了
OddNumberCommand
一个具有
执行
功能的命令,从列表中获取一个元素作为参数,如果要从结果列表中保留或丢弃该元素,则返回true或false

无论如何,这就是我的思维方式,我想求助于其他更好地理解这一概念的人,以确保我走的是正确的还是错误的道路。请让我知道我在推理中哪里错了,什么是对的,这样我就可以学会正确地使用声明式编程


感谢声明式编程的定义:

声明性语言的特点:

  • 基于系统的计算模型,其中关系是 直接根据输入数据的组成部分指定
  • 由一组描述关系的定义或方程式组成 指定要计算的内容,而不是如何计算
  • 变量的非破坏性赋值
  • 使用的数据结构的显式表示
  • 执行顺序无关紧要(否 副作用)
  • 表达式/定义可以用作值
  • 程序员不再负责控制
  • 声明式程序定义逻辑(期望的目标或结果),而不是控制(我们如何实现期望的目标)。我们说声明性语言是目标导向的或目标驱动的


    我认为在数独游戏中,关键是使用接口作为类之间的契约。通过这种方式,您可以在不破坏模型的情况下更改实现。

    正如一位评论员所说,您的示例更多地是函数式编程而不是声明式编程,尽管两者在某些方面相似。在真正的声明式编程中,您将更加注重结果——您将指定如何处理列表中感兴趣的元素,而不是为了列表本身而转换列表。类似规则引擎的示例是声明式编程系统(免责声明,我是Jess的作者)


    回答你一个简单的问题:是的。所有功能性或声明性编程系统都涉及一个运行时系统,该系统必须在运行程序的真实计算机上实现。因为真正的计算机总是一台命令式冯·诺依曼机器,所以运行时系统必须按命令编写。因此,它是您的程序和硬件之间的额外抽象层。

    您所描述的“声明性”更好地描述为函数式编程风格。声明式可以表示很多其他的东西。您编写的任何代码,其含义不是“做这个,然后做那个”,而是“这两个表达式是等价的”或“这些是必须满足的约束”,这是声明性的。鉴于您提供的信息,您的教授的确切想法并不完全清楚。感谢您澄清声明性程序的核心始终有一个命令性元素。在我的例子中,我的老师禁止使用外部库,所以我想我应该编写自己的引擎,包含命令式逐步逻辑,并使用它在声明式数独解算器中提供的功能。
    List resultList = new List()
    foreach element in startlist
        do if element % 2 == 1
            do add element to resultList
            od
        od
    return returnList
    
    newList = startList.filter(num -> num%2 ==1)