読者です 読者をやめる 読者になる 読者になる

Fragments of Works

仕事で便利!と思ったことや、もろもろの忘備録。さて。さてさてさて。

あいまいな知識で、あいまいな推測:メソッドのオーバーロード?

jQueryの基礎をやっていて、へぇ!って思ったこと。

$('#hoge').text('テキスト変えてちょんまげ');//idがhogeである要素の中身のテキストが変更される
$('#hoge').text();//idがhogeである要素の中身のテキストを取得する

って感じで()の中の引数次第で、メソッドの挙動(という言い方でいいのかわからないけれど)が変化しちゃうところ。文字列が入っているとその文字列をぶっこむけど、空だと今入っているやつを持ってくる。これっておもしろいなーと。メソッド名が一緒なのに機能が違うって。

こういうパターンってプログラム言語で一般的なの?なの?っていう質問をしたら「メソッドのオーバーロード」で検索せよ、と教えてもらった。

多重定義
http://ja.wikipedia.org/wiki/%E5%A4%9A%E9%87%8D%E5%AE%9A%E7%BE%A9

同一のメソッド名で引数の数やら型やら順序が異なるものを複数定義できまっせ、ってことらしいけど、引き合いに出されるのがJava……。しかも例をみると、同一のメソッド名なので、やっぱり基本的機能は同じ気がする。

んでもって気になるのが、この記述。

曖昧な型を持つ言語
PerlPHPのような曖昧な型を持つ言語では、メソッドのオーバーロードができない、あるいは制限されていることがある。そのときはメソッドの先頭で引数の型を判定する条件分岐で対応する。

jQueryJavaScriptなので、実は「メソッドのオーバーロード」とかできないやつなんじゃないんだろうか。JavaScriptばりばりの方に聞いたときも、仕組み的には条件分岐なんですよー、textも引数の型がstringsかどうかで分岐させてるとか。

function text(strings) {} とかのときに text() とすると strings が false になるので

if ( !strings ) {
// 値取得
} else {

みたいな
実際こうなってるわけじゃないですけど、仕組み的には

たぶん、JavaScriptはメソッドのオーバーロードはできない子、だと思う。

……と思ったら、jQueryを作ったJohn様がこんなの書いてた。

JavaScript Method Overloading
http://ejohn.org/blog/javascript-method-overloading/

日本語で解説している人もいた。

JavaScript のオーバーロード
http://blog.nao-haida.com/2007/11/javascript_26.html

この例でいくと「ユーザー検索」っていう基本機能は一緒なんだけど、

  • 引数がなし()→すべてのユーザーを検索
  • 引数がひとつ(name)→ユーザーを名で検索
  • 引数がふたつ(first, last)→ユーザーを名と姓で検索
  • どれにもあてまらない→なんもしない

「引数の数」をキーにして、複数の「ユーザー検索」メソッドを定義している。でもユーザー検索っていう基本機能は同じなんですよ、引数の数は違うけど、同一のメソッド名なので。

jQueryは直感的なわかりやすさを目指している(と聞いた)ので、別に同一のメソッド名で違うこと(内容を変更/内容を取得)しても、人間がぱっと見、理解できてりゃいいじゃん!という割り切りなのかなあ。

それともある観点からみると、内容を変更も内容を取得も同一の機能と言えるのかなあ。

ほとんど「jQueryの基礎を学ぶ」からは、はるか遠く逸脱した感があるけど、気になったのでメモしておきまーす。