C#の好きでない命名規則

GetEnumerator()の話が出てきたついでに、C#の好きでない命名規則について書いておこうと思います。

これもすごく好き嫌いの問題とは思いますが、ファクトリクラスにおいて、Java などである

  • 常に同じインスタンスを返すようなパターンでは getInstance() (専用ファクトリ*1の場合) あるいは getXXX() (複数の種類のクラスを取り扱うファクトリの場合) というメソッド名にする。
  • 呼び出しの度に新しいインスタンスを生成して返すようなパターンでは createInstance() あるいは createXXX() というメソッド名にする。

という暗黙の約束を気に入っていたのですが*2C# では GetXXX() という名称が好まれているようです。

C# は getter があるので C# の中だけでは混乱することはないのかもしれませんが、これは言語というよりセマンティクスに拠る命名規則なので、踏襲してほしかったなと思う次第。

*1:単一の型のオブジェクトしか生成しないファクトリという意味

*2:Java Standard API では、残念ながらこれらの統一がなされていません。ルールに合致しない例: javax.crypto.Cipherなど