ものがたり(旧)

atsushieno.hatenablog.com に続く

ソースコードのversioningとwarningの上手なつきあい方

なかなか悩みどころです。

もし同じソースがバージョン1からバージョン6までで共有されているとして、↓みたいなディレクティブをもつソースがあるとします。


#if VERSION_2
#if VERSION_3
#if VERSION_4
#if VERSION_5
#if VERSION_6
このとき、それぞれのバージョンでしか使用されないフィールドがあったりすると、cscはwarningメッセージを出力するわけです。たとえばこんな感じ:

System.Xml\XmlTextWriter.cs(86,8): warning CS0649: Field 'System.Xml.XmlTextWriter.checkCharacters' is never assigned to, and will always have its default value false

で、ここに今うるさい開発者なり管理者なりがいて、「warningは全て消すべきだ」と言ったとします。どうすればいいでしょうか。

それぞれのバージョンごとにフィールドを並べて


#if VERSION_2
int foo; // version2でしか使わない
#endif
こんな感じで書いていきます? バージョン6まで。これは読みにくいと思います。

じゃあ、partial typesを使えば解決でしょうか? partial typesは、バージョン毎に機能追加するだけのソースを管理する場合には、有効かもしれません。でも、ソースは追いにくいと思います。特にあっち行ったりこっち行ったりがある場合は。そもそもプロジェクトによっては使わない方針を立てているかもしれません(たとえばmcsは基本的に使いません)。

ていうかそんな寿命の長いプロジェクトは存在しないだろう? うーんそうかもしれません。

そんなわけで、個人的には /nowarn:649 とか使ってごまかしたいところなんですが、これは何も分かっていない管理者を黙らせるのでもない限り何の解決にもなってないんですよねー。困ったものです。


とりあえずprivate methodsにまでnot in useのチェックをかけようっていうMarekの設計はイケてないと僕は確信しているし(いや彼は非常に熱心で細かいところにも気がつく優秀な人なんだけど)、cscとは違うぜって書いているのを見た時点でどうせ問題があるだろうと思ったから、そう言う話はキッチリとおもてでケリをつけるべきだと思って「おもてに投げてよ」と書いたのだけど、なぜか最近は、argurableなfixについてパブリックなMLを回避して個別の開発者に送るような風潮があって、僕は非常によろしくないなあと思っている。オープンソースってそういうものですかねえ。

どうも最近そういうのばかりなのだ。やれXmlTextWriterにxmlns="..."を出力させるときはprefixを"xmlns"にしてlocalNameを""にしろだとか、XmlEntityReferenceのChildNodesはInsertBefore()やAppendChild()の時にはfillしないようにしろだとか、問題のあるパッチは個人宛に送られて、おかげで僕が何に時間を食わされているのか、周りじゃ全く分かりもしない。別に変なパッチを作ること自体は問題じゃないんだけど、パブリックなMLを避ける正当な理由が僕には分からない。一部の人はちゃんと言えば分かってくれるんだけど。