「D言語/関数」の版間の差分
削除された内容 追加された内容
編集の要約なし |
Angol Mois (トーク | 投稿記録) 書き換え。予約語 body は廃止済み |
||
138 行
=== 契約プログラミング ===
==== 基本 ====
関数を定義する際、入力値の要求事項と、出力値の要求事項とを記述する事ができる。また、自身が記述したアルゴリズムがバグがなく動作した場合に成り立つべき事項を確かめるこ
D言語の契約プログラミングでは、要求事項を見たさない入力または出力がされた際、コンパイルを停止する。すでにコンパイルされている場合でも、実行だいるを停止する。▼
▲D言語の契約プログラミングでは、要求事項を見たさない入力または出力がされた際、
;コード例
下記に、
<syntaxhighlight lang="D">
import std.stdio;
int factorial( int n )
in {
assert(
}
out (result) {
assert ( result >=
assert ( n <= 3 || result > n^^2 ) // n ≧ 4 のとき、n! > (nの2乗)
}
do {
if (n == 0) return 1;
else return n * factorial(n-1);
}
void main(){
writeln(
}
</syntaxhighlight>
;実行結果
180 ⟶ 181行目:
assert(出力の要求事項);
}
return 出力内容 ;
}
188 ⟶ 189行目:
のように書く。
例として、もし writeln(
2020年現在、C言語には、契約プログラミングの機能は無い。
契約プログラミングを公式に
▲契約プログラミングを公式に、サポートしている言語は、いまのところ少ない。(非標準のライブラリなどでサポートされている言語はそこそこあるが、しかしプログラム言語の標準ライブラリでサポートされている言語は、かなり少ない。)
==== コンソール入力との組み合わせの例 ====
254 ⟶ 242行目:
このように、契約プログラミングは、けっしてコンパイルだけを契約違反で停止するのではなく、コンパイル以降も監視しており、実行中でも契約違反があればコードの実行を停止する。
=== 契約の使い方な関する注意 ===
'''契約をユーザーの入力のチェックに使ってはいけない。'''契約とは、あくまでも自身が書いたアルゴリズム、コードの正しさをチェックするためのみに存在するものである。関数の定義域を制限したい場合は、Assertion Error ではなく例外やエラーメッセージを残すべきである。
== 関数内の変数の記憶の性質 ==
|