什么是规格?

我读或听过如下句子:

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

要么

JavaServer Faces(JSF)是一个Java规范……

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

让我们说我创建了一个新的规范JMA,Java Math API,它是一个Java数学规范。

我将我的规范定义如下就足够了:

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

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

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

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

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

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

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

什么是规范,规范?

我将我的规范定义如下就足够了:

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提供了class然后实现的行为规范 。 但这不是术语规范的含义,就像你在问题中使用它一样。

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

再次,这是一个实现。

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

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

通常,规范是用英语编写的。 实际上,它们是用专门的规范编写语言编写的,这种语言通常是具有特定语义的高度风格化的英语正式子集。 例如, BCP14 / RFC2119:在RFC中用于表示需求级别的关键词定义了与IETF标准文档相关的一些常用英语单词的精确含义。 (有趣的是,它也是一个规范,因此使其成为编写规范的规范。)

有时也会使用forms逻辑,特别是在编程语言规范中用于描述类型规则。 有时,甚至使用专门的正式规范语言,如Z符号 。

什么是规范,规范?

简单且不太令人满意的答案是规范是规范,如果它被关注规范的人称为规范。 (或者更一般地说:作为规范考虑。)

不同的社区对规范有不同的看法。 并为他们命名。

例如, 方案编程语言的原始规范只是在科学报告中发表。 经过几轮改进和新报告后,他们发表了“关于算法语言方案的修订报告”。 之后是“修订后的算法语言计划修订报告”。 随之而来的是一种开玩笑,并且该语言的当前版本在“修订的修订的修订的修订的修订的关于算法语言方案的修订报告”中定义,通常写成“关于算法语言方案的修订的7报告”。或者只是“ R 7 RS ”。

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

互联网RFC也是一个很好的例子。 从技术上讲,所有RFC都是“征求意见”。 这些RFC中只有极少数实际上升级到“标准”状态。 有些也是“最佳实践”。 它们都不被称为“规范”,但其中许多都被这样对待。 例如,HTTP不是标准,但它被视为标准和规范,而我们新世界经济的重要部分就是基于此。

如果你想了解规格,最好是你只读一些:

  • Haskell 2010语言报告 (另一个名为“报告”的例子)
  • Scala语言规范版本2.11
  • ECMA-262第6版,ECMAScript 2015语言规范
  • Java语言规范,Java SE 8版
  • Java虚拟机规范,Java SE 8 Edition
  • HTTP规范 ,包括但不限于
    • RFC7230:HTTP / 1.1消息语法和路由
    • RFC7231:HTTP / 1.1语义和内容
    • RFC7540:HTTP / 2
    • RFC7541:HTTP / 2的HPACK标头压缩
  • HTML生活标准(又名HTML5)

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

当Sun是Java的管理者时,他们会编写Java EE和JPA等function的规范,让其他供应商可以按照自己的意愿自由实施。 Sun通常会有自己的竞争实现,但他们的目标是销售硬件。 鼓励其他供应商提供竞争性实施只会进一步推动这一目标。

Sun的规范既没有代码也没有JAR; 他们是关于代码如何工作的散文描述。

在Java-land中,这些规范是作为Java规范请求(JSR)启动的。

定义在这里:

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

一旦被接受,这些是规格。

如果进行Google搜索 ,则会获得:

spec·i·fi·ca·tionˌspesəfəkāSH(ə)n / noun noun:specification; 复数名词:规范

精确描述或识别某物或表明确切要求的行为。

例如 :“给出所宣传的职位的完整规范”

(……)

因此,它意味着您描述某些东西应该如何工作,而不是为了让它工作而必须做什么(这是实现

有一些forms语言可以指定方法的前后 条件 。 然后,可以使用工具(半)自动validation这些条件的子集。

其他正式语言使您能够进行自动约束编程 (例如我的规范,以解决多数学难题 )。

另一个例子是CSS:你指定你的网页应该是什么样子,关于如何使按钮变绿的说明不是CSS的一部分。