DRY(Don’t repeat yourself)という概念があります。つまり同じコードは繰り返すなということです。もし繰り返す必要があるならば、それは関数にするなどまとめるようにしなければなりません。 DRYをなくしていくことでコードの可読性を高めたり、メンテナンスしやすくなります。そんなコードの改善を手助けしてくれるのがjscpdです。

jscpdのインストール

npmなのでインストールは簡単です。

$ npm install jscpd -g

jscpdの使い方

例えば以下のように使います。 –path でパスを指定し、 –languages でチェックする言語を指定します。

$ jscpd --path ~/Dropbox/markry --languages js,coffee
info:    jscpd - copy/paste detector for programming source code, developed by Andrey Kucherenko
warn:    File /Users/nakatsugawa/Dropbox/markry/.cpd.yaml not found in current directory
info:    Files search time: { duration: '2370ms' }
info:    Scaning for duplicates time: { duration: '0ms' }
info:    Scaning... done!

info:    Start report generation...

info:    Found 0 exact clones with 0 duplicated lines in 0 files
 

 100.00% (0 lines) duplicated lines out of 0 total lines of code.

info:    Generate report time: { duration: '1ms' }
info:    All time: { duration: '2379ms' }

特に重複するコードはなかったようです。別なケースで試してみます。

$ jscpd --path ~/some/path --languages ruby
info:    jscpd - copy/paste detector for programming source code, developed by Andrey Kucherenko
warn:    File /some/path/.cpd.yaml not found in current directory
info:    Files search time: { duration: '36281ms' }
info:    Scaning 302 files for duplicates...
info:    Scaning for duplicates time: { duration: '3296ms' }
info:    Scaning... done!

info:    Start report generation...

info:    Found 38 exact clones with 402 duplicated lines in 13 files
 
	- .../app/controllers/articles_controller.rb:186 -197
	  .../app/controllers/articles_controller.rb:233 -244
    :	
	- .../vendor/plugins/search_do/recipes/mode_maintenance.rb:2 -26
	  .../vendor/plugins/search_do/recipes/mode_maintenance.rb:28 -52

 3.12% (402 lines) duplicated lines out of 12881 total lines of code.

info:    Generate report time: { duration: '15ms' }
info:    All time: { duration: '39607ms' }

なんと3.12%も重複するコードがあったようです。二つのファイルが並びますので、これをチェックしていくことでコードの重複をなくしていけるという仕組みです。

言語は以下に対応しています。

  • Javascript
  • CoffeeCcript
  • PHP
  • Python
  • LESS
  • Ruby
  • Java
  • C/C++
  • C#

重複がなければ不具合がないという訳ではありませんが、その芽を先んじて摘むことはできるはずです。自分たちのプロジェクトでぜひ試してみてください。

jscpdはnode/JavaScript製のオープンソース・ソフトウェア(MIT License)です。

kucherenko/jscpd