それともそれ以外の何かですか?
おっさんホイホイとしての Code Complete と,近くにあっても気付かない guard 句の話 - NyaRuRuの日記
に反応してみる。
まぁ、自分は Code Complete はかなり昔に読んだ事はあるのですが、殆ど記憶は無いので Code Complete については触れませんけど(おっさんホイホイなんかにはかからんぞ)、「ガード句」というものについては色々思いがあるので言ってみる。
7章 : Eiffel の利用: 例題とチュートリアル : 一歩進んだ入門
7.2 契約プログラミング
Eiffel は、契約プログラミングと呼ばれるプログラミングのタイプを体現します。契約プログラミングは、クライアントとサプライヤに、それらが一致しなければならないある特定の要件を完全に認識し理解することを許す前提を提供し、それらが資格を与えられるということを保証します。これらの条件は、表明を通して、あるいは、もしクラスが他のクラスと相互作用したいのならばそのクラスが一致しなければならない条件を通して強制されます。振る舞いに関するこれらの規則は、事前条件、事後条件、そして不変条件で明白にします。
ガード句は事前条件の記法に過ぎません、事前条件は表明であり、「宣言されるべき事」です。
それがコンパイラに認識されなくても、プログラマ間でお互いに認識可能な手段をもって宣言されるのは良いことです。
たとえば、メソッドの冒頭で事前条件に基づいて何かを投げる。
public void Hoge(string input)
{
if( input=="hage" ) throw new HageException();
…
}
if … throw はC#言語の文法上は実行文ですが、この構文を事前条件としての宣言として解釈可能な自分の脳みそでは宣言文です。
同様にループの冒頭での if ... continue はフィルタリング条件宣言です。自分の脳みそはそれを動作としてなんて解釈していません。
ガード句をガード句として書かない人のコードは、何でもかんでも実行文に見えて「とにかく色々ゴチャゴチャやっているコード」になるわけです。「こいつ、事前条件も整理しないでコード書いてやがるな」という事で、「書いた奴はきっと頭が悪いに違いない」になるわけです。
public void Hoge()
{
事前条件宣言
try {
処理内容を示す実行コード
}
finally {
保障される後処理宣言
}
}
それが実際のコンパイラにとって宣言文なのか、実行文なのか。脳みそにとって宣言文なのか、実行文なのか、それは解釈する側の能力次第だったりします。
脳みその解釈能力の低い人には、ガード句は実行コードに見え、制御構造を乱す存在に見える。脳みその解釈能力の高い人にはガード句は宣言に見え、処理部に対しての事前条件を教えてくれ処理部を理解するのを助けてくれる存在となる。
そして水が低きに流れるように、大標準化というなの底辺揃えによって、脳みそ解釈能力の低い人が…
あーと、return が一つとか言うひとがまだ居るみたいなのでリンクおいときますね。
構造化プログラミングについてのテスト