Upgrade to Pro — share decks privately, control downloads, hide ads and more …

良い命名かを調べるリンターを作った + α

chiroruxx
September 26, 2024

良い命名かを調べるリンターを作った + α

第168回 PHP勉強会@東京で話した資料です。

chiroruxx

September 26, 2024
Tweet

More Decks by chiroruxx

Other Decks in Technology

Transcript

  1. リンターを つくった  lucky-lint  https://github.com/chiroruxx/lucky-lint-php  PHP Code_Sniffer のルール

     プログラムの命名のうち、悪い画数の命名を教えてくれる  以下の命名に対応  変数名  定数名(cont/define)  クラス・インターフェース・トレイト名  名前空間名  useインポートのエイリアス名
  2. こんな感じ  例えば Laravel の public/index.php にリントをかける  定数 “LARAVEL_START”

    は良い画数なのでエラーにならな い // Determine if the application is in maintenance mode... if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) { require $maintenance; } 8 | ERROR | "maintenance" is not lucky; level: BAD, stroke count: 22, lucky counts: 0,15,24,31,32
  3. トークン例 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_VARIABLE 4. T_WHITESPACE 5.

    T_EQUAL 6. T_WHITESPACE 7. T_LNUMBER 8. T_SEMICOLON 9. T_WHITESPACE <?php $a = 1;
  4. Sniffの つくりかた  “PHP_CodeSniffer\Sniff\Sniff” インターフェースを満たす クラスを作る  クラス名の最後は Sniff で終わる必要がある

     例: LuckyLintSniff.php interface Sniff { public function register(); public function process(File $phpcsFile, $stackPtr); }
  5. process  検査する内容を書く  $phpcsFile->getTokens() でファイルすべてのトークンを取 得  $stackPtr には何番目のトークンを検査すべきかが入る

     register() で登録した種類のトークンの順番  $phpcsFile->addError() でエラー出力 public function process(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); if ($tokens[$stackPtr]['content']{0} === '#') { $error = 'Hash comments are prohibited; found %s'; $data = array(trim($tokens[$stackPtr]['content'])); $phpcsFile->addError($error, $stackPtr, 'Found', $data); } }
  6. 変数名の チェック 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_VARIABLE 4. T_WHITESPACE

    5. T_EQUAL 6. T_WHITESPACE 7. T_LNUMBER 8. T_SEMICOLON 9. T_WHITESPACE • T_VARIABLE の値を調べる • 最初の$を削る
  7. IF名の チェック 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_INTERFACE 4. T_WHITESPACE

    5. T_STRING 6. T_WHITESPACE 7. T_OPEN_CURLY_BRAC KET 8. T_WHITESPACE 9. T_CLOSE_CURLY_BRA CKET 10. T_WHITESPACE • T_STRING の値を調べたい • T_STRING は命名でない可能 性もある • T_INTERFACE の2つ先の T_STRINGのを調べる
  8. 定数の チェック 1. T_OPEN_TAG 2. T_WHITESPACE 3. T_CONST 4. T_WHITESPACE

    5. T_STRING 6. T_WHITESPACE 7. T_EQUAL 8. T_WHITESPACE 9. T_LNUMBER 10. T_WHITESPACE
  9. Reader class TokenReader { private int $seq = 0; public

    function __construct( private readonly File $file, ) { } public function read(int $seq): Token { // ... } public function next(int $step = 1): Token { return $this->read($this->seq + $step); } public function prev(int $step = 1): Token { return $this->read($this->seq - $step); } }
  10. オートロード  PHP_CodeSniffer は composer の オートローダーを 使用していない  テストなどでオートロードする際は明示的にオートローダー

    を指定する必要がある require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/squizlabs/php_codesniffer/autoload.php';