Java : メソッド名

メソッド名は動詞というネーミングコンベンションは誰が作ったのだろう?
いつも引き合いに出す"サクサクSmalltalk―オブジェクト指向のアートとサイエンス"では、p.166

単に変数にアクセスするためだけのメソッドは、アクセスする変数名に対応して名前が付けられるべきである。たとえば、sizeと呼ばれるインスタンス変数がある場合、その値を返すメソッドはsizeとなり、returnSizeやgetSizeやgiveSizeとはならない。同様に、その値を設定するメソッドはsize:となりsetSize:といったものにはならない。
さらに、メソッド名は命令的にするよりも、宣言的にすべきである。つまり、computeTotalAreaよりもtotalAreaを使う方がよいということである。このようにすると、メソッド名は返り値をより明示的に示すことになる。

とある。
私は、このアイデアに非常に賛同しているのだが、世の風潮はそうではないようだ。
(ところで、JavaのStringクラスのメソッド名を見ると動詞にこだわっていることはないようですが、PreparedStatementクラスを見ると全て動詞になっています。時期的な原因があるのか?)

      • -

ちなみに、Javaでも、言語仕様的には、上のコンベンションは問題なく適用可能だ。以下のクラスはコンパイル可能である。

class Obj {
  int id;
  int id() { return id;}
  void id(int aId) { this.id = aId;}
}
      • -

追記)みずしまさんの突込みを受けて、追記しておきます。
"サクサクSmalltalk―オブジェクト指向のアートとサイエンス"にはもうすこし続きがあって、

  • giveArea より area を
  • convertToSquareMetres より asSquareMetres を

使うべきだということが書かれています。そして、もし本当にconvertという動詞が欲しければ、 convertedToSquareMetres というように「過去分詞」を使うべきだと。
さらに、副作用に興味がある場合だけ、 drawLineFrom:to: というように動詞を使うのがよいとされています。
最後に、総括として、次のように締めくくられています。

最後に、メソッドを命名する場合には、提供するサービスの方法ではなく、サービス自体について考えるべきである。つまり、メソッドに名前を付けるのは実装の後ではなくインターフェースを作成した後ということである。これにより、メソッドの名前が実際の動作を示してしまうことを防ぐことができる。

このダイアリで、同じようなことを、コメントについて議論したことがあったことを思い出します。[id:lethevert:20060113:p2]