我读或听过如下句子:
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?
此外,规范是否可以包含抽象类或类?或者它必须只包含接口?
什么是规范,规范?
答案 0 :(得分:15)
我的规范定义如下:
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: Key words for use in RFCs to Indicate Requirement Levels定义了与IETF标准文档相关的一些常用英语单词的精确含义。 (有趣的是,它也是一个规范,因此它成为编写规范的规范。)
有时也会使用形式逻辑,特别是在编程语言规范中用于描述输入规则。有时甚至使用专门的正式规范语言,如Z Notation。
什么是规范,规范?
简单且不太令人满意的答案是规范是一种规范,如果它被关注规范的人称为规范。 (或者更一般地说:将视为规范。)
不同的社区对规范有不同的看法。并为他们命名。
例如,scheme编程语言的原始规范只是在科学报告中发布。经过几轮改进和新报告后,他们发布了关于算法语言方案的修订报告"。之后是关于算法语言方案的修订报告"随之而来的是一种开玩笑,该语言的当前版本在"经过修订的修订后的修订版修订后的修订报告中定义了算法语言方案",通常写成"修订版 7 关于算法语言方案的报告"或者只是" R7RS"。
这些报告都没有被称为"规范",但每一个都是规范。在Scheme之前,ALGOL也使用术语" Report"和其他几种语言一样。
互联网RFC也是一个很好的例子。从技术上讲,所有RFC都是"请求注释"。只有极少数的RFC实际上被提升到了标准"状态。有些也是最佳实践"。它们都没有被称为"规范",但其中许多都被这样对待。例如,HTTP不是标准,但它被视为标准和规范,而我们新世界经济的重要部分都建立在此基础之上。
如果您想了解规格,如果您只是阅读一些内容,那可能是最好的:
答案 1 :(得分:14)
我认为这里的关键思想是"规范并未包含实施。"
当Sun是Java的管理员时,他们会编写Java EE和JPA等功能的规范,让其他供应商可以按照自己的意愿自由实施。 Sun通常会有自己的竞争实施,但他们的目标是销售硬件。鼓励其他供应商提供竞争性实施只会进一步推动这一目标。
太阳的规范既没有代码也没有JAR;他们是关于代码如何运作的散文描述。答案 2 :(得分:4)
答案 3 :(得分:3)
如果有人Google search,则得到:
spec·i·fi·ca·tionˌspesəfəkāSH(ə)n / noun noun:specification;复数 名词:规范
精确描述或识别某物或表明确切要求的行为。
示例:“提供广告宣传的完整规范”
(...)
这意味着你描述某些东西应该如何工作,而不是为了让它工作而必须做什么(这是实现)
要为方法的 pre - 和 postconditions 指定正式语言。然后可以使用工具(半)自动验证这些条件的子集。
其他正式语言使您能够执行自动约束编程(例如我的规范来解决multi-sudoku puzzle)。
另一个例子是CSS:你指定你的网页应该是什么样子,关于如何使按钮变绿的说明不是CSS的一部分。