YYPHP#58「PHP上達の近道、テストってどうやってる？タスク管理について(LT)、45歳からはじめるPHPプログラミングどうやって関数からクラスにしていくの？」

これは2018年10月26日に開催したPHPerイベント[YYPHP#58]のイベントレポートです。

[YYPHP]は一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ**毎週**、高田馬場にて。

#### サブタイトル: PHPerを支える技術たち

[YYPHP#58]: https://yyphp.connpass.com/event/103260/
[YYPHP]: https://yyphp.connpass.com/
YouTubeでの配信映像はこちら-> [#YYPHP #58【PHPの情報交換・ワイワイ話そう・仲間作り・ゆるめ・にぎやかめ】](https://youtu.be/7FesBI5IN34)

![](https://qiita-image-store.s3.amazonaws.com/0/889/0051f99f-b555-6064-fcc9-3280e5543a1a.png)

## 参加者10名(うちリモート3名)

* PHP歴
    * 1年未満: 3名
    * 1年: 1名
    * 6年: 2名
    * 10年以上: 3名
    * 不明: 1名

## 今日の雑談
### PHP上達の近道

* 最初どうスタートしました？(PythonとCは書いてる)
    * ドットインストール
    * 自分で書いたPythonコードをPHPに移植してみる
* Laravelを使うことになった
    * LaravelとRailsはそんなに変わらない
    * ウェブアプリをどう作るかを重点的に
    * Laravelのチュートリアルをやる
    * 『はじめてのLaravel』を読む
        * Laravelの初心者向けだけどすごく丁寧に書いてあって、
        * タスクリストを作るチュートリアルがあるが、1回めは素のPHPで、2回めはLaravelで、3回めはもっと良くする
        * [絶対に挫折させないアプリ開発　はじめてのLaravel - plumsa - BOOTH（同人誌通販・ダウンロード）](https://plumsa.booth.pm/items/1048008)
        * DL版はちょっと安い → [【ダウンロード版】絶対に挫折させないアプリ開発　はじめてのLaravel - plumsa - BOOTH（同人誌通販・ダウンロード）](https://plumsa.booth.pm/items/1054217)
    * [技術書典５ | サークルリスト | 技術書典](https://techbookfest.org/event/tbf05/circle)
* その後のステップ
    * 作れるようになって、もっと詳しく知りたい場合はソースコードを読む
* 人が作ったソースコードがすごい参考になった
    * 自分で1からつくると考えつかないが、他の人が書いたのを読むことで、こうしたらこう動くというのがわかるようになった
* PhpStormを使って黄色いところ(Warning)をひとつひとつ見ていく
    * PhpStormとは？
        * IDE(統合開発環境)
    * 構文チェック
    * 最近大規模なプロジェクトでスクリプト言語使うならIDEが無いと不可能だと感じる
    * [JetBrains系IDEの学生版を取得した話 - Qiita](https://qiita.com/f0reachARR/items/a31839c31387c2f3b1d4)
* [Php2Python - Python alternatives to PHP functions, classes and libraries - Php2Python](https://www.php2python.com/)
* Raspiで顔認識

### テストってどうやってる？

* アンケート
    * PHPでテストやってことがある人 => 3人
* どういうテストをやろうとしている？
    * テストがどういうものかまだわからっていない
    * 単体とかユニットとかある
* PHPUnitで単体テストや結合テストをやっている
* 画面のテストは変わりやすい時期はまだやらないか、やる範囲を変わりにくいところに絞ったほうが良い
* コードカバレッジで100%を目指すのは良くない
    * PHPはコンパイル言語じゃないので、どれだけ書くか分からないので
    * カバレッジは設計が良くないと高められない
        * 設計
        * クラス
        * 何十もif文が入ってるとかだとテストできない場合も
        * インフラと密結合になっているとテストが難しく、できない場合がある
* CI（自動テスト）でコードのチェックもさせる
* レガシー
    * 1ページ1PHPファイルになっている
        * Viewとロジックがごっちゃになっている
    * クラスに切り出したときに単体テストを増やしていく
    * これだけは動かないといけないというところはSeleniumで自動テストを書いて安全性を確保した上で、単体テストを追加していく
* PHPUnitを3〜4年くらい前にやってみたが全くわからなかった
    * 使い方がわからなかった
    * "PHPUnit Examples"で探せばいろいろ出てくる
    * [Understanding PHPUnit and How to write Unit test cases | Valuebound](https://www.valuebound.com/resources/blog/understanding-phpunit-and-how-to-write-unit-test-cases)


```php
<?php

// PHPUnitっぽいやつ
abstract class TestCase
{
	public fucnction assertTrue($expression): void
	{
		if (!$expression) {
			throw new RuntimeException('dame');
		}
	}
}

// 作った足し算プログラム (これがテスト対象)
class Sum
{
	public function sum($x, $y): int
	{
		return $x + $y;
	}
}

// 作った足し算プログラムをチェックするプログラム
class SumTest extends TestCase
{
	public function testSum(): void
	{
		$sum = new Sum();
		$this->assertTrue($sum->sum(1, 1) === 2);
	}
    
    /**
     * パラメタライズド テスティング
     * `@dataProvider`アノテーションはPHPUnitの機能
     * @dataProvider testData
     */
    public function testSum2($a, $b, $expected)
    {
    	$sum = new Sum();
        $this->assertTrue($sum->sum($a, $b) === $expected);
    }
    
    // パラメタをまとめる
    public function testData()
    {
        yield [1, 1, 2];
        yield [1, 2, 3];
        yield [100, 100, 200];
        // ...
    }
}

$test = new SumTest();
$test->testSum();
```

### タスク管理について (yuk_hik_futureさんからのLT)

* 発表スライド:
    * [エンジニアのための時間管理術 まとめ TODO管理で達成感を得るために - Google スライド](https://docs.google.com/presentation/d/1JklOJ1XDdZr8p0aYiJIZepQstpg33FDP7WuVf8JKfPo/edit#slide=id.p)

* オライリー『エンジニアのための時間管理術』まとめ
    * [エンジニアのための時間管理術 | Thomas A. Limoncelli, 株式会社クイープ |本 | 通販 | Amazon](https://amzn.to/2yD054M)
* わりこみ作業の多いSA(システム管理者)向け
* 割り込み作業の処理、タスク管理、時間管理などについて
* バックログにタスクが増え続ける状態になってた
* 「サイクルシステム」
    * 約束のカレンダー
    * 今日のスケジュール
    * 1日ごとのTODO
    * 目標管理
* プライベートでもできる限り同じツールを使う
* カレンダーに書くべきこと
    * アポイントメントと会議
    * 重要な納期
    * 将来の作業目標
    * 発生したその場で登録したほうがいい
* 今日のスケジュール作成
    * カレンダーアプリで見れるやつを使う
* 1日毎のTODO管理
    * 優先順位が3段階である理由
        * 100段階はだめだった

* 以下、発表を聞いてのディスカッション
* 自分の見積もった時間内に終わらせる努力も大事
    * 完成度が70%や80%(クオリティーや機能を減らして)でも、その時間内に終わったことにする
        * そうしないとずるずる翌日に伸びていく
* デイリーのレビューが必要
    * タスクがInboxに増え続けるので、やめるのか移譲するのかをデイリーのレビューで管理する

### 45歳からはじめるPHPプログラミング
#### どうやって関数からクラスにしていくの？

* 関数を複数使った処理を書いたが、これをどうやってクラスにしていくかわからない。どうやるの？
* 関数をクラスの中に入れていくとクラスになる
* 大事なデータはクラスのプロパティ
    * 複数の関数に関わっている変数はプロパティ

```php
<?php

class MemberInfo
{
    /**
     * @var DomDocument
     */
    private $dom;

    public function __construct(DomDocument $dom)
    {
        $this->dom = $dom;
    }
    
    public function getMembers(): array
    {
        $list = $this->dom["#main > div.applicant_area > div:nth-child(3)"]->find(".display_name")->text();
        return $list;
    }
    
    public function getMemberDetail()
    {
        $this->dom;
    }
}

$memberInfo = new MemberInfo(new DomDocument('html'));
$members = $memberInfo->getMembers();
```

* 具象をいろいろ見て、抽象化を考える
* 妄想力を鍛えるw


この関数は３つやっていることがある
やることは１つにすべき

```php
<?php

declare(strict_types=1);

/* HTMLが読み込めたかどうかをチェック */
function check_html(bool $html): bool {
    if ($html === false) { // 役割3 判定
        echo '$html is empty. Please chech your URL.' .  "\n"; // 役割1 出力
        exit(1); // 役割2 プログラムの終了
    }
    return true;
}
```

boolvalで変換するとかできる

```php
    if ($var <> null) {
    if ($var != null) { //  暗黙の型変換が走る
    if (is_null($var)) {
    if ($var !== null) { // 暗黙の型変換が走らない
```

## YYPHPは毎週やってます

PHPについてワイワイ話したい方は、[YYPHPのイベント情報](https://yyphp.connpass.com/)をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います！ では、また来週！