読者です 読者をやめる 読者になる 読者になる

リファクタリング時のデザインパターン、PHP開発者向けのgit hook管理ツール・静的解析ツール〜ドイツのPHPカンファレンスレポート 3日目

こんにちは!ドイツの美味しいご飯に思いを馳せている、ぐるなびエンジニアの宮原です。

2016年10月末に、海外出張としてドイツ・ミュンヘンで開催されたInternational PHP Conferenceに同僚1人と行ってきました。ホテルの朝食も、レストランの食事も、カンファレンス会場でのご飯も、みんなとても美味しかったです!

前回に引き続き、3日目のセッションを紹介していきます!今回は、(ちょっぴりPHP開発者に特化した)git静的解析リファクタリングとデザインパターンの話が出てきます。

1日目2日目の様子もレポートにしています)

セッション紹介(3日目)

Mastering git

GitのTips系のお話や、PHP開発者向けのgit hook libraryであるCaptainHookの紹介。スピーカーは@movetodevnullさん。

CaptainHookは@movetodevnullさんが作成したツール。git hookの動作をシンプルなJSONファイルで管理できます

たとえばコミットやプッシュの前にコーディング規約にのっとっているかチェックをかけたり、ユニットテストを実行したり、コミットメッセージのバリデーションをかける……といったことが簡単に設定できます。

以下は、CaptainHookの管理用のJSONファイルの例です。

{
  "commit-msg": {
    "enabled": true,
    "actions": [
      {
        "action": "\sebastianfeldmann\CaptainHook\Hook\Message\Action\Regex",
        "options": {
          "regex": "#.*#"
      }
    ]
  },
  "pre-commit": {
    "enabled": true,
    "actions": [
      {
        "action": "phpunit"
      },
      {
        "action": "phpcs --standard=psr2 src"
      }
    ]
  },
  "pre-push": {
    "enabled": false,
    "actions": []
  }
}

sebastianfeldmann/captainhookConfigurartionをもとに作成)

このJSONファイルでは、

  1. コミットメッセージが指定した正規表現とマッチするかどうか確認
  2. コミット時にユニットテストを実施(PHPUnit
  3. コーディング規約にのっとっているかのチェック(PHP_CodeSniffer

をそれぞれ実行しています。

このうち、ユニットテストとコーディング規約のチェックはコマンドの実行で実現していますが、コミットメッセージのチェックはPHPで実現しています。指定されたインターフェースを実装したPHPクラスであれば利用できるようなので、PHP開発者であれば独自の拡張も容易にできそうです。

git hook でいろいろ試したいけど、まだ手をつけられてないという方は、CaptainHookを導入してみてはいかがでしょうか。

スライドはこちら。

Automating Architecture Constraint Checks

@tobySenさんと@korednさんによる、静的解析系の実体験からのお話でした。

このセッションは、聴衆(ドイツの開発者が大多数のようでした)への質問からスタート。CI環境が整っているかどうかコーディング規約の自動チェックを実施しているか?という問いに、CIは7割位、規約の自動チェックには3割位の方が手を挙げていました。

セッション内では一般的な開発時の設計ルールが紹介されていました。

  • コントローラにはロジックは書かない
  • エラー処理は常に例外で行う
  • 配列の代わりにデータオブジェクトを使う
  • データの読み込みと保存にはゲートウェイとリポジトリを使う
  • 依存(するオブジェクト)は常に注入して使う
  • Facadeパターンを適用する
  • 全てのドメインロジックをテストする
  • 言葉を省略しない

設計ルールには一長一短なものもあります。どちらが良いか悩むときは先人の選択にまずは従ってみる、というのも一つの解ではないでしょうか。

PHP開発に関する多くのツールも挙げられていました。

実現したいこと ツール名
コーディングスタイルのチェック PHP_CodeSniffer
コードメトリクスの計測 PHPLOC
冗長化したコードの検出 PHP Copy/Paste Detector (PHPCPD)
複雑度と結合度のチェック PHP Depend
潜在的なバグの検出 PHP Mess Detector(PHPMD)
ソフトウェア層(コントローラなど)の依存関係をチェック Deptrac

あわせてPHPMDのチェックルールを拡張し、「データオブジェクトがメソッドを含まないこと」を確かめる方法も紹介されていました。

使ったことのあるツールもあれば、名前も知らなかったツールもあったので、今後いろいろ試してみたいと思います。

スライドはこちらからどうぞ。

Refactoring towards Design Patterns

@beberleiさんによる、デザインパターンを適用するためのリファクタリングに関するお話です。

リファクタリング時、ただやみくもにデザインパターンを適用するのは間違い。そうではなく、既存のコードとのバランスを考えた上で、最適なデザインパターンを導入する方法が語られました。

まず最初は、リファクタリングをはじめる動機、進め方の方針、ゴールについて述べられました。 特に良いなと思ったのは、モチベーションの話。

  • Neglecting design leads to underengineering
  • (設計をおろそかにすると、技術的負債がたまっていく)
  • Over-focusing on Design-Pattern leads to overengineering
  • (デザインパターンに頼りすぎると、無駄に複雑なシステムを生み出す)

ほかの説明もわかりやすく明確で、リファクタリングを進めたい!という気持ちにさせられます。

その後

  • 関数抽出
  • Factory
  • Singleton
  • 大きすぎるクラス/メソッド
  • Facadeパターン
  • 基本データ型への執着

と紹介が続きます。それぞれ「どういう課題があって、それに対してどうやって解決していくか」ということが紹介されました。

セッションの中では、IDE(PhpStorm)を使ったリファクタリングのデモも実施されました。スライドの中でも触れられていますが、IDEのリファクタリング機能は強力です。リファクタリング作業が素早く行える上に、関数抽出や関数・変数名変更などを自動化するため、ヒューマンエラーも抑止することができます。

リファクタリングはしたい、けどどこから手を付けていいかわからない、どういう方針で進めていいかわからない、という方は、是非参考にしてみてください。

スライドはこちらから確認できます。

Networking

カンファレンスではセッションの合間に長い休憩があり、軽食がふるまわれて雑談できる時間が設けられていました。

f:id:miyahara-r:20161202191645j:plain

せっかくのチャンスなので、私達もいろいろな人に話しかけてみることに。

開催地がドイツということもあり、やはりドイツ国内からの来場者が一番多かったようです。イタリアから来ている開発者とも言葉を交わしました。

f:id:miyahara-r:20161202191220j:plain

言語の話になったときは「ドイツではPHPが一番流行ってると思うよ!」と言っていて、PHP愛を感じました(本当のところ一番流行っているかどうかは分かりませんが……)。話す言葉は違うけど、プログラムを書く言語は同じって、なんだか面白いなと改めて思いました。

それ以外のトピックとしては、私達が話を聞いた範囲ではありますが、フレームワークではLaravelCakePHPの名前を多く聞きました。 開発手法に関しては、アジャイルが結構普及しているという印象を受けました。

一方で「ドキュメントを書く時間やテストコードを書く時間がなかなかとれない。ついつい後回しになったり、作らないままになったりすることもある」という話を聞きました。この手の悩みはどこの国でもあるのかもしれませんね。

(オマケ・ドイツ観光)老舗レストランと宮殿

3日間のメインカンファレンスの間、昼食は毎日会場でいただけました。

f:id:miyahara-r:20161125091533j:plain Conferenceでのお昼ご飯の様子

しかし、晩ご飯が提供されたのはレセプションやLate Talkが開催された2日目だけ。 そこで、1日目はドイツで一番有名と言われるビアホール、3日目の夜には1363年創業の歴史あるレストラン、ツム・フランツィスカーナーに行ってみました。バイエルン料理のお店です。

f:id:miyahara-r:20161206130742j:plain

建物の外観も内装もとても雰囲気が良く、食事もとても美味しかったです。

ツム フランツィスカーナー #theta360 - Spherical Image - RICOH THETA


f:id:g-editor:20161216173936j:plain

また、最終日のフライトの前にちょっと時間があったので、ニンフェンブルク宮殿に立ち寄ってみました。 外観も内観も、西洋の建物!という感じがしてとても良かったですし、まわりの庭園も日本のそれとはまた違った味わいがあって、趣深かったです。

ニンフェンブルク宮殿 #theta360 - Spherical Image - RICOH THETA

全体の感想

International PHP Conferenceではさまざまな知見を得られました。ソフトウェア開発を進めていく上で参考にできそうな考え方や、すぐにでも業務で使えるツール情報など、役立つセッションが多く勉強になりました。

海外のエンジニアからは、技術トレンドや他の国のソフトウェア開発事情など興味深い話が聞けました。日本の開発シーンと違う部分もあるなと気づけた一方で「開発者どうし同じ悩みを抱えているんだなあ」と親近感がわいたのも覚えています。

とても有意義な時間でした。また機会があればぜひ行きたいと思います。

ただ聞きに行くだけではなく、できれば発表する側に立ってみたいと思いますし、発表したくなるような開発ができるよう、常にアンテナを張ることと、開発をより良くしていくという熱い思いを常に持ち続けながら業務に取り組んでいきたいと思います!

お知らせ
ぐるなびでは一緒に働く仲間を募集しています。


‘宮原良介’

2010年に大学院を卒業し、新卒で某大手精密機器メーカに就職。2015年の秋、食への熱い思いを持って、ぐるなびへ転職。ぐるなびでは単に開発を行うだけではなく、様々な業務改善を推進するとともに、アジャイル(スクラム)の普及にも尽力している。
パンダ好きのフルスタック気味エンジニア。