投票ページの作成 (リベンジ編)

はじめに

...前回、さらっと作るはずの投票ページがうまくできなかったので、そのリベンジ。


予定

と言うわけで、リベンジ編の予定はこんな感じです。


投票データ管理クラスの作成

前置きとか、詳細は省略します。ソースがドキュメントです。

php02_unittest_null

最初のクラス定義はこんな感じ。
<?php
/*
  ナシオ。ヌス、ホエノヘッ・鬣ケ
  Satofumi KAMIMURA
  $Id$
*/


class VoteClass {

  // ・ウ・ケ・ネ・鬣ッ・ソ
  function VoteClass() {
  }


  // ・ヌ。シ・ソ・ユ・。・、・ォ、鯣ノ、゜スミ、キ
  function load($fname) {
  }


  // サリト猯ワ、ヒ」アノシトノイテ
  function add($title) {
  }

  
  // ・ヌ。シ・ソ・ユ・。・、・リ、ホスュケ゜
  function save($fname) {
  }
}
?>

で、空実装のテストクラスは以下の通り。

<?php
/*
  voteClass.php 、ホ・ニ・ケ・ネ
  Satofumi KAMIMURA
  $Id
*/

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
require_once('phpunit/phpunit.php');
require_once('voteClass.php');
//require_once('voteClass_null.php');


class VoteClassTest extends TestCase {
  var $voteObj_;

  // ・ウ・ケ・ネ・鬣ッ・ソ
  function VoteClassTest($name) {
    $this->TestCase($name);
  }

  // ・ニ・ケ・ネ、ホス魘ス
  function setUp() {
    $this->voteObj = new VoteClass();
  }

  // ・ニ・ケ・ネ、ホスェホサ
  function tearDown() {}


  // 、ハ、ォ。「コヌス鬢ホ・ニ・ケ・ネ、ャ・ィ・鬘シ、ヒ、ハ、ホ、ヌ・タ・゜。シ・ニ・ケ・ネ、ネ、キ、ニトノイテ
  function testDummy() {
  }


  // ニノ、゜スミ、キ・ニ・ケ・ネ
  function testLoad() {
    $this->voteObj->load('loadSample.dat');

    $this->assertEquals(8, $this->voteObj->voteInfo['、ヲ、オ、ョ、オ、]);
    $this->assertEquals(4, $this->voteObj->voteInfo['、ュ、熙オ、]);
    $this->assertEquals(1, $this->voteObj->voteInfo['、ソ、フ、ュ、オ、]);
  }


  // ナシ・ニ・ケ・ネ
  function testAdd() {
    $this->voteObj->load('loadSample.dat');

    // エ鈐クケ猯ワ、ヒツミ、キ、ニ、ホナシ
    $this->voteObj->add('、ソ、フ、ュ、オ、);
    $this->assertEquals(2, $this->voteObj->voteInfo['、ソ、フ、ュ、オ、]);

    // ソキオャケ猯ワ、ホトノイテ
    $this->voteObj->add('、セ、ヲ、オ、);
    $this->assertEquals(1, $this->voteObj->voteInfo['、セ、ヲ、オ、]);
  }


  // スュケ゜・ニ・ケ・ネ
  function testSave() {
    $this->voteObj->load('loadSample.dat');
    $this->voteObj->add('、ソ、フ、ュ、オ、);
    $this->voteObj->add('、セ、ヲ、オ、);
    $this->voteObj->save('saveSample.dat');

    $this->voteObj->load('saveSample.dat');
    $this->assertEquals(8, $this->voteObj->voteInfo['、ヲ、オ、ョ、オ、]);
    $this->assertEquals(4, $this->voteObj->voteInfo['、ュ、熙オ、]);
    $this->assertEquals(2, $this->voteObj->voteInfo['、ソ、フ、ュ、オ、]);
    $this->assertEquals(1, $this->voteObj->voteInfo['、セ、ヲ、オ、]);
  }
}
?>

<html>
<head>
<title>VoteClassTest</title>
<STYLE TYPE="text/css">
<?php
include ("stylesheet.css");
?>
</STYLE>
</head>
<body>
<?php
$suite = new TestSuite('VoteClassTest');
$result = new PrettyTestResult;
$suite->run($result);
$result->report();
?>

そのときの実行結果がこれ。まぁ、ちゃんと失敗してる。

で、テストを通過するように調整する。徐々に失敗がなくなっていくのは、やっぱり楽しい。
最初のテストが失敗しているのは、phpunit のせいだと信じる。
テストの実行結果

テストを通過した投票情報の管理クラス

<?php
/*
  ナシオ。ヌス、ホエノヘッ・鬣ケ
  Satofumi KAMIMURA
  $Id$
*/


class VoteClass {
  var $voteInfo;

  // ・ウ・ケ・ネ・鬣ッ・ソ
  function VoteClass() {
  }


  // ・ヌ。シ・ソ・ユ・。・、・ォ、鯣ノ、゜スミ、キ
  function load($fname) {
    $fd = fopen($fname, 'r');
    if (!$fd) {
      return;
    }
    while ($info = fscanf($fd, "%d\t%s")) {
      if (count($info) != 2) {
        continue;
      }
      list ($num, $title) = $info;
      $this->voteInfo[$title] = $num;
    }
    fclose($fd);
  }


  // サリト猯ワ、ヒ」アノシトノイテ
  function add($title) {
    // サリト猯ワ、ャ、「、ミ ++, 、ハ、ア、ミテヘ、1 、ヌトノイテ
    if (array_key_exists($title, $this->voteInfo)) {
      ++$this->voteInfo[$title];
    } else {
      $this->voteInfo[$title] = 1;
    }
  }

  
  // ・ヌ。シ・ソ・ユ・。・、・リ、ホスュケ゜
  function save($fname) {
    if (count($this->voteInfo) <= 0) {
      return;
    }
    $fd = fopen($fname, 'w');
    if (!$fd) {
      return;
    }
    foreach ($this->voteInfo as $key => $value) {
      fputs($fd, $value. "\t". $key. "\n");
    }
    fclose($fd);
  }
}
?>

最後に、投票ページの PHP スクリプトがこれ

<?php
/*
  ナシ・レ。シ・ク
  Satofumi KAMIMURA
  $Id$
*/
require_once('voteClass.php');
$obj = new VoteClass();
$obj->load('voteInfo.dat');
$this_page = strtok(basename($_SERVER['REQUEST_URI']), '?&#');

// ナシ、オ、ソ、鬘「ツュ、キケヌハンツク、キトセ、ケ
if (isset($_GET['add'])) {
  $obj->add(urldecode($_GET['add']));
  $obj->save('voteInfo.dat');
}
?>
<html><head><title>ナシ・レ。シ・ク</title></head>
<body>
ナシキフ<br>
<br>
<?php
// クスコ゜、ホナシキフ、ホニノ、゜スミ、キ
if (count($obj->voteInfo) <= 0) {
  echo 'イ盞釥ホナシセャ、「、熙゛、サ、」';
} else {
  arsort($obj->voteInfo);
  reset ($obj->voteInfo);
  while (list ($key, $val) = each ($obj->voteInfo)) {
    $encoded = urlencode($key);
    echo "$key, $val, <a href=$this_page?add=$encoded>ナシ</a><br>";
  }
}
?>
<br>
ソキオャケ猯ワ、ホトノイテ<br>
<br>
!!! フ、シツチbr>
</php
?>
</body>

ここまでを前回のときにできいればねぇ。


問題点、および実装残り

新規項目を追加するあたりは、宿題にしたい。
あと今回、あまり気にしなかったあたりは、ずばり

ロック

です。このあたりは次回以降にまわします。
...がんばろう。


Generated on Mon Apr 13 22:52:06 2009 by  doxygen 1.5.7.1