Top View


Author shiro seike / せいけ しろう / 清家 史郎

sebastianbergmann/phpcpdでコピペコードを撲滅する

2019/12/23

phpcpd

phpcpd is a Copy/Paste Detector (CPD) for PHP code.

コピペコードを見つけるツールです。
同一コードは出来る限り無いほうが良いので是非実施してみましょう

素書のコードで試す

昔々、 line bot api framework としてlbafといふもうを書きました。
懐かしいですね(今は使い物にならないと思います

このコードはフレームワーク等を使わずに、全部素で書いたので、コピペ等存在しないはず

$ cd github.com/seike460/lbaf
$ phpcpd .
phpcpd 4.1.0 by Sebastian Bergmann.

No clones found.

Time: 38 ms, Memory: 4.00MB

コピペが検出されません。
コピペが無いコードが良いわけではありませんが、健全なコードの指標にはなるかと思います。

CakePHP3で書いたコードで試す

なんだかんだ、そんなに検出されないのでは?
そう思った時代が僕にもありました。 CakePHP3で書いたコードで試してみます

phpcpd src
phpcpd 4.1.0 by Sebastian Bergmann.

Found 9 clones with 388 duplicated lines in 8 files:

  - 秘密のパス/src/Controller/秘密の.php:440-519 (79 lines)
    秘密のパス/src/Controller/秘密の.php:692-771

  - 秘密のパス/src/Controller/秘密の.php:235-289 (54 lines)
    秘密のパス/src/Controller/秘密の.php:409-463

  - 秘密のパス/src/Shell/秘密の.php:32-83 (51 lines)
    秘密のパス/src/Shell/秘密の.php:24-75

  - 秘密のパス/src/Shell/秘密の.php:32-78 (46 lines)
    秘密のパス/src/Shell/秘密の.php:25-71

  - 秘密のパス/src/Controller/秘密の.php:235-280 (45 lines)
    秘密のパス/src/Controller/秘密の.php:697-742

  - 秘密のパス/src/Controller/秘密の.php:56-93 (37 lines)
    秘密のパス/src/Controller/秘密の.php:138-175

  - 秘密のパス/src/Model/Table/秘密の.php:177-206 (29 lines)
    秘密のパス/src/Model/Table/秘密の.php:273-302

  - 秘密のパス/src/Controller/秘密の.php:395-420 (25 lines)
    秘密のパス/src/Controller/秘密の.php:486-511

  - 秘密のパス/src/Shell/秘密の.php:128-150 (22 lines)
    秘密のパス/src/Shell/秘密の.php:81-103

1.80% duplicated lines out of 21516 total lines of code.
Average size of duplication is 43 lines, largest clone has 79 of lines

Time: 310 ms, Memory: 18.00MB

これには正直自分でもビックリしました。
こんな重複ある…?と

ただ、表示されたパスを見ると、非常に思い当たる節がありました
とても説明しにくいのですがアプリケーションの特性として、
重複コードが発生しやすい構成になっています。
それを頑張って重複しないようにしてたのですが、その共通化の漏れ部分と
Shellに関してはいわゆるデータ移行用のShellで初期処理とか凄くコピペした覚えがありました...

該当の箇所を修正すると

phpcpd src
phpcpd 4.1.0 by Sebastian Bergmann.

Found 3 clones with 119 duplicated lines in 3 files:

  - 秘密のパス/src/Shell/秘密の.php:32-83 (51 lines)
    秘密のパス/src/Shell/秘密の.php:24-75

  - 秘密のパス/src/Shell/秘密の.php:32-78 (46 lines)
    秘密のパス/src/Shell/秘密の.php:25-71

  - 秘密のパス/src/Shell/秘密の.php:128-150 (22 lines)
    秘密のパス/src/Shell/秘密の.php:81-103

0.56% duplicated lines out of 21412 total lines of code.
Average size of duplication is 39 lines, largest clone has 51 of lines

Time: 315 ms, Memory: 18.00MB

動作テストしていないのでまだ反映は出来ないですが、該当の箇所はしっかり減りました
Shellはどうしよう…もう使わないし削除しようかな…

まとめ

phpcpdを利用して、重複コードのチェックを行なってみました。
僕の場合は過去の悪事を暴かれてプロジェクトが健全な方向に進む一歩になったと考えます

身に覚えがある方、是非phpcpdを実行してみてはいかがでしょうか

明日のPHP Advent Calendar 2019は、なんと空白
書いてみたい人は是非今からでもご応募ください

shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

Twitter X

Company:Fusic CO., LTD. Slides:slide.seike460.com blog:blog.seike460.com Program Language:PHP , Go Interest:Full Serverless Architecture

Related Posts