tmori3y2のブログ

主にWindowsのプログラムなど

CA1014: Mark assemblies with CLSCompliantAttributeはどんな意味があるか?

(2016/02/13訂正)

(2016/02/25追記)

(2016/03/12追記)

CA1014: Mark assemblies with CLSCompliantAttribute

VS2013などで、Code Analysisを有効にして、Microsoft All Rulesでチェックすると大体必ず出る警告がこれ・・・

「CLS Compliantって何?」

て人も多いと思います。

言語への非依存性、および言語非依存コンポーネント

ざっくり言うと

「.NETはC#だけじゃないから、他の言語でも使用できるかの情報を提供してね」

「共通言語仕様 (Common Language Specification)というのがあるので、出来るだけ準拠すると良いよ」

ってこと。

CLS 準拠コードの記述

どうするかというと、

「基本は準拠とマークして、互換性のないものは準拠していないとマークする」

実際には、Microsoft All Rulesの指摘事項の警告に従って、準拠していない部分をどうするかを決めればよい。

Microsoft All Rulesの指摘事項の警告に従って、アセンブリ/型に準拠のマークを付ける」

「非準拠の型やメンバーは警告が出るので個別にチェックし非準拠のマークを付ける」

「public/protectedメンバーの殆どが非準拠の場合は型全体に非準拠のマークを付ける」

「型の殆どが非準拠の場合はアセンブリに非準拠のマークを付ける」

(2016/02/13修正)

「必要なら非準拠のメンバーの代わりの準拠メンバーを追加する」

(2016/02/25追記)

内容的には、public/protectedのメンバーについてのガイドラインに従っていれば、ほぼ問題ない。

Framework Design Guidelines (英語新版)

Framework デザイン ガイドライン (日本語旧版)

新版/旧版と.NET Coreで内容が違ってる部分があって、ちょっと混乱はしますが・・・

github.com

2016/02/13追記:

ガイドラインでは、新版/旧版で変更があって、.NET Frameworkの実装でも命名規則などでぶれていることがあるが、

「public/protectedのスコープでは、.NETのプログラミング作法として守ってください」

ということが書かれている。

Code AnalysisのMicrosoft All Rulesのチェックでほぼ網羅できるので、ガイドラインに関する指摘は直す努力をしたほうがよい。

これは、ローカルルールより、上位にある概念で、.NETで言語間の相互運用の品質を確保するための概念だから、

Javaと.NETのどちらの作法が優れているか」

という議論は成立するが、

ガイドラインよりJavaの作法が好きだからそっちを採用する」

という議論は成立しないと思う。

勿論、

「privateの規定やメソッド内部のコーディングスタイルは別の話」

なので、その辺の自由度はある。

(当然だが、ライブラリやチームの統一作法のレベルでの自由度で個人レベルじゃないので注意)

例外は、相互運用ラッパーなどの命名規則で、

「基本は、public/protectedの部分は元の命名規則をそのまま持ち込む」

  • ウィンドウメッセージのWM_PAINT
    • 別の名前にしたら、使い方が分かりにくくなるので、教育コストなどを考えたらオリジナルを使ったほうが良い
    • 検索したら以下の情報でヒットするが、プラットフォームに関係なく同じものを扱っていることが分かる
  • Regex
    • 正規表現 (歴史は古く1950年代ぐらいから有るらしい by wikipedia)
    • 別の名前にしたら、使い方が分かりにくくなるので、教育コストなどを考えたらオリジナルを使ったほうが良い
    • 検索したら以下の情報などでヒットするが、プラットフォームに関係なく同じものを扱っていることが分かる
  • IntPtr
    • 32/64bitのサイズも含めて、Win32互換のポインタ型
    • わざとアンマネージC++っぽく命名している
  • Char
    • Unicode Char型
    • わざとアンマネージC++っぽく命名しているが、signed charではなく、char16_t/wchar_t相等

(2016/03/12追記&修正)

いずれにしても、組織や、コミュニティで、独自のコーディング規約を持つところも多いと思うが、VSもPro以上でタダでCode Analysisが使えるようになってきたので、これからは差分だけ規約にして運用する方向に変わってくるはず・・・

指摘を消す努力をしてみると、勉強になることも多いから、一度チャレンジすることをお勧めします。