[SML 7213] Re: メソッド名について

Koji Yokokawa koubo2006 @ yengawa.jpn.org
2006年 10月 6日 (金) 20:14:17 JST


横川です。

例にしたプログラムをメソッドとして定義するべきかどうかは別にして、メソッ
ド名をどうつけたらいいのか?という疑問はだれでも持つものだと思います。
それに、メソッド名の重要性に気づいてMLへ広く問いかける時点でそうとう
プログラミングのセンスが良いと感じました。

ぼくもメソッドやクラスの命名にいつも苦労しているので、数年の職業
Smalltalkerとしての経験から得た具体的なやり方を紹介します。

まず一番重要なのは、

「既存のライブラリ内で意味の似ているメソッドを参考にする」

既存ライブラリを調べて、うまい具合に意味の似たメソッドが見つかればそれを
参考にして似た名前をつけます。こうすると、他の人がそのメソッドの意味を既
存のメソッドから推測できるのでより理解しやすくなります。
今回の場合「ブラウズするためのプログラム」という意味に近いメソッドを探し
てみてはどうでしょうか。

でも、これはライブラリをある程度読み込まないと見つけられません。だから、
初心者は変な名前をつけてしまうのは仕方なくて、よく知れば知るほどうまい名
前をつけられるようになります。上達するにはライブラリをよく読むしかありま
せん。これはどんな言語でも(自然言語も)同じだと思います。

しかし、Smalltalkのような動的に型を決定する言語だと、意味が似ているから
といってまったく同じ名前をつけることには危険があります。

「既存のライブラリ内で使われているメソッド名は(特別なとき意外は)使わない」

たとえばあるOrderedCollectionインスタンスに値を入れるだけだからといって
「at:」をうっかりそのまま使ってしまうと、あとで「そのクラスのat:」を呼び
出しているところをsendersで探そうとしても膨大な数の「他のクラスのat:」の
マッチに埋もれて見つけられなくなります。
(ぼくはこの現象を「多態性洋(た・たいせいよう)に沈む」と呼んでいます;-)

まったく同じメソッド名をつけても良い「特別なとき」とは多態性が成立すると
きです。(詳しくは「リスコフの置換原則」を参照)
この意味でも「includes:」を使うのは避けたほうが良いです。

そして、意味の似ているメソッドが見つからないときは、次のように新しく命名
します。

「クラス名を主語、メソッド名を述語みたいに発音して英語っぽくする」

ご存知の通り、Smalltalkはオブジェクトへのメッセージ送信によって処理を進
めるという計算モデルを基本にしています。それにあわせるために、なるべく主
語・述語のような形にします。そして、そのように読んだときにメソッドの意味
が伝わるかどうかチェックします。

これはクラス名の命名にも関わります。「includes:」がなぜ「include:」では
ないのか?という疑問への答えでもあります。でも、Smaltalkは文法的な制約で
完全な英語にはならないので、なんとなく英語っぽく聞こえるだけでOK(既存ラ
イブラリも英語として変なのがほとんどです)。

A MethodSearchBlock includes these selectors.

の日本語訳はどうなるか? などと試してみてください。クラス名も直したくなっ
てなってくるかもしれません。

それでも、よさそうな名前がどうしても思いつかないよ!というときはたくさん
あります。そんなときは腹をくくって最終手段です。

「良い名前が思いつかないときは思い切って変な名前をつけてしまう」

MethodSearchBlock class>>findImplementersFromAllClassesAndBrowseThem:
なんてふうにだらだら書いてしまうのはすごく「変な名前」だし、読むとやるこ
とがわかるのでおすすめw
includesXXX: もこのまま使えばじゅうぶん変なので、最終手段としてつけるな
らOKなのです。

上記のような命名の苦労をしたあげくに変な名前をつけてしまうことは、実は、
とても大切です。こうすると変な名前はいつまでも気になってしまうので、次の
もっとも重要な作業をやりやすくします。

「より良い名前を思いついたときには躊躇せずにリファクタリングする」


以上、参考になれば幸いです。


On Tue, 03 Oct 2006 19:43:32 +0900
NOBUTAKA Terauchi <europa @ ps.inforyoma.or.jp> wrote:

> クラスは、
> Object
>      MethodSearchBlock
> として定義しました。
> インスタンス変数などは定義していません。
> 
> 1. 「複数のメッセージセレクタを一気にブラウズするためのプログラム」を
>    クラスメソッド includes: messageSelectors として定義しました。
> 
> 2.  次に、「あるメッセージカテゴリに定義されているメソッドを検索するプロ
>     グラム」を定義しようとしました。ただ、最後にメソッドを列挙するという
>     機能は同じなので includes: messageCategories にするとメソッド名が重
>     複してしまいます。
>     そこで、includesCategory: messageCategories として定義しました。
> 
> この場合、1.のメソッド名も includesXXX としたほうが分かりやすいように思
> えてきました。
> ただ、XXXの部分が思いつきません。システム全体を検索しているのでAllClass
> とするほうが良いのでしょうか?
> それとも、クラスを分けた方が良いのでしょうか?


-- !
Koji Yokokawa <koubo2006 @ yengawa.jpn.org>
    http://yengawa.com/
    ^self new!




SML メーリングリストの案内