(株)アイジュピタ情報ライブラリ

C# 静的コードチェックツール StyleCop

C# 静的コードチェックツール StyleCopについて

http://stylecop.codeplex.com/

はじめに

http://msdn.microsoft.com/ja-jp/library/vstudio/ff926074.aspx

C#にはMSで使用しているコーディング規約があり、VisualStudioのコード整形のデフォルト動作なんかも、その規約に従って整形するようになっています。

特に問題なければ、こちらに合わせて記述した方がよいのですが、なかなか記述漏れなどを目視でチェックするのは難しいです。

そこで静的解析ツールなるものを使用すると違反をチェックできるのですが、C#の場合はMicrosoftからリリースされています。

それがStyleCopです。

インストール

※StyleCopは Visual Studio 2008、2010、2012 に対応しているツールです。これらの環境がインストールされていることを確認してください。

http://stylecop.codeplex.com/

以上のURLからmsiファイルをダウンロードし、インストールを実行します。

使い方

では、さっそく使ってみましょう。

StyleCopをインストール後、Visual Studioを起動して、C#のプロジェクトを選択してコンテキストメニューを開くとStyleCopの項目が追加されています。



作成されたばかりのWindows Formアプリケーションでさっそく実行してみると…。



おおぉ。いきなり36個も警告が出ています。

英語ベースですのでわかりにくいですが、書いてある内容は簡単なので以下のページを参考にしながら考えていきます。

http://www.stylecop.com/docs/
(なぜかアクセスできないときがある)
http://stylecop.soyuz5.com/StyleCop%20Rules.html
(4.5なのでちょっと古いけど、こちらの方がアクセスできる)


SA1101

フォームデザイナが吐き出すDisposeメソッドで、まず次のように怒られています。


SA1101 : CSharp.Readability : The call to components must begin with the 'this.' prefix to indicate that the item is a member of the class.

メンバーアクセスにはthisプレフィックスをつけなさい。って言われてますね。

最初からつけとけよーーていう突っ込みはさておき、つけてみましょう。



もう一度 Run StyleCopを実行すると、見事消えたのが確認できます。


SA1126

さて次です。


SA1126 : CSharp.Readability : The call to InitializeComponent must begin with the 'this.', 'base.', object.' or 'Form1.' or 'Form.' prefix to indicate the intended method call.

InitializeComponentメソッドのコールにプレフィックスがないから、何かつけなさないって怒られます。

InitializeComponentはForm1のプライベートメソッドの為、thisを付けます。




SA1200

じゃんじゃん行きましょう。


SA1200 : CSharp.Ordering : All using directives must be placed inside of the namespace.

・・・・・・・・・?
using句をnamespaceの中に入れなさい。

・・・・すみません。自分この警告を見るまで、namespaceの中にusingを書ける事すら知りませんでした。^^;

この規約はうち的には無しってことで、警告から除外しましょう。

コンテキストメニューから「StyleCop settings」を選択します。



今回除外したいのはOrderingの SA1200なので、それを探してチェックをOFFにします。




SA1400

まだ、21個も残っています。頑張ります。


SA1400 : CSharp.Maintainability : The class must have an access modifier.

アクセス修飾子をつけなさいって怒られます。

Programクラスなんてアセンブリの外に出る必要がないので、ここではinetrnalを付けておきます。
もちろんクラスによって必要な修飾子は違うので注意です。



Form1.Designerクラス内のpartialクラスでも怒られます。

この場合もう片割れをみるんじゃねーの?と思わんでもないですが、まぁ省略しちゃダメっていうのもわかるのでここは、Form1.cs側でpublicと指定されているのを確認して、同じようにpublic指定します。




SA1507

SA1507 : CSharp.Layout : The code must not contain multiple blank lines in a row.

空行が複数続いているぜ。

…厳しい…が、確かに無駄な空行はコードの見た目を崩す…ということで、ここも直します。


SA1513


SA1513 : CSharp.Layout : Statements or elements wrapped in curly brackets must be followed by a blank line.

これちょっと悩みました。

http://stylecop.soyuz5.com/SA1513.html
を見てもこんな書き方してないし。

よく読みなおすと、}の次にステートメントをを書く場合、改行を入れなさい…ってことで、このように直します。




SA1600


SA1600 : CSharp.Documentation : The class must have a documentation header.

クラスヘッダ書いてないよってことですね。ちゃんとサマリーつけましょう。




SA1601


SA1601 : CSharp.Documentation : The partial class element must have a documentation header containing either a summary tag or a content tag.

partialクラスの場合は、summaryかcontentタグを持ったヘッダが必要ってことで、こちらもsummaryを追加します。




SA1630

SA1630 : CSharp.Documentation : The documentation text within the summary tag does not contain any whitespace between words, indicating that it most likely does not follow a proper grammatical structure
required for documentation text.

要約すると、コメントにスペース含まれてないから文章おかしくないか?ということですが、英語前提なので、これはルールから外します。


同様に、SA1642,SA1643,SA1650も英語のお話なので、ルールから外します。


SA1633

ついに最後になりました。

SA1633 : CSharp.Documentation : The file has no header, the header Xml is invalid, or the header is not located at the top of the file.
ファイルヘッダが無い事ことで、ファイルヘッダを付けますが、ここで注意。

クラスのコメントなどは、ほぼXMLコメントで記載している方が大半だと思いますが、ファイルのヘッダは割と会社毎に独自フォーマットがあるように思われます。

Microsoft的なファイルヘッダは次の形になるようです。
http://stylecop.soyuz5.com/SA1633.html



もしファイルヘッダの記述方法を独自にする場合は、SA1634~SA1649までは無効化します。

変えることが可能な場合は、この際なので、Microsoft形式に合わせておいた方がファイル名の一致などもStyleCopがチェックしてくれるため、便利です。


さいごに

やっときえたーーーーーーー!!!!!!!

この作業、コーディングの最後にまとめて…なんてとてもできません。
こまめに実行して、修正していくことをお勧めします。

では、よいC#ライフを!

0 コメント: