プログラムの入力とサブルーチンの引数のダブルチェックをする理由
さてこうして見ると、プログラムの入力チェックとサブルーチンの引数チェックを両方やるもう一つの意味合いにお気づきになるかもしれません。この2つは実はちょっと役割が違うのです。プログラムの入力チェックは、プログラムを使う人に対して、入力エラーがあった事や、ではどうすればいいかなどを伝える役割があります。一方、サブルーチンの方は、そもそも使い回しをする目的でサブルーチンを書きますので、なるべく色々なシチュエーションで使用するためには利用者向けのエラーメッセージの出力までは行いません。
また、先ほどの引数チェック追加の例では初期値を設定してしまって、変な値を強制的に排除しています。このような初期値設定はサブルーチンを書くときにはよく行う事なのですが、利用者からすればどの値が使われたか分からず、混乱の元にもなる点です。
このためプログラムの入力チェックを省いてしまうと、プログラムを使う人には何で「-30」と入力しているのに「25」分の長さで出力されるのかが分からずじまいになってしまいます。ですので、入力をチェックしてエラーがあるのなら、問題となったエラーの内容を分かりやすく出力する必要があります。このため、サブルーチンの引数チェックに加えて入力チェックも行う必要があるのです。
【まとめ】2つのチェックの役割の違い
- サブルーチンの引数チェック → 実行エラーを回避
- プログラムの入力チェック → エラーをユーザに知らせる
安全なプログラムを書くためのポイントまとめ
さてでは最後に、最初に挙げた安全なPerlプログラムを書くための3つのポイントを別の角度からも整理しておきましょう。- 【原則】「入出力」は必ずチェックする
- 【付則】「入出力」とは以下の3か所
- 外部ファイルの入出力
- プログラムへの外部からの入力
- サブルーチンへの入力
- 【手段】開発時にはテイントモード(-T)でチェックする