「D言語/関数」の版間の差分

削除された内容 追加された内容
編集の要約なし
Angol Mois (トーク | 投稿記録)
書き換え。予約語 body は廃止済み
138 行
=== 契約プログラミング ===
==== 基本 ====
関数を定義する際、入力値の要求事項と、出力値の要求事項とを記述する事ができる。また、自身が記述したアルゴリズムがバグがなく動作した場合に成り立つべき事項を確かめるういうとができる。この仕組みをプログラミング業界では「契約プログラミング」と言う。
 
D言語の契約プログラミングでは、要求事項を見たさない入力または出力がされた際、コンパイルを停止する。すでにコンパイルされている場合でも、実行だいるを停止する。
 
D言語の契約プログラミングでは、要求事項を見たさない入力または出力がされた際、コンパイルプログラムの実行を停止する。すでにまた、静的な契約も存在し、こちらはコンパイル時にチェックされ、満たされな場合でも、実行だいるを停止すはコンパイルがエラーとなる。
 
;コード例
下記に、自然数0以上の入力および出力対して階乗要求事項と計算するコード例プログラム与えます(理解重視のため、実用性は皆無)
 
<syntaxhighlight lang="D">
import std.stdio;
 
int factorial( int n )
float bbb(float num)
in {
assert(numn >= 0); // 階乗への入力は非負整数でなければならない
}
out (result) {
assert ( result >= 0n ); // n! ≧ n
assert ( n <= 3 || result > n^^2 ) // n ≧ 4 のとき、n! > (nの2乗)
}
body {
do {
return num + 3;
if (n == 0) return 1;
else return n * factorial(n-1);
}
 
void main(){
writeln( bbbfactorial(45) );
}
</syntaxhighlight>
 
;実行結果
7120
 
 
180 ⟶ 181行目:
assert(出力の要求事項);
}
bodydo {
return 出力内容 ;
}
188 ⟶ 189行目:
のように書く。
 
例として、もし writeln( bbbfactorial(4) ); の関数 bbb() ので、引数を4でなく、たとえば「-7」など負の数にすると、入力の要求事項を満たさなくなるので、コンパイル禁止実行時エラーになる。
 
 
2020年現在、C言語には、契約プログラミングの機能は無い。
 
契約プログラミングを公式にサポートしている言語はいまのところ少ない。(非標準のライブラリなどでサポートされている言語はそこそこあるが、しかしプログラム言語の標準ライブラリでサポートされている言語は、かなり少ない。)
もしかしたら 2023年、C++の次回の規格改訂に契約プログラミングが盛り込まれる予想もあるが、あくまで予想である。
 
契約プログラミングを公式に、サポートしている言語は、いまのところ少ない。(非標準のライブラリなどでサポートされている言語はそこそこあるが、しかしプログラム言語の標準ライブラリでサポートされている言語は、かなり少ない。)
 
「body」と書いた部分は、2020年時点での最新の仕様では「do」に置き換えられている。つまり
<pre>
body {
return 出力内容 ;
}
</pre>
となる。
 
今のところ body も引き続き、使える。
 
 
==== コンソール入力との組み合わせの例 ====
254 ⟶ 242行目:
このように、契約プログラミングは、けっしてコンパイルだけを契約違反で停止するのではなく、コンパイル以降も監視しており、実行中でも契約違反があればコードの実行を停止する。
 
=== 契約の使い方な関する注意 ===
 
'''契約をユーザーの入力のチェックに使ってはいけない。'''契約とは、あくまでも自身が書いたアルゴリズム、コードの正しさをチェックするためのみに存在するものである。関数の定義域を制限したい場合は、Assertion Error ではなく例外やエラーメッセージを残すべきである。
 
== 関数内の変数の記憶の性質 ==