php コーディング くじ引きをつくる 仕様変更

ichikawaです。今回はコーディングについて書きます。

今日は前回のコーディング授業のつづきですが、
それに新たに仕様が変わった場合です。

前回の授業のブログ↓
コーディング くじ引きをつくる

これに加え、以下の仕様になりました。この設計をしていきます。

  • 当選番号は任意の値で、それぞれで何等かが決まっている。
  • validate関数にて、5桁の半角数字、全角以外はエラー文を出す。OKならNULLを返す
  • draw関数では、既出の当選番号ははじき、エラー番号-72を返す。当選したらそれが何等かを返す。はずれの場合はエラー-1919を返す。
  • getMessage関数にて、等に合わせたメッセージの表示と、エラー番号に合わせた表示をする

以上

結果は、以下のコードになりました。
kuji.php(メインのファイル)


<html>
<head>
<title>くじびき</title>
</head>

<body>
<form action='kuji.php' method='post'>
くじの番号を入力してください。
<input type='text' name='number'><br />
<input type='submit' value='( ´_ゝ`){判定'>
</form>


<?php

   /******* 関数の入ったファイルを呼び出します *******/

//  入力内容が有効な値かチェックする関数
require_once'validate.php';
// 当選ランクもしくはエラー番号を決定する関数
require_once'draw.php';
// 当選ランクもしくはエラー番号に当てられたメッセージを表示する関数
require_once'getMessage.php';

if (isset($_POST['number'])){

  /******* クリックされた後の処理 *******/

  $numbers = $_POST['number'];

  // 入力内容が半角5桁かどうかを判定。エラーの場合はエラー文を取得する。
  $errMsg = validate($numbers);

  // 入力内容が有効かどうか判別。nullのみTRUE(正式な入力)とする。
  if ($errMsg != null){
    echo $errMsg;
    exit;
  }

  // 当選のランクづけ、もしくはエラー番号の取得
  $prize = draw($numbers);

  // メッセージを取得して表示
  $message = getMessage($prize);
  echo $message;

}else{
  // クリック待ち
  echo"番号を入力してください。";
}

?>
</code>
<code lang='html'>
</body>
</html>

validate.php


<?php

// 当選判定の関数
function validate($input)
{
  // 入力文字列が数字であり、かつ半角ならTURE。
  if (! ctype_digit($input)) {
    // FALSEならエラーメッセージを返す
    return "半角数字を入力してください。";
  }

  // 半角5文字ならTRUE。
  if (strlen($input) != 5) {
    // FALSEならエラーメッセージを返す
    return "半角数字を5桁で入力してください。";
  }

  // 問題なく半角数値5文字ならnullを返す
  return null;
}

?>

draw.php

<?php
session_start();

function draw($number)
{
  // 当選番号を入れていく配列の初期化。
  if (! is_array($_SESSION['win'])){
    $_SESSION['win'] = array();
  }

  // 当選番号が既に出ているかチェックする
  if (in_array($number,$_SESSION['win'])){
    // あればエラー番号を返す
    return -72;
  }

  // 当選した場合、番号に合わせランクをつける
  $rank = 0;

  if (
      ($number == '11111')||
      ($number == '22222')||
      ($number == '33333')||
      ($number == '44444')||
      ($number == '55555')
      ){
    $rank = 5;
  }

  if (
      ($number == '11122')||
      ($number == '22233')||
      ($number == '33344')||
      ($number == '44455')
      ){
    $rank = 4;
  }

  if (
      ($number == '00111')||
      ($number == '11222')||
      ($number == '22333')
      ){
    $rank = 3;
  }

  if (
      ($number == '01111')||
      ($number == '12222')
      ){
    $rank = 2;
  }

  if ($number == '00000'){
    $rank = 1;
  }

  // 当選の場合、既出番号の配列に入れ、ランクを返す
  if ($rank > 0 ) {
    array_push($_SESSION['win'], $number);
    return $rank;
  }

  // はずれの場合、エラー番号を返す
  return -1919;
}

?>

getMessage.php


<?php

// メッセージの関数 
function getMessage($prize) {
  switch($prize) {
    case -1919: $msg = "はずれです。ごめんなさい。エラー番号:-1919"; break;
    case -72  : $msg = "もうこの番号はだめなんです。エラー番号:-72"; break;
    case 1    : $msg = "一等! 今日からあなたの息はジャスミンの香りになります";break;
    case 2    : $msg = "二等! すてきなネズミのぬいぐるみプレゼント";break;
    case 3    : $msg = "三等! 今日から好きな夢を見られます";break;
    case 4    : $msg = "四等! 急行カード!";break;
    case 5    : $msg = "五等! おしい!REPLAY";break;
  }

  return $msg;
}

 ?>

このようになりました。出力メッセージは適当です。

今回は変数名やコメント、コードの書き方など、指摘が山ほどありました。
インデントについてもかなりの箇所で問題がありました。いきなり課題のレベルが上がった気がしますが、これをすることで自分のレベルも昨日と今日では全く変わった気がしました。

ただ動けばいい、のではなく、機能的で、かつ見やすいコードをつくるのはこんなに難しいものかと、思い知らされました。それと、注文の仕様通りに作ることも難しかったです。

次の課題には、もっと早く書けるようになっているといいです。

—-
(2008/06/10 18:52 hirafuji追記)
動画をご覧下さい!

part.1

part.2

1 件のコメント so far »

  1. by hasumi, on 06.04.08 @ 11:00 AM

     

    関数名といい、関数の分けかたといい、以前と比べて
    格段によくなっていますね!!読んでても、読みやすいです。

    ひとつだけ、if ($errMsg != null) の!=は!==にしてあげるともっと良くなりますよ。
    if (0 != null) と if (0 !== null) を動作の違いを比べるとわかると思います。

    それにしても、コードが綺麗になりましたね。

Comment RSS · TrackBack URI

コメントをどうぞ

名前: (Required)

eMail: (Required)

Website:

Comment:

Spam Protection by WP-SpamFree