トップへ
正誤表はこちら。
.NET のクラスライブラリ開発チームが使用しているガイドラインを詳細に解説し、またそれに対するさまざまな意見(注釈)を載せた『Framework Design Guidelines』の和訳になります。ライブラリを使いこなしたい方、オブジェクト指向のライブラリを作成する機会のある方などにお勧めします。
ご質問、ご意見、ご感想等ありましたら、以下のいずれかでどうぞ。
-
出版元にメールいただく(書籍の最終ページをご覧ください)。
一番フォーマル、安全、確実なのでお勧めします(プライバシーポリシー等もありますし)。エラッタ等もスムースに載ります。
-
twitter の @yfakariya までツイートいただく。
お気軽にやりたい方はどうぞ。
-
私個人までメールいただく(yfakariya{_at_}gmail.com)。
長文でも問題ありませんが、私にメールアドレスがばれます。
また、論評や感想などをブログ等に掲載された方は、ご一報いただけると助かります。さまざまな意見のご紹介として、掲載していきたいと考えています。
関連リンク集
公式
感想・論評など
論評や感想などをブログ等に掲載された方は、メールいただければ幸いです(yfakariya{_at_}gmail.com)。
ガイドラインをより深く理解し、上手に採用していくには賛否両論の議論が不可欠です!
補足
別に私が書き下ろしたものではありませんので、あくまで読み込んだ読者の見解として受け取っていただければ……
どこまでガイドラインを守るべきか
「ガイドライン」というと、絶対守らなければならない戒律のように掲げる方もいらっしゃいますが、
本書では、「DO/DO NET」と「SHOULD/AVOID」で明確にその準拠度合いを分けています。
基本的には、以下のスタンスでとらえるのが良いのではないかと考えています。
-
DO / DO NOT
基本的には守る。ただし、例外はありうる。
イメージとして、破る場合にはちゃんとその理由をドキュメント(保守用、エンドユーザー用)にするようなレベル。
-
SHOULD / AVOID
問題がなければ守る。ただし、設計上、意図的に破ってもかまわない。
イメージとして、破る場合にはコメントを残しておいた方がいいけれども、ドキュメントにするほどのものでもないレベル。
「知らないから守らない」のと「理由があって守らない」では全然違うことですよね。
MSDN のガイドラインとどこが違うのか
大まかな内容は同じです。原著の内容を元にして、MSDN の「クラス ライブラリ開発のデザイン ガイドライン」が記述されているためです。
違いとしては以下のようなものになります。
- 注釈。さまざまな .NET エキスパートたちによる注釈があります。ガイドライン策定の理由、失敗談、反論、補足説明などです。
-
より詳しい説明。基本的な考え方などについて、原著者 2 人の考え方などが述べられています。そして、この部分は .NET 以外でも活用できると思います。
特に、クラス/インターフェイスなどの型システムなどに近いところの多い Java などでは有用ではないでしょうか。
-
全体的にボリュームアップしています。
たとえば、Dispose メソッドを定義したとき、ファイナライザも定義(オーバーライド)しなければならないのでしたっけ?
-
.NET 3.5 対応。
LINQ、拡張メソッド、依存関係プロパティといった内容が追加されています。
一部コードに VB が混ざっている件
付録 C に合わせるために、原著でもわざとそうなっていましたので揃えました。
Interlocked が列挙体で使えない件
Jeffrey Ritcher のコメントですね。本当はサンプルコードを出そうと思ったのですが、「長い」と編集のさんからダメだしを食らったので(笑)、ここに書きます。
enum SampleEnum : long
{
...
}
class Foo
{
private long m_rawSampleEnum;
public SampleEnum SampleEnum
{
get { return (SampleEnum)Interlocked.Read(ref m_rawSampleEnum); }
set { Interlocked.Exchange(ref m_rawSampleEnum, (long)value); }
}
}
ポイントは 2 つです。
-
列挙体の基になる型を使用していること。
結局、Interlocked はプリミティブ型と参照型(これはスタックメモリ上の値としてはポインタサイズになります)のみをサポートします。
なので、基になる型としてフィールドに持つことになります。
-
列挙体の基になる型が int でも uint でもないこと。
.NET Framework は 32 bit か 64 bit で動作します(Mono についてはわかりませんが、だいたい 32 bit と 64 bit だと思います)。
32 bit の値の読み書きは原子的(アトミック)なので、そもそも排他制御が必要ありません。
(ただし、キャッシュメモリの整合性を確保するため、フィールドを volatile にする必要はあります。もちろん、パフォーマンスをそれほど気にしないのであれば、Interlocked を使用してもかまいません)。
short などの場合は、32 bit として操作されると思われます(ランタイムや JIT の実装依存なので、同じように Interlocked しておいた方が確実ですが)
裏話
-
例外のメッセージについて、原著の第 1 版では Jeffrey Ritcher はかなり過激な発言をしていましたが、本書の原著である第 2 版では削除されています。
内容は「プログラマーはエンドユーザーじゃないんだから、例外のメッセージなんてローカライズする必要ないんだよ」というような内容でしたw