ラベル StyleCop の投稿を表示しています。 すべての投稿を表示
ラベル StyleCop の投稿を表示しています。 すべての投稿を表示

2013年6月22日土曜日

個人的に無効にしたいFxCopとStyleCopのルール

多人数で開発する場合に特に有効と考えられるFxCopとStyleCopですが、個人的にはどうしても無効にしたいルールがいくつかあります。そこら辺を簡単に。

FxCop


FxCopでは、受け入れがたいものはあまり多くありません。でもプロジェクトの内容によりますが、以下は無効にすることが多いです。
Globalizationの2つについては、いずれも文字列の操作時なんかに余計なパラメータをセットすることを要求されます。これらはかなり細かい国際化をする場合じゃなければ必要になりませんし、必要無ければコードを汚しているようにしか感じられません。どうしても必要になったときにONにすればよいでしょ。

Designの2つについて、まずアセンブリの厳密名については、.net 1.x の頃ならともかく、GACに登録するようなものでなければ、厳密名は必要ないと個人的には認識しています。

また、CA1020は「アセンブリ内に同じ名前空間内にクラスやenum等の『型』を5つ以上含めるべき。」という内容ですが、使う側からすると、Usingをたくさん指定しなくちゃいけなくなって厄介なのはわかりますが、名前空間のUsing指定で拡張メソッドのON/OFFをしたりするので、名前空間の分割と統合は、型の数で制限すべきではないんじゃないかなぁ。ってことでOFFに。

StyleCop


StyleCopのほうは好みが出そう。ただ、あんまり無効にしちゃうと統一性が失われて意味がなくなっちゃうので、最低限に抑えておきたい。

デフォルト状態から、以下の項目をOFFにしています。
DocumentationRulesは、コードコメントの書き方のルール。さらにその中でも、ここで挙げたものは英語でコメントするときの問題で、日本語では関係ない(というか、無理)のでOFFにします。

OrderingRulesは記述の順番に関係するもの。ただ、SA1200は「名前空間の中でUsingを使え。」と言っています。つまり、こう書けと。
namespace Xxx.Yyy.Zzz
{
  using System;
  using System.Collections.Generic;
  using System.Linq;

  public class TheClass
  {
  }
}

はい?はじめて聞きました。こんなの。VisualStudioが吐き出すコードもこうなってないので、これは却下。

LayoutRulesのSA1503は、「中かっこは省略可能でも省略するな。」と言っています。つまり、こう書いちゃだめってこと。
if (condition())
    return false;

うーん。よく言われます。でもねぇ、コードが無意味に縦に伸びるの嫌なんですよ。インデントはされるわけですし、これは勘弁していただきたい。駄目かな?

SA1402は「一つのファイルには一つのクラスのみ含めよ。」と言っています。これもよく言われます。が、たとえばpublicなクラスでも、あるクラスにのみ依存するクラスってありますよね?大概は非常にちっさなクラス。この手のクラスにひとつひとつファイルを作っていると、ファイル数が多くなりすぎて却って参照性が悪くなると思うんです。…やっぱ駄目っすか?


それぞれ無効化しておきたいのはこれっくらいですねぇ。そのほかはMicrosoftさんのルールに従えるなー、というのが個人的な感想です。まぁ、これまでずっと、勉強するときのサンプルコードとかで散々Microsoftの書き方を見て、なんとなくでもわかりやすいと思って真似をしていた部分はあるんだと思います。多分、そのせい。

あー、もちろん、これ以外にその時々で「そんなの従えない!」ってことはあります。その場合は「SuppressMessage」属性をセットします。ちゃんと理由(Justification)を付けて。プロジェクトならできればコードレビューもしましょう。

2013年6月19日水曜日

FxCopとStyleCop まとめ

「ADO.netのDataSetをLINQableに書くために (前段)」で書きましたが、「コンパイル(等)のタイミングで、指定したルールに適合していない場合はエラーや警告を出す」、コードの静的解析ツールとして、「FxCop」と「StyleCop」があります。

それぞれよく似た機能を持っているので混同されがちですが、何をしたいかによってどちらを選択するか、あるいは両方使うかが変わってくると思います。

なので、まずはそれぞれどのような特徴を持つのかをまとめてみました。

FxCopStyleCop
目的アセンブリが「クラスライブラリのデザインガイドライン」に適合し、利用者から見てAPIに一貫性と使いやすさが備わっているかを分析する。ソースコードが一定のルールに基づいて、統一的な記述がなされているかを分析する。(空白や改行の入れ方、括弧の位置、記述の順番など)
分析対象アセンブリ(IL:中間言語)C# ソースコード
VisualStudioバンドルPremium/Ultimateなし
VisualStudio統合Premium/Ultimateはビルド統合済み。
Standardは別途ツールをインストールすることで呼び出し可能になる。
Expressでは基本的にFxCopを単体で稼働させる。
Standard以上で可能。ただし、すべてのエディションでcsprojファイルの編集により、ビルドプロセス統合は可能。
カスタムルールの作成可能可能

つまるところ、FxCopは「ほかのアセンブリから呼び出されるアセンブリが、使いやすいものになっているか」どうかを分析し、使いにくいと思われる部分を警告を出して修正を促します。FxCopに怒られたところを直すと、確かに使いやすくなっているような気がします。

それに対してStyleCopは、「C#ソースコードが個々人によって差異が発生しないようにする」ために分析し、統一ルールからはみ出た表記には警告を出して修正を促します。

また、FxCopはアセンブリを対象に分析するため、言語はC#でもVB.netでもその他でもなんでもイケますが、StyleCopはソースコードが対象であり、C#に限定される。という違いもあります。

使ってみた印象としては、C#を使うプロジェクトで、それなりの人数が参加する場合はStyleCopを最初から適用する。さらに、いろんなところから参照されるアセンブリ(共通ロジックなど)はFxCopも適用する。というのがよろしいんではないかなー。と思っております。

ちなみに、ある程度開発が進んだ途中から、これらの静的解析を適用するのは、手間が大きすぎるので、可能な限り開発の着手前に決めておくべきでしょう。

なお、表には記載していませんが、StyleCopはオープンソース(Microsoft Public License:Ms-PL)に対して、FxCopはWindows SDKの一部であり、ソースは公開されていないという違いもあります。

それぞれ、インストール方法や使い方などについてはググってみてください。結構たくさん参考になるサイトが出てきます。

FxCopとStyleCop。もう少し続けます。