クラス名の命名規則 - あのね、Util なの? Utils じゃないの?

これも宗教論争ネタのひとつかもしれない。ユーティリティクラス名は複数形にすべきかどうか。個人的には、するべきだと思う。だって、utilities だもん。

クラス名に複数形を使うのは邪道だという見方もありますよね。「おまえな、卒業生を表すクラス Alumnus のコンテナは Alumni になるっての? そんなイレギュラーな命名規則、現場じゃ使えねえよ」-- でも、複数形語尾が不規則変化する名詞ってそんな数ありましたっけ? しかも、大体同じ意味を持つ別の単語で複数形語尾が規則変化するものがありますよね。もっというと、業務アプリで使う単語なんてどうせラテン語起源の単語ばかりなので、ほとんどの単語が規則変化します*1。ホントに困るんでしょうか。

いつも念頭においている命名規則を列挙してみました。

  • 形容詞をクラス名につけるときは、そのクラスがドメインで概念として普遍的な意味を持つ場合。もっぱらインターフェイスに使う。 (例: Iterable, IDisposable)
  • 単数形のクラス名をつけるときは、ドメインモデルの構成要素である場合。エンティティクラスとか。
  • 複数形のクラス名をつけるときは
    • あるモデルを複数格納するジェネリックなコンテナである場合。(例: javax.naming.directory.BasicAttributes)
    • スタティックなユーティリティメソッドを格納するクラスの場合。
      • あるモデルにしか関係しないメソッドの集合体の場合は、そのモデルの名前を冠する (例: java.util.Arrays)
      • ほんとに行き場のないメソッドの集まりの場合は Utils とする。

ちなみに、Ethna の作者である藤本さんは「あるモデルを複数格納するジェネリックなコンテナ」には複数形を用いず、「List」を接尾にするのが習慣だそうでした。なんでも昔これではまったことがあるそう (typo したのかな)。で、ふんふん、なるほど、と思ってたんですが、ordinal なコンテナでは -List を付けてもいいものの、そうでないコンテナではそもそも順列が関係ないのでやっぱり -List を付けるのは違和感があるんですよね。うーん。

*1:ラテン語の名詞が規則変化すると言っているわけではない