Nagoya.php vol.3に参加しました

昨日開催されたNagoya.php vol.3に参加しました。

今回のテーマは「生PHPでプログラムを作ってみよまい!」ということで、「読書リスト管理ソフト」を実際にみんなで考えながら作成するという、非常に興味深い内容でした。

内容

以下の要件などで「読書リスト管理ソフト」でPHPでプログラミングしていきました。

システムの要件

  • 読書リスト管理ソフト(蔵書管理、読書履歴、メモ管理)
  • 読んだ感想(1つの本に複数あり) タグ付け
  • マーカー(引用箇所)メモ タグ付け
  • 横断的にタグに関連する引用箇所を取得
  • 書籍同士の関連付けメモ

作り方の縛り

  • 中身の機能だけを作る感じ(CLIかユニットテストで機能を確認)
  • オブジェクト指向でOK?
  • no database(データを返すスタブ等で)
  • PHP.Skeletonでスタート

PHP.Skeleton

PHP.Skeleton(A standard PHP project skeleton)なんてものがあったんですね。

Composerでインストールすると、自動的にPHPプロジェクト用のスケルトンが作成されます。ライセンスファイルも用意されており自動的にBSDライセンスになっていますので、ソースを配布する場合は注意してください。

$ composer create-project php/skeleton Nagoya.Zousho
$ cd Nagoya.Zousho
$ composer dump-autoload
$ phpunit

こんな感じでファイルが用意されます。

Nagoya.Zousho/
├── Licence.txt
├── README.md
├── bin/
├── build.xml
├── composer.json
├── data/
│   └── tmp/
├── phpcs.xml
├── phpdox.xml.dist
├── phpmd.xml
├── phpunit.xml.dist
├── scripts/
├── src/
│   └── Nagoya/
│       └── Zousho/
│           ├── Exception/
│           │   ├── ExceptionInterface.php
│           │   ├── LogicException.php
│           │   └── RuntimeException.php
│           └── Zousho.php
├── tests/
│   ├── Nagoya/
│   │   └── Zousho/
│   │       ├── Mock/
│   │       └── ZoushoTest.php
│   └── bootstrap.php
└── vendor/
    ├── autoload.php
    └── composer/
        ├── ClassLoader.php
        ├── autoload_classmap.php
        ├── autoload_namespaces.php
        ├── autoload_psr4.php
        └── autoload_real.php

設計&コーディング

ホワイトボードに書き出し全員で設計しつつ、1人がコーディングしていくというスタイルで進められました。

最初に要件からクラスになりそうなものをピックアップし、ユースケースごとにコーディングしていきました。

データベースはまだ使わない、UIもまだないということで、純粋にオブジェクト指向でDDD的に進められました。あと、ユニットテストも書いています。

作成したコード

以下のリポジトリにアップされています。

見ての通り、あまり進んでいません。しかも、すでにBookクラスはちょっとヤバくなりそうな感が出ています。

<?php
/**
 * Created by PhpStorm.
 * User: hidenorigoto
 * Date: 2014/01/25
 * Time: 15:21
 */

namespace Nagoya\Zousyo;


class Book {
    /**
     * @var string
     */
    private $isbn;

    /**
     * @var string
     */
    private $title;

    /**
     * @var \DateTime
     */
    private $registeredAt;

    /**
     * @var array
     */
    private $kansouList = [];

    private $quoteList = [];


    /**
     * @param mixed $isbn
     */
    public function setIsbn($isbn)
    {
        $this->isbn = $isbn;
    }

    /**
     * @return mixed
     */
    public function getIsbn()
    {
        return $this->isbn;
    }

    /**
     * @param mixed $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * @return mixed
     */
    public function getTitle()
    {
        return $this->title;
    }

    public function addKansou(Kansou $kansou)
    {
        $this->kansouList[] = $kansou;
    }

    public function addQuote(Quote $quote)
    {
        $this->quoteList[] = $quote;
    }

    /**
     * @return array
     */
    public function getKansouList()
    {
        return $this->kansouList;
    }

    /**
     * @param \DateTime $registedAt
     */
    public function setRegisteredAt($registedAt)
    {
        $this->registeredAt = $registedAt;
    }

    /**
     * @return \DateTime
     */
    public function getRegisteredAt()
    {
        return $this->registeredAt;
    }

    /**
     * @param array $quoteList
     */
    public function setQuoteList($quoteList)
    {
        $this->quoteList = $quoteList;
    }

    /**
     * @return array
     */
    public function getQuoteList()
    {
        return $this->quoteList;
    }
}

リファクタリングしたいところですが、そのような時間はありませんでした(笑)

その他いろいろ印象に残ったことなど

懇親会での内容も含まれています。

PhpStorm

コーディングをされていた@hidenorigotoさんがPhpStormを使われていました。getter、setterの自動生成などいろいろと便利そうでした。

(13:53 追記) NetBeansでもgetter、setterの自動生成はできました。NetBeans PHPでgetter、setterを自動生成するを参照してください。

ただし、PhpStormは頻繁にセールをやってるので通常価格で買ってはいけないとのこと。

Windows Vagrant Synced Folder

遅いと評判のWindowsでのVagrantのSynced Folderですが、実際に使っている方がいて、SSDだから私は特に不満はないという衝撃のお言葉をいただきました。

ユースケースクラス

クラスの設計で、実務ではユースケースのクラスを作成するというのがありました。

PHPでイテレータパターンは必要か否か

年をとると一度にいろいろなことは考えられなくなるので、関心の分離が必要とか(笑)

ちなみに、今、SPLのイテレータを見てみると、24個もありますね。

    AppendIterator
    ArrayIterator
    CachingIterator
    CallbackFilterIterator
    DirectoryIterator
    EmptyIterator
    FilesystemIterator
    FilterIterator
    GlobIterator
    InfiniteIterator
    IteratorIterator
    LimitIterator
    MultipleIterator
    NoRewindIterator
    ParentIterator
    RecursiveArrayIterator
    RecursiveCachingIterator
    RecursiveCallbackFilterIterator
    RecursiveDirectoryIterator
    RecursiveFilterIterator
    RecursiveIteratorIterator
    RecursiveRegexIterator
    RecursiveTreeIterator
    RegexIterator

感想

PHPの勉強会というと、PHPの新しい機能や細かい仕様とか、ライブラリやツールの使い方とか、自分はこういうツールでこうやっているとか、そういうのは多いと思います。そういうのももちろん有用なのですが、今回のようなクラスを実際にどう設計してコーディングしていくか?みたいな、どちらかというとあまりPHP寄りでない、より本質的な、また、オブジェクト指向的な内容の勉強会はほとんどなかったんじゃないかと思います。

なので、非常に有意義な勉強会でした。

勉強会を企画運営された@longkey1さん、@hidenorigotoさん、どうもありがとうございました。

関連

Date: 2014/01/26

Tags: php, nagoyaphp