web-dev-qa-db-ja.com

仕様とは正確には何ですか?

私は次のような文章を読んだり聞いたりします。

Java Persistence API(JPA)は、Javaアプリケーションプログラミングインターフェイス仕様です...

または

JavaServer Faces(JSF)はJava仕様です...

しかし、仕様が正確に何であるかを理解しているかどうかはわかりません。

Java Math API、Java Math Specification ..

仕様を次のように定義すれば十分ですか。

JMAは2つの整数を加算するメソッドを提供する必要がありますか?

または、次のようなドキュメントを作成する必要がありますか?

JMAはメソッドを提供する必要があります:int jmaAdd(int x、int y)?

または、インターフェイスを作成してソースコードを配布する必要がありますか?

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

または、インターフェイスをコンパイルしてjarとして公開する必要がありますか?

また、仕様に抽象クラスやクラスを含めることはできますか?それともインターフェイスのみで構成する必要がありますか?

仕様、仕様は何ですか?

22
Koray Tugay

仕様を次のように定義すれば十分ですか。

JMAは2つの整数を加算するメソッドを提供する必要がありますか?

それは仕様です。

これは、その仕様の実装についてユーザーに多くの保証を与えるものではないため、あまり有用ではありません。 2つの整数を加算するプログラムを記述したい場合、仕様を読むだけではできません。

doesimplementorにも多くの自由があります。通常、仕様はユーザーにとって重要な点ではpreciseになりますが、-にとって重要な点ではvagueになります。 implementor。このようにして、ユーザーはプログラムを作成するために必要な保証を取得できますが、特定のニッチに合わせて実装を調整する自由も与えられます。

たとえば、Java言語仕様では、ガベージコレクションについて何も言われていません。オブジェクトが到達可能である場合と到達できない場合のみを定義し、新しいオブジェクトを作成できることを定義しています。割り当てが機能するか、ガベージコレクターがどのように機能するか、参照カウント、トレース、または領域ベースのコレクターかどうかなど、これらはすべて省略されるため、ニッチごとに実装が異なると、ガベージコレクターの実装も異なります。同じニッチの実装は互いに競合する可能性があります。

または、次のようなドキュメントを作成する必要がありますか?

JMAはメソッドを提供する必要があります:int jmaAdd(int x、int y)?

それも仕様です。上記のものよりも有用性はさらに低くなります。 doesメソッドの名前を定義しますが、それが何をするかは定義しません。

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では、interfacesは仕様を提供し、classesが実装となる動作を提供します。しかし、それはnotという用語の意味specification質問での使用方法です。

または、インターフェイスをコンパイルしてjarとして公開する必要がありますか?

繰り返しますが、これは実装です。

また、仕様に抽象クラスやクラスを含めることはできますか?それともインターフェイスのみで構成する必要がありますか?

仕様には何も含まれていません。一枚の紙です。

通常、仕様は英語で書かれています。まあ、実際には、それらは特別な仕様記述言語で書かれています。これは、多くの場合、特定のセマンティクスを持つ英語の高度に様式化された正式なサブセットです。たとえば、 BCP14/RFC2119:要件レベルを示すためにRFCで使用するキーワード は、IETF標準ドキュメントに関連するいくつかの一般的な英語の単語の正確な意味を定義します。 (興味深いことに、これも仕様なので、仕様を記述するための仕様になっています。)

フォーマルロジックは、特にプログラミング言語の仕様で、入力規則を記述するために使用されることもあります。そして、時には Z Notation のような特殊な形式仕様言語も使用されます。

仕様、仕様は何ですか?

単純であまり満足のいく答えではないというのは、仕様を気にかける人たちが仕様と呼ぶのであれば、仕様は仕様であるということです。 (または、より一般的には、仕様としてthought aboutです。)

コミュニティによって仕様の見方は異なります。そして、それらの異なる名前。

たとえば、プログラミング言語 scheme の元の仕様は、科学レポートで簡単に公開されました。その後、数回の改善と新しいレポートの後に、「アルゴリズム言語スキームに関する改訂レポート」を公開しました。そしてその後、「アルゴリズム言語スキームに関する改訂された改訂レポート」。それが一種の冗談で始まり、言語の現在のバージョンは、「改訂された改訂版改訂版改訂版改訂版改訂版アルゴリズム言語スキームに関するレポート」で定義されています。7 アルゴリズム言語スキームに関するレポート」または単に「 R7RS "。

これらのレポートはいずれも「仕様」と呼ばれていませんが、すべてのレポートは仕様です。 Schemeの前は、ALGOLは他のいくつかの言語と同様に「レポート」という用語も使用していました。

インターネットRFCも良い例です。技術的には、RFCはすべて「Request for Comments」です。これらのRFCのうち、実際に「標準」ステータスに昇格したものはごくわずかです。一部は「ベストプラクティス」でもあります。それらのどれも「仕様」と呼ばれていませんが、それらの多くはそのように扱われています。たとえば、HTTPは標準ではありませんが、標準と仕様の両方として扱われ、私たちの新しい世界経済のかなりの部分がそれに基づいて構築されています。

仕様の感触を知りたい場合は、いくつか読んだ方がいいでしょう。

17
Jörg W Mittag

ここでの重要な考えは、「仕様には実装が含まれていない」ということです。

SunがJavaの管理者であったとき、彼らはJava EEとJPAのような機能の仕様を作成し、他のベンダーが望むように実装する自由を与えました。Sunは通常、競合するが、彼らの目標はハードウェアを販売することでした。競合する実装を提供するように他のベンダーに働きかけることは、その目的を促進するだけでした。

Sunの仕様には、コードもJARも含まれていません。それらは、コードがどのように機能するかを散文で説明したものです。

14
duffymo

Javaランドでは、これらの仕様はJava仕様要求(JSR))として開始されます。

ここで定義:

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

いったん受け入れられると、これらは仕様になります。

5

Google search を実行すると、次のようになります。

spec・i・fi・ca・tion ˌspesəfəˈkāSH(ə)n /名詞名詞:仕様;複数名詞:仕様

何かを正確に説明または特定する行為、または正確な要件を述べる行為。

example: "宣伝されるジョブの完全な仕様を与える"

(...)

したがって、これは、説明が機能するために必要なことではなく、実装

たとえば、メソッドのpre-およびpostconditionsを指定する正式な言語があります。次に、ツールを使用して、これらの条件のサブセットを(半)自動的に検証できます。

他の正式な言語を使用すると、自動化された制約プログラミングを実行できます(たとえば、 マルチ数独パズル を解決するための私の仕様のように)。

別の例はCSSです。あなたはWebページの外観を指定します。ボタンを緑にする方法の説明はCSSの一部ではありません。

3