LoginSignup
40
36

More than 5 years have passed since last update.

可変文字列クラスを MutableString と命名すべき理由

Posted at

うまくクラス名を付けるための参考情報といふ記事を見掛けて、「動詞+er」のパターンがちょっと多くていまいちだなーとか思って書いた記事です。

以前クラスの命名のアンチパターンといふ記事を書きましたが、これを読んで「Animation と Animator とではどっちがええんやろ?」と思った人への回答でもあります。


昔の Java では可変文字列クラスは StringBuffer と呼ばれてゐました。C# や最近の Java では可変文字列クラスは StringBuilder と呼ばれます。Objective-C では MutableString です1

私はこの中では MutableString が最も良いと思ってゐます。次点は StringBuffer です。 StringBuilder はダメです。

MutableString が良い理由は、完全にその名が体を表してゐるからです。直訳するとまさに「可変文字列」ですね。MutableString クラスにはそのインスタンスを可変文字列として扱ふためのメソッド (後述) が揃ってゐます。

StringBuffer もそこそこ良いですが、こちらは Buffer の意味がやや曖昧です。ファイルストリームの読み書きを高速化するための一時記憶領域と関係があるのかとか一瞬勘違ひしてしまひます。

StringBuilder がダメなのは、用途を限定しすぎてゐるからです。StringBuilder といふ名前を聞くと、それが単に不変文字列を生成するための道具にすぎない印象を与へます。もし StringBuilder が、buildString といふ名前のパブリックメソッドただ一つを持つインターフェースだったなら、その名前もアリだと思ひます。しかし実際の StringBuilder は、文字列の n 番目の文字を調べたり、一部を書き換へたり、別の文字列を連結したりするためのメソッドも持ってゐます。このクラスのインスタンスの中には変更可能な文字の配列といふ内部状態が隠されてゐて2、それに様々な形でアクセスするためのメソッドがあるわけです。これは明らかに build(er) といふ一つの動詞(っぽい名詞)で表される概念を越えてゐます。要するに、全体としてこのクラスは可変文字列 (mutable string) なのです。


一般に、オブジェクトは何らかの内部状態を持ってゐて、メソッドが呼ばれることによってその状態を変化させます。状態がどう変化するかといふ動詞の部分はメソッド名によって表されるので、クラス名は状態が何であるのかといふ名詞の部分を表すことの方に注力すべきです。すると、builder などの「動詞+er」のパターン3は自然と避けられることになります。

例外的にこのパターンが許されるのは、IteratorEventListener みたいに内部状態がほぼ完全に抽象化され、役割が動詞一つで表せるインターフェースの名前です。


  1. NS とかいふ接頭辞は省略しました。 

  2. 実際にそれが配列によって実装されてゐるのかはさておき 

  3. このパターンの名詞を agent noun と言ひます。 

40
36
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
36