入力ミスとあり得ない入力

  • 投稿日:
  • by
  • カテゴリ:
こちらのブログ記事から。

「入力ミスと入力バリデーションエラーの区別ができない」ということらしいので、
「入力ミス」かどうかのチェックと「入力バリデーションエラー」かどうかのチェックを分けて書いてみた。

<?php
  function validate()
  {
    // 「妥当な入力」かどうかチェック
    if (! isset($_GET['email'])) {
      // emailが未設定の場合はエラー
      throw new Exception('バリデーションエラー:emailの値が未設定です。');
    }
    else if (! mb_check_encoding($_GET['email'], 'UTF-8')) {
      // 文字エンコーディングのチェック
      throw new Exception('バリデーションエラー:emailの文字エンコーディングが不正です。');
    }
    else if (! preg_match('/\A[[:^cntrl:]]{0,50}\z/u', $_GET['email'])) {
      // 制御文字以外50文字以下というチェック
      throw new Exception('バリデーションエラー:emailの値が不正です。');
    }
    else {
      // 「妥当な入力」かどうかチェックを通過。
      return;
    }
  }

  function check_input()
  {
    // 正しい入力かどうかチェック
    try {
      if (filter_var($_GET['email'], FILTER_VALIDATE_EMAIL)) {
        // メールアドレスとしての妥当性
        return; // 正しい入力かどうかチェックを通過。
      }
      else {
        throw new Exception('入力エラー:emailの値がメールアドレスとして妥当ではありません。');
      }
    }
    catch (Exception $e) {
      // 入力エラー処理
      throw $e; // (省略。画面の再表示、エラーメッセージ表示、など。)
    }
  }

  header('Content-Type: text/html; charset=UTF-8');
?><body>
<?php
  try {
    validate();
    check_input();
    echo htmlspecialchars('正しい入力です。処理を続行します。', ENT_NOQUOTES, 'UTF-8');
  }
  catch (Exception $e) {
    echo htmlspecialchars($e->getMessage(), ENT_NOQUOTES, 'UTF-8');
    echo htmlspecialchars('強制終了しました。', ENT_NOQUOTES, 'UTF-8');
  }
?></body>

感想は、「むずかしい」。
「入力ミスと入力バリデーションエラーの区別ができない」=「プログラマが入力仕様を
理解していない」ということらしいので、プログラマが理解できるということは仕様を
決定する段階で区別されているということだろう。
つまり、設計者が区別できていないといけないわけだが、区別できているのか?(笑)

プログラマの、定石とか王道とか常識とか当たり前のようになっていることであればよいが、
そうではないんじゃないかなぁ、と。それを要求するのは何か酷な感じがする。

ちなみに、当該記事の「サンプルプログラムの仕様」には email が必須入力なのかどうかの
記述がないので、必須入力でないならコードはまた違ったものになっただろう。