代码之家  ›  专栏  ›  技术社区  ›  Koray Tugay

什么是规范?

  •  30
  • Koray Tugay  · 技术社区  · 9 年前

    我阅读或听到以下句子:

    Java Persistence API(JPA)是一种Java应用程序编程 接口规范。。。

    JavaServerFaces(JSF)是一个Java规范。。。

    但我不确定我是否理解什么是规范。。

    假设我创建了一个新的规范JMA,Java Math API,这是一个Java Math规范。。

    我将我的规范定义为:

    JMA必须提供一个添加两个整数的方法?

    或者,我是否必须创建一个类似于以下内容的文档:

    JMA必须提供方法:int jmaAdd(int x,int y)?

    或者,我必须创建接口并分发源代码吗?

    public interface JMA{
        int jmaAdd(int x,int y);
    }
    

    还是我必须编译接口并将其发布为jar?

    此外,规范是否可以包含抽象类或类?或者它必须只由接口组成?

    什么是规格,规格?

    4 回复  |  直到 9 年前
        1
  •  22
  •   Jörg W Mittag    9 年前

    我将我的规范定义为:

    JMA必须提供一个添加两个整数的方法?

    这是一个规范。

    这不是一个非常有用的规范,因为它不能为用户提供实现该规范的许多保证。如果我想编写一个添加两个整数的程序,我不能仅仅通过阅读规范来实现。

    给出 实施者 但有很多自由。通常,您希望您的规范 准确的 对于 使用者 但是 模糊的 对于 实施者 通过这种方式,用户可以获得编写程序所需的保证,但这也给了实现者根据其特定的利基定制其实现的自由。

    例如,Java语言规范没有提到垃圾收集。它只定义对象何时可访问和不可访问,并定义您可以创建新对象。内存分配如何工作,垃圾收集器如何工作,它是引用计数、跟踪还是基于区域的收集器等等,所有这些都被忽略了,因此不同利基的不同实现可以使用不同的垃圾收集器实现,而同一利基的实现可以相互竞争。

    或者,我是否必须创建一个类似于以下内容的文档:

    JMA必须提供方法:int jmaAdd(int x,int y)?

    这也是一个规范。它甚至不如上面的那个有用。它 定义方法的名称,但它没有定义它的功能。

    int jmaAdd(int x, int y) { return x - y; }
    

    是该规范的完全有效的实现

    int jmaAdd(int x, int y) { return 0; }
    

    同样,用户没有保证,实现者有太多的余地(或者更准确地说:在错误的领域有余地)。

    或者,我必须创建接口并分发源代码吗?

    public interface JMA{
        int jmaAdd(int x,int y);
    }
    

    我不一定称之为规范。这是代码,因此也是实现。

    注意:当然,在Java中, interface s提供 规格 行为 class 那么是 使生效 。但那是 这个词是什么意思 规格 你在问题中使用它的方式。

    还是我必须编译接口并将其发布为jar?

    同样,这是一个实现。

    此外,规范是否可以包含抽象类或类?或者它必须只由接口组成?

    规范不包含任何内容。这是一张纸。

    通常,规范是用英语编写的。事实上,它们是用一种专门的规范编写语言编写的,这种语言通常是英语的一种高度风格化的形式子集,具有特定的语义。例如 BCP14/RFC2119: Key words for use in RFCs to Indicate Requirement Levels 定义了与IETF标准文件相关的一些常用英语单词的确切含义。(有趣的是,它也是一个规范,因此成为编写规范的规范。)

    形式逻辑有时也被使用,特别是在编程语言规范中,用来描述类型规则。有时,甚至使用专门的形式规范语言,如 Z Notation .

    什么是规格,规格?

    一个简单但不太令人满意的答案是,如果一个规范被关心规范的人称为规范,那么它就是规范。(或更一般地说: 思考 作为规范。)

    不同的社区对规范有不同的看法。他们有不同的名字。

    例如 编程语言只是发表在一份科学报告中。经过几轮改进和新的报告后,他们发表了“算法语言方案修订报告”。之后是“算法语言方案修订报告”。由此开始了一种玩笑,目前的语言版本在“算法语言方案的修订、修订、修订和修订报告”中定义,通常写为“修订 7. 关于算法语言方案的报告“或只是” R 7 RS ".

    这些报告都不被称为“规范”,但每一份都是规范。在Scheme之前,ALGOL也使用了“报告”一词,其他几种语言也是如此。

    互联网RFC也是一个很好的例子。从技术上讲,RFC就是“征求意见”。这些RFC中只有极少数真正提升为“标准”状态。其中一些也是“当前最佳实践”。其中没有一个被称为“规范”,但很多都是这样对待的。例如,HTTP不是一个标准,但它被视为一个标准和一个规范,我们新世界经济的很大一部分都建立在这一基础上。

    如果你想了解一下规范,最好是读一些:

        2
  •  16
  •   duffymo    9 年前

    我认为这里的关键思想是“规范不包括实现”

    当Sun担任Java管家时,他们会为Java EE和JPA等特性编写规范,让其他供应商可以自由实现。Sun通常会有自己的实现与之竞争,但他们的目标是销售硬件。鼓励其他供应商提供竞争性的实现只会进一步促进这一目标。

    Sun的规范既没有代码也没有JAR;它们是对代码如何工作的散文式描述。

        3
  •  5
  •   John Scattergood    9 年前

    在Java领域,这些规范以Java规范请求(JSR)的形式开始。

    此处定义:

    https://jcp.org/en/jsr/overview

    一旦接受,这些就是规范。

        4
  •  4
  •   Community Ian Goodfellow    7 年前

    如果一个人做了 Google search ,一个人会得到:

    spec·i·fi·ca·tion spesfkSH()n/名词名词:规范;复数的 名词:规格

    准确地描述或识别某事物或陈述准确要求的行为。

    实例 :“详细说明招聘职位”

    (...)

    因此,它意味着你 描述 事情应该如何运作,而不是为了让它运作而必须做什么(这是 实施 )

    例如,有正式语言可以指定 之前 -和 后置条件 方法。然后可以使用工具(半)自动验证这些条件的子集。

    其他形式语言使您能够实现自动化 约束程序设计 (例如,我的规范解决了 multi-sudoku puzzle ).

    另一个例子是CSS:you 具体说明 关于如何使按钮变为绿色的说明不是CSS的一部分。