kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

クラスライブラリ設計のデザインガイド

現在四章まで読み終わりました。今までやってきて疑問に思っていたことが書かれていて、振り返りにとてもいいです。Jeffrey Richterのコメントがらしいというか、なんというか。

.NETのクラスライブラリ設計 (Microsoft.net Development Series)

.NETのクラスライブラリ設計 (Microsoft.net Development Series)

型の設計のガイドラインで、enumで「番兵値を使うな」みたいなことが書かれていました。Windows APIではこんな定義が非常によくあったので、少し意外でしたが、使ってしまうと確かにあとが困るんですよね。上限変更すると、再生成になってしまって(私の周りの業務チームでは再生成が異常なまでに嫌われます)。Windows API程ではないけど互換性維持するために、涙ぐましい努力しなきゃなりません。何度泣いたことか…。
Windows APIの場合は番兵値使うところも構造体内のメンバに限られている…と思うので、構造体のサイズ見て値の挙動を調べたりできるんでしょうけど。
(wingdi.hから引用)

#define DMPAPER_FIRST                DMPAPER_LETTER
#define DMPAPER_LETTER               1  /* Letter 8 1/2 x 11 in               */
(略)
#define DMPAPER_PENV_10_ROTATED     118 /* PRC Envelope #10 Rotated 458 x 324 mm */
(略)
#if (WINVER >= 0x0500)
#define DMPAPER_LAST                DMPAPER_PENV_10_ROTATED
#elif (WINVER >= 0x0400)
#define DMPAPER_LAST                DMPAPER_A3_EXTRA_TRANSVERSE
#else
#define DMPAPER_LAST                DMPAPER_FANFOLD_LGL_GERMAN
#endif

このDMPAPER_LASTが文中で登場する番兵値。OSのアップグレードなどで上限の値が変わったらこの値も変わっちゃうんだから(実際Windows 2000/NT 4.0以降で変わっています)、こんなのをenumに入れちゃだめだよってことだそうです。