うまくクラス名を付けるための参考情報といふ記事を見掛けて、「動詞+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は自然と避けられることになります。
例外的にこのパターンが許されるのは、Iterator
や EventListener
みたいに内部状態がほぼ完全に抽象化され、役割が動詞一つで表せるインターフェースの名前です。