我定义我的规范如下就足够了吗:
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中,s提供了行为规范,然后实现。但这不是术语规范的含义,就像您在问题中使用它的方式一样。interface
class
还是我必须编译接口并将其发布为jar?
同样,这是一个实现。
另外,规范可以包含抽象类或类吗?还是它必须只由接口组成?
规范不包含任何内容。这是一张纸。
通常,规范是用英文编写的。好吧,实际上,它们是用专门的规范书写语言编写的,这种语言通常是具有特定语义的高度程式化的英语形式子集。例如,BCP14/RFC2119:在 RFC 中使用的用于指示要求级别的关键字定义了与 IETF 标准文档相关的一些常见英语单词的确切含义。(有趣的是,它也是一个规范,因此使其成为编写规范的规范。
有时也使用形式逻辑,特别是在编程语言规范中描述类型规则。有时,甚至使用专用的形式规范语言,如Z表示法。
是什么造就了一个规范,一个规范?
简单而不太令人满意的答案是,如果规范被关心规范的人称为规范,那么它就是规范。(或者更一般地说:作为一个规范来考虑。
不同的社区对规范有不同的看法。以及它们的不同名称。
例如,方案编程语言的原始规范只是简单地发表在科学报告中。然后,经过几轮改进和新报告,他们发布了“算法语言方案修订报告”。之后,“关于算法语言方案的修订报告”。随之而来的开始了一种玩笑,而当前版本的语言是在“关于算法语言方案的修订报告”中定义的,通常写成“关于算法语言方案的修订7修订报告”或简称为“R7RS”。
这些报告都没有被称为“规范”,但每一个都是规范。在Scheme之前,ALGOL也使用“报告”一词,其他几种语言也是如此。
互联网RFC也是一个很好的例子。从技术上讲,RFC的全部内容都是“征求意见”。这些 RFC 中只有极少数实际上被提升到“标准”状态。有些也是“当前最佳实践”。它们都不被称为“规范”,但其中许多都是以这种方式处理的。例如,HTTP不是一个标准,但它既被视为标准又被视为规范,我们新世界经济的重要部分都建立在它之上。
如果你想了解一下规格,最好只是阅读一些: