防衛コードとアサーション

JavaScript用のアサーションを作ってみる - 檜山正幸のキマイラ飼育記 (はてなBlog)

ふむふむ。
防衛コード…あるある。
アサーション…こんな手があったか。

あぁ、やっぱり檜山さんのエントリはタメになりすぎです><
こういう、言語仕様とかとは別の、「プログラミングのキモ」みたいな所にメスを入れて書かれているものは、貴重な勉強材料です。

話題元についているコメントも大変勉強になります。
「過剰な防衛コード」が現れる時、内部(チームやプログラマー個人)での仕様やコーディングルールの策定、テスト等が疎かになっているケースが多い。
そこを踏まえて「防衛コードを書くな」なワケです。

ただ、しばらく考えているとナンダカ分からなくなって来ました。
話題元の例を見ると、「過剰な防衛コード」と呼ばれているものや、アサーションとして外部に追い出しているコードのほとんどが「型チェック」に費やされているような気がします。
これって、関数の入口や出口で型指定が出来ない言語特有の現象?
他の言語で「過剰な防衛コード」となり得るものってどんなものなのだろう?
こればっかりは、自分がその言語での開発に関わって、「ハッ、これは…!」と気づかないと本当の意味で理解は出来なさそうですね><

若干論点がズレますが…。

  • 確かに、JavaScriptのfunctionの引数、戻り値の型が問題になることは多い
  • サーバサイドの言語を咬ますのなら

ということで、こんな切り口を考えてみました。
実装は全然出来てません><

コメントで型指定
// foo.js
function sum(x/*:Number*/, y/*:Number*/)/*:Number*/ {
	return x + y;
}

記法はASのパクリです。

チェックしたいjsをCGIにパラメータとして渡す
<script src="assertJS.cgi?target=foo.js" type="text/javascript"></script>
こんな感じのレスポンスが帰ってくる
function sum(x, y) {
	// 実引数の型チェックのコード
	
	// 処理処理…

	// ついでに戻り値の型チェックのコード
	return x + y;
}
デメリット
  • 冗長。
  • JavaScriptらしくない…。
  • 頑張ってもコアクラスまでかなぁ。

・゚・(ノД`;)・゚・