YYPHP#55「技術書典5おすすめサークル、技術書典5 『PHP中級者を目指す』のお披露目、肥大化したファイルのクラス分割をどうしたらいいか、クラスにゲッターとセッターっているの？、クラス増えすぎたときにどう分類整理する？、TDDで抽象度の高いクラスのテストどうする？、$_POSTの並び順って信用できるか？、PHPのエンジニアだったら知っておきたい関数やライブラリを教えて！、エンジニアの健康管理どうやってる？、目標設定ってどうやっている？、PHP最新事情について」 

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

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

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

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

## 参加者14名(うちリモート4名)

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

## 技術書典5のおすすめサークル(2018年10月8日)

* 技術書典とは
    * 技術書の同人誌即売会
    * Laravelの入門書などが売られる
### YYPHP推薦の技術書典5参加サークル
* こ37 [プラムザ](https://techbookfest.org/event/tbf05/circle/45210001)
    * はじめてのLaravel　～絶対に挫折させないアプリ開発～
* あ20 [湊川あいの、わかば家。](https://techbookfest.org/event/tbf05/circle/47000003)
    * マンガ：告白に学ぶHTTPステータスコード 〜エラー編〜
    * マンガでわかるDocker① 〜概念・基本コマンド編〜
    * マンガでわかるDocker② 〜開発環境を作ろう編〜
* か80 [増井技術士事務所](https://techbookfest.org/event/tbf05/circle/53100001)
    * プログラミング言語図鑑
* う74 [このすみ堂](https://techbookfest.org/event/tbf05/circle/39040001)
    * [新刊] PHP中級者を目指す 〜言語を使いこなすための本〜


## 今日の雑談テーマ

### 技術書典5 『PHP中級者を目指す』のお披露目

* ターゲット
    * 初心者が入門書の次に読む本として、より言語を深く理解してもらえる内容
* 目次
    * 第1章 ビルトインウェブサーバー
    * 第2章 型宣言 (PHP7)
        * 暗黙的型変換 (stringをintにするなど) についても説明している
    * 第3章 変数のスコープを意識したアプリケーション開発
    * 第4章 新機能や新しい演算子 (PHP7)
    * 第5章 名前空間
    * 第6章 オートロード
    * 第7章 PECLとComposer
    * 第8章 アーキテクチャ (MVC、サービスレイヤ、Laravelのアーキテクチャ)
    * 第9章 PSR-0, PSR-1, PSR-3など
    * 第10章 正規表現
    * 第11章 配列 (PHPでは連想配列と添字配列の違いを意識しよう)
    * 第12章 PHPの判定と比較 (switchと型に関する注意点)
    * 第13章 エラーと例外 (Error例外について)
    * 第14章 PHPが動作するWebサーバ(Nginx、PHP-FPM、Apacheなど)
    * 第15章 コード解析 (PhpMetrics, Phan, phpcs, phpmdなど)
    * 第16章 テンプレートエンジン (なぜPHPでもテンプレートエンジンを使うべきか)
    * 第17章 PHP勉強会情報
* お値段: 1,000円 (良心価格)
* 「PHP中級者を目指す」ってオンラインでも購入できますか？
    * [このすみ堂 - BOOTH（同人誌通販・ダウンロード）](https://konosumi.booth.pm/)にて後日購入できるようになります！

### クラスの話

#### クラス設計について聞きたい(肥大化したファイルのクラス分割をどうしたらいいか)

* privateのメソッドがいくつできてきていると思うので、それをクラスに切り出したりする
* 3000行もあると、ひとつのメソッドでも数百行あると思うので、それをメソッドに切り出すのが先かも
* クラスの凝集性に着目して分割していく
    * クラスのプロパティの共通利用に着目して、分けていく
* クラスに抜き出していく
    * 例えば
        * 初期化
        * DBコネクション
        * DB取ってくる
        * 加工する
        * レスポンス
* 3万行が1ファイルに書かれている
    * 秘伝のタレ状態
    * 300〜500クラスにならないといけない
* 先週話題になったレガシーコード改善ガイドを読んでるのですが第20章「このくらすは大きすぎてこれ以上大きくしたくありません」のあたりが関連しそう
    * [レガシーコード改善ガイド | Amazon](https://amzn.to/2OE1rX0)

#### クラスにゲッターとセッターっているの？

* JavaのJavaBeansのゲッターとセッターだけあるクラス
* セット、ゲットするだけならpublicでいいじゃんと感じたがどうなの？
    * セッターでやらないといけないことがある
        * 数値を受け取るなら、その数値の範囲をチェックするなど
* あとでプロパティを変えたいと思っても呼び出し元をすべて変えないといけないので、その予防策としてセッターがあったほうがいい
* 型チェックがきかない
    * public変数だとどんな型も入るが、セッターでカプセル化すれば、例えばint型だけとかに制限できる
* スペルミスに気が付かない
    * publicにミスった変数が増えて気づきにくい

#### クラス増えすぎたときにどう分類整理する？

* クラスの凝集性と同じでパッケージの凝集性を高める
* ３階層くらいまでは深くしても良い
* 1パッケージの中に３〜６クラスくらいある感じにする

* 『クリーン・アーキテクチャ』の「コンポーネントの原則」がパッケージ構造を整理するヒントになるかも

> 第IV部 コンポーネントの原則
>  第12章 コンポーネント
>   コンポーネントの簡単な歴史
>   リロケータビリティ（再配置可能性）
>   リンカ
>   まとめ
>  第13章 コンポーネントの凝集性
>   再利用・リリース等価の原則（REP）
>   閉鎖性共通の原則（CCP）
>   全再利用の原則（CRP）
>   コンポーネントの凝集性のテンション図
>   まとめ
>  第14章 コンポーネントの結合
>   非循環依存関係の原則（ADP）
>   トップダウンの設計
>   安定依存の原則（SDP）
>   安定度・抽象度等価の原則（SAP）
>   まとめ


* 森さんのメモ

![](https://i.imgur.com/mboYUYk.jpg)

#### TDDで抽象度の高いクラスのテストどうする？

* 抽象度の高いとは？
    * 全体の流れの部分
* スタブかモックを使う

### $_POSTの並び順って信用できるか？

* できないと思う
    * ブラウザがどういう順番で送ってくるかはブラウザ次第

### PHPのエンジニアだったら知っておきたい関数やライブラリを教えて！

* phpQuery
* [ziadoz/awesome-php](https://github.com/ziadoz/awesome-php): PHPの優良ライブラリのリンク集
* [Roave/SecurityAdvisories](https://github.com/Roave/SecurityAdvisories): セキュリティ上問題があるライブラリをインストール(composer install)してしまうことを未然に防いでくれるライブラリ
* 倍にしてくれる関数
    * [tnnsst35/naokihanzawa](https://github.com/tnnsst35/naokihanzawa)
* NULL合体演算子 `？？` (PHP 7.0)

### エンジニアの健康管理どうやってる？

* 睡眠障害と判定されて、ジムに通いだした
* 途中途中で立つようにしている
    * ポモドーロで25分ごとに立つようにしている
* スタンディングデスク
* キーボードErgodoxを使う
* 全部数値で把握するようにしている
    * 心拍数
        * 心拍数が高くなることに気づきやすくなり、休憩できるようになる
    * 睡眠時間
    * 体重
* カフェインを飲まない
    * やめるとめっちゃ体調がいい
    * Shine & Shineというフレッシュジュースがおすすめ
        * コーヒーの口寂しさがあったことに気がついて、S&Sのグレープフルーツに置き換えた
        * 今まで1日3杯くらい飲んでた
        * 「嘘だと思ってやってみ。絶対良くなるから」

### 目標設定ってどうやっている？

* (上司に目標設定がふわっとしていると言われているので、みんなどうしているか聞きたい)
* 自分が満足できるまでやりきる
    * ここまでやれるようになったらOKというの定める
* 長いスパンは無意味
    * 2〜3年だとふわっとする
    * 「〜年後にはこうなってたいな」
* どういうエンジニアになりたいかというのを先に決める
* スキル的にどういうエンジニアになりたいかを決める
    * フロントエンド、バックエンド、AI…etc
    * 決まってないなら全部体験するしかない
    * 1,2年目は全部浅く触っていき、3年目からどれを深掘りするか決める
* おすすめなのは、長寿命な基礎技術
    * RDBMS
    * OS
    * ネットワーク

### PHP最新事情について(suin)

* PHP Annotated MonthlyのSeptemberを読んでキャッチアップしたい
    * [PHP Annotated Monthly – September 2018 | PhpStorm Blog](https://blog.jetbrains.com/phpstorm/2018/09/php-annotated-monthly-september-2018/)
* [たぶん月刊PHPニュース 2018年8月9日号 | 株式会社インフィニットループ技術ブログ](https://www.infiniteloop.co.jp/blog/2018/08/php-news-2/)

### ４５歳から始めるPHPプログラミング

* PHPでスクレイピングするスクリプトを書いた
* [get-connpass-member-list/get-member.php at master · nouphet/get-connpass-member-list](https://github.com/nouphet/get-connpass-member-list/blob/master/get-member.php)

関数がスネークケース
変数、クラス、メソッドがキャメルケース
スクレイピングはサイトの規約を見たほうが良い
sleep入れたほうが良い １秒とか５秒とか => 3秒がいいかな


__PhpStorm 300円引き__: [JetBrains製品を割引価格で！ - 株式会社サムライズム](https://secure.samuraism.com/referral/8BF59FFA232F45460DFA1635194C68B6)

## YYPHPは毎週やってます

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

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