YYPHP#86「単体テストをやっていきたい」「コントローラの重複した処理をどうまとめたらいいか」「フレームワークを使うにはPHPの基礎が分かっている必要がありますか」「オブジェクト指向を知りたいですか」

これは2019年5月31日に開催したPHPerイベント[YYPHP#86]のイベントレポートです。

[YYPHP#86]: https://yyphp.connpass.com/event/122137/
[YYPHP]: https://yyphp.connpass.com/

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

__今回の配信動画__

<blockquote class="twitter-tweet" data-lang="ja"><p lang="fi" dir="ltr">YYPHP <a href="https://t.co/2GytPg1hRe">https://t.co/2GytPg1hRe</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1134406543493885952?ref_src=twsrc%5Etfw">2019年5月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

__過去回の配信動画__

https://www.youtube.com/playlist?list=PLpOeTEye3Bg6PodrLHHC72jWMJYZz8VbG

## 雑談

### みんなPHPでどんな仕事をしているのか？ (やぎ)

* Laravelのほうが人気という情報を聞いているので、Laravelを勉強しておいたほうがいいと感じている。
* なぜLaravelがCakePHPより人気？
    * Laravelのほうが開発が活発
        * コミュニティが大きい
        * コードがきれい
    * Laravelカンファレンスは聞くけど、CakePHPカンファレンスはあまり聞かない
* 最近のプロジェクトだったらLaravel
* Laravelの方が新規案件は圧倒的に多いのは間違いないとして、あえて他の視点で聞きたいんだけど、初学者がMVCフレームワークの理解をしたいって意味でもやっぱLaravel？
    * 他のフレームワークでも変わらないと思う
* 機能的にはどう違うのでしょうか？
    * CakePHP3のほうが機能が少ない
        * DI, アセットパイプラインなどがない
        * Laravelのほうが公式パッケージが豊富: 認証、決済など
* CakePHPは3系から良くなったと聞いた
    * 物自体は良くなったけど、いろいろが犠牲になった
* バージョンアップするごとに不具合が出る？
    * 不具合というより互換性が崩れる
* いまのLaravelはごちゃついてきているので、今後が不安なところ。6系になったときにクリーンになってほしいところ
    * PRでゴミがじょじょに溜まってきてる感じ
* 意外とCakePHPの案件は多いんですよね。Lancersとかで見ると、件数ではCakePHPの案件がLaravelの倍以上あったりする。保守案件が多いんですかね？
    * 保守な気がする
    * 新規案件ではほぼチョイスされていない気がするけど
* 過去のコードは直していくか？
    * 実質難しい

### 単体テストをやっていきたい (しゅんすけ)

Tinker、PHPUnitを使ったテストをやっていきたいので、テストプロのsuinさんに聞きたい。

* Psysh, TinkerはREPL
    * 簡単な動作確認
    * アドホックなテスト
* PHPUnitはテストフレームワーク
* しきい値、境界値とかのテスト
    * テーブルドリブンテスト
        * dataProvider
* 型のテストする？
    * 型のテストは方宣言があるのでしない
    * 新しく作るものは`declare(strict_types=1)`で書く主義
        * (PhpStormのテンプレートに入れた)
* PHPUnitでテストする項目ってどうやって決めている？
    * 仕様(spec) → テスト → 実装
    * ATDD (acceptance test driven development)
        * 受け入れテスト駆動開発
        * README.md
* テスト書きにくいときはだいたいなにか間違っている(だいたい機能がごちゃっとからまって分離できていない)
* いいテスト、悪いテスト
    * 仕様によるもの、テストコードによるものどっちもある
        * テストコードをプロダクションコードとみなしていないと陥りがち
        * 何千行もあるような
        * 単体テストって足かせ
            * 変な単体テストがいっぱいあるとテスト対象コードを変えにくくなっちゃう
    * `assert`だらけのテストメソッド: 悪い
    * ドキュメントになっている
        * Test Code as a Document
* DIはテストしやすくなる
* 自動化にはJenkins？CircleCI？を使っていますか
    * CI: Continuous Integration (継続的インテグレーション)
        * CIの目的
            * 継続的にインテグレーションする
                * インテグレーションとは、チームで作っているコード(などいろいろな成果物)を頻繁に統合すること
                * ビルドを頻繁にやるところがCIの起原
    * CircleCI: SaaS。サービスで使えるプラグインで拡張できる範囲。
    * Jenkins: セルフホスト。柔軟性は高い。
        * セキュリティ上外部にホストしたくないとき
    * GitLab CIが好き
        * SaaSもある

### コントローラの重複した処理をどうまとめたらいいか (しゅんすけ)

実装プロのsuinさんに、聞きたい。
顧客登録と管理者側での顧客登録があるが、それぞれのコントローラに同じ処理を書いてしまった。
キレイな実装はどうするべきだったのか聞きたい。

* まとめるべき
    * Serviceを作る
        * CustomerRegisterationService
        * CustomerRegisterationController → CustomerRegisterationService
        * AdminCustomerRegisterationController → CustomerRegisterationService
* BaseControllerとか継承でまとめるのは良くない

### オブジェクト指向を知りたいですかぁ？ (reoring)

何を知ったらオブジェクト指向がわかったという感覚になるのか？
おぶじぇくとしこうってなんですか？

* よく言われるやつ: 継承、カプセル化、ポリモーフィズム
    * オブジェクト指向の実装技術で本質ではない気がする
* pure fabrication(純粋人工物？)
    * Repository、Factory、Filter……
    * オブジェクトモデルには出てこないけど、プログラムとして動かすには必要不可欠なオブジェクト。
* 変更に強いコードを書きたい、バグが少ないコードを書きたいと思ったときに、オブジェクト指向が歴史的に知見が溜まってそうだから
* [アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技 | ロバート・C・マーチン, Robert C. Martin, 瀬谷 啓介 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%A5%A5%E7%BE%A9-%E7%AC%AC2%E7%89%88-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E9%96%8B%E7%99%BA%E3%81%AE%E7%A5%9E%E9%AB%84%E3%81%A8%E5%8C%A0%E3%81%AE%E6%8A%80-%E3%83%AD%E3%83%90%E3%83%BC%E3%83%88%E3%83%BBC%E3%83%BB%E3%83%9E%E3%83%BC%E3%83%81%E3%83%B3/dp/4797347783)
* OOA、OOD、OOP

### フレームワークを使うときって基礎をわかってる必要がありますか？ (たける)

* PHPの基礎
    * ある程度わかってないとどっちがPHPかフレームワークなのか混乱しそう
    * Laravelでなんかあったときに問題の切り分けとかができない気がする
* SQLの基礎
    * ORM便りだとなんかあったときに何もできないので
    * N+1問題
    * インデックス
* フレームワークが裏で何をしてるのか理解する必要があるのか気になりました。
    * 知っといたほうがいいけどマストではないと思う

# YYPHPは毎週やってます

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

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