BLOGTIMES
2009/04/22

あなたのソースコードはきれいですか?

  java  checker 
このエントリーをはてなブックマークに追加

研究でソースコードのスタイルチェック関連のことをちょっとやりたいなと思っているので、Javaのスタイルチェックツールとしては一番メジャーだと思われるCheckstyleを調べてみました。

Checkstyle - Checkstyle 5.0

Checkstyle is a development tool to help programmers write Java code that adheres to a coding standard. It automates the process of checking Java code to spare humans of this boring (but important) task. This makes it ideal for projects that want to enforce a coding standard.

自分がやりたいと思っている事を実現するためには、ルールを色々とカスタマイズできる必要があるのですが、Checkstyleは以前勤めていた某社の技術部門が自社のコード標準に準拠しているかどうかをチェックするルールを定義していたこともあり、いろいろとウラがとれているのでこれがうまく使えると嬉しいんですけどね。

個人的にはEclipseのプラグインで使うのが一番簡単だとおもうのですが、今回は故あってコマンドラインから実行する必要があるので、コマンドラインから実行してみます。

既にJRE,JDK等がインストールされているという前提ですが、適当な場所でcheckstyle-5.0.zipを解凍します。
さらに、そこにsrcというフォルダを作成し、診断したいソースを配置しておきます。今回はHelloWorld.javaという下記のわざと汚く書いたソースを使います。

src\HelloWorld.java

public class HelloWorld { int a = 0; public static void main(String[] args) { int a = 3; for( int i = 0; i< 10; i++){ System.out.println("i="+i); System.out.println("a="+a); } System.out.println("Hello World"); } }

cmd.exeを起動し、先ほど解凍したフォルダにカレントを移動した後で、下記のコマンドを実行すると、検査結果がreport.txtに記録されます。

java -Dcheckstyle.suppressions.file=suppressions.xml -Dtranslation.severity=WARNING -Dcheckstyle.header.file=java.header -Dcheckstyle.importcontrol.file=import-control.xml -jar checkstyle-all-5.0.jar -c checkstyle_checks.xml -r src -f plain -o report.txt

report.txt

Starting audit... F:\checkstyle-5.0\src\HelloWorld.java:0: Missing package-info.java file. F:\checkstyle-5.0\src\HelloWorld.java:1: Javadoc コメントがありません。 F:\checkstyle-5.0\src\HelloWorld.java:1: ヘッダがありません - ファイルの行数が不足しています。 F:\checkstyle-5.0\src\HelloWorld.java:1:25: '{' は新しい行にあるべきです。 F:\checkstyle-5.0\src\HelloWorld.java:2: インデント階層 2 の member def type が正しいインデント 4 にありません F:\checkstyle-5.0\src\HelloWorld.java:2:3: Javadoc コメントがありません。 F:\checkstyle-5.0\src\HelloWorld.java:2:7: 名前 'a' はパターン '^m[A-Z][a-zA-Z0-9]*$' に一致しなければなりません。 F:\checkstyle-5.0\src\HelloWorld.java:2:7: 変数 'a' が明示的に '0' (この型のデフォルト値)に初期化されています。 F:\checkstyle-5.0\src\HelloWorld.java:2:7: 変数 'a' は private とし、アクセッサメソッドを持つべきです。 F:\checkstyle-5.0\src\HelloWorld.java:3: インデント階層 2 の method def modifier が正しいインデント 4 にありません F:\checkstyle-5.0\src\HelloWorld.java:3:3: Javadoc コメントがありません。 F:\checkstyle-5.0\src\HelloWorld.java:3:36: 名前 'args' はパターン '^a[A-Z][a-zA-Z0-9]*$' に一致しなければなりません。 F:\checkstyle-5.0\src\HelloWorld.java:3:42: '{' は新しい行にあるべきです。 F:\checkstyle-5.0\src\HelloWorld.java:4: インデント階層 4 の子 method def が正しいインデント 8 にありません F:\checkstyle-5.0\src\HelloWorld.java:4:9: 変数 'a' は final として宣言すべきです。 F:\checkstyle-5.0\src\HelloWorld.java:4:13: '3' はマジックナンバーです。 F:\checkstyle-5.0\src\HelloWorld.java:5: インデント階層 4 の for が正しいインデント 8 にありません F:\checkstyle-5.0\src\HelloWorld.java:5:8: 'for' の後にホワイトスペースがありません。 F:\checkstyle-5.0\src\HelloWorld.java:5:9: '(' の後にホワイトスペースがあります。 F:\checkstyle-5.0\src\HelloWorld.java:5:22: '<' の前にホワイトスペースがありません。 F:\checkstyle-5.0\src\HelloWorld.java:5:24: '10' はマジックナンバーです。 F:\checkstyle-5.0\src\HelloWorld.java:5:32: '{' の前にホワイトスペースがありません。 F:\checkstyle-5.0\src\HelloWorld.java:6: インデント階層 6 の子 for が正しいインデント 12 にありません F:\checkstyle-5.0\src\HelloWorld.java:6: インデント階層 6 の子 method call が正しいインデント 12 にありません F:\checkstyle-5.0\src\HelloWorld.java:6:30: '+' の前にホワイトスペースがありません。 F:\checkstyle-5.0\src\HelloWorld.java:6:31: '+' の後にホワイトスペースがありません。 F:\checkstyle-5.0\src\HelloWorld.java:7: インデント階層 0 の子 for が正しいインデント 12 にありません F:\checkstyle-5.0\src\HelloWorld.java:7: インデント階層 0 の子 method call が正しいインデント 12 にありません F:\checkstyle-5.0\src\HelloWorld.java:7:24: '+' の前にホワイトスペースがありません。 F:\checkstyle-5.0\src\HelloWorld.java:7:25: '+' の後にホワイトスペースがありません。 F:\checkstyle-5.0\src\HelloWorld.java:8: インデント階層 4 の for rcurly が正しいインデント 8 にありません F:\checkstyle-5.0\src\HelloWorld.java:9: Line matches the illegal pattern '\s+$'. F:\checkstyle-5.0\src\HelloWorld.java:10: インデント階層 4 の子 method call が正しいインデント 8 にありません F:\checkstyle-5.0\src\HelloWorld.java:10: インデント階層 4 の子 method def が正しいインデント 8 にありません F:\checkstyle-5.0\src\HelloWorld.java:11: インデント階層 2 の method def rcurly が正しいインデント 4 にありません Audit done.

思ったよりかなり細かくレポートされてます。ただこのアドバイスがわかりやすくて全て有用なのかといえばかなり疑問があります。やっぱり細かくチューニングしないとダメですね。ただ、インデントの誤りがちゃんと指摘されているのにはちょっと驚きました。あとはこれをCに適用できるようにできたらベストなんですけどね。。。。。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3007
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン