PSR-2でLintした結果を見えるようにして、コード品質の最低限を上げる

TL;DR

Example - PHP_CodeSniffer

例えばこのコード、ifのあとのカッコの前にspaceがない、if () {} else {}のbraceがない。

# test.php
<?php
if($a==2)
    echo $a;
else
    echo '3';

これをPHP_CodeSnifferでチェックすると、エラーが表示される。

$ php phpcs.phar --standard=PSR2 test.php

FILE: C:\Users\ishida\src\test.php
--------------------------------------------------------------------------------

FOUND 7 ERRORS AFFECTING 4 LINES
--------------------------------------------------------------------------------

 1 | ERROR | [x] Expected 1 space after closing brace; 0 found
 2 | ERROR | [x] Expected 1 space after IF keyword; 0 found
 2 | ERROR | [x] Inline control structures are not allowed
 2 | ERROR | [x] Whitespace found at end of line
 4 | ERROR | [x] Expected 1 space after ELSE keyword; newline found
 4 | ERROR | [x] Inline control structures are not allowed
 5 | ERROR | [x] Expected 1 blank line at end of file; 2 found
--------------------------------------------------------------------------------

PHPCBF CAN FIX THE 7 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------------------


Time: 90ms; Memory: 2.5Mb

PHPのコーディングスタイルをPHP_CodeSnifferで修正する - Qiita

コード規約あると何がウレシイかというと、どうでもいいことでのストレスが減らせる。

コードレビューの時間をどうでもいい指摘ばっかりしたくない。どっちでもいいこととか。4space, 2space, tab とか。

どうでもいいことは、指摘もしたくない。機械的に勝手に直されてほしい。

PHP_CodeSnifferphp-cs-fixerを使おう。

正論だがしかし

正論だし、メリットもわかる。ではなんで徹底されない? 単に、ツールやテクノロジーが足りてない。 知ってればわかるだけの話。やろう。

仕事の生産性上げるのは、仕事だ!

入力支援

エディタなりIDEなりの手元でガンガン支援受けて直すのが一番いい。

コマンド

php-cs-fixerやPHP_CodeSniffer付属のphpcbf

エディタ

良いタイトルが合ったので、持ってきた。

結果の可視化

Pull Request Review Comment

こんな感じに、GitHub Pull RequestにReview Commentがつくツールやサービスがある。 この行が長過ぎます、という例。

review comment
review comment

おもにrubyプロジェクトの場合 Hound(Web Service), Hound(OSS), Pronto というのを使う。 各言語ごとにいろいろある。言語ごとに実装してるのマヌケっぽい。

言語中立なのを作った。Saddler

Example - Saddler

プルリクエストに対してテストが走る、その後処理の中で、実行する。

# TravisCIやCircleCIの after testの中で(travisCI用語でafter_script, CircleCI用語でpost test)
git diff --name-only origin/master \
  | grep ".*.php$" \
  | xargs phpcs --report=checkstyle \
  | checkstyle_filter-git diff origin/master \
  | saddler report \
      --require saddler/reporter/github \
      --reporter Saddler::Reporter::Github::PullRequestReviewComment

途中出力

git diff --name-only origin/master \
  | grep ".*.php$" \
  | xargs phpcs --report=checkstyle

<?xml version="1.0" encoding="UTF-8"?>
<checkstyle version="1.0.0">
 <file name="/path/to/code/myfile.php">
  <error line="2" column="1" severity="error" message="Missing file doc comment" source="PEAR.Commenting.FileComment"/>
  <error line="20" column="43" severity="error" message="PHP keywords must be lowercase; expected &quot;false&quot; but found &quot;FALSE&quot;" source="Generic.PHP.LowerCaseConstant"/>
  <error line="47" column="1" severity="error" message="Line not indented correctly; expected 4 spaces but found 1" source="PEAR.WhiteSpace.ScopeIndent"/>
  <error line="47" column="20" severity="warning" message="Equals sign not aligned with surrounding assignments" source="Generic.Formatting.MultipleStatementAlignment"/>
  <error line="51" column="4" severity="error" message="Missing function doc comment" source="PEAR.Commenting.FunctionComment"/>
 </file>
</checkstyle>

と、たぶんなるはずなんだけど、手元にいい感じにsetupしたPHP_CodeSnifferプロジェクト無いので、誰か手伝ってほしい。

メリット

Build phases

設定したがしかし

設定したら終わりか?

ノー。そこから始まり。 チームがコードをどう考えていくか、をすり寄せ続ける必要がある。

重要なのは

重要なのはコードを介した対話だ!

Saddler 確実に詰まる

設定しかけてわかんなかったらバンバン聞いてください。 @sanemat に。 全員(自分も含めて)シェルスクリプト周りかCIサービス周りで確実に詰まる。


参照

sanemat {AT} tachikoma.io

Bundle Update as a Service, Tachikoma.io