Rubyのメソッド名がなんだかおかしい話

さて、Rubyですが、ある機会に標準ライブラリの名前を一通り見直してみました。

そうして全体を見てみて気づいたのですが…、Rubyの標準ライブラリって"変"な名前のメソッドがたくさん存在しているのですね。

不満に対して吐き出す意味でも、自分の思考を整理する意味でも、丁度良い機会なので記事にさせて頂きましょう。

 

 

1.単語の語順がなんだかおかしい

Rubyはスネークケースでメソッドに複数の単語を繋ぎますが、動詞、前置詞、名詞の語順が全く不統一なんですよね。

例えばよく使われるメソッドとしてModule#desine_methodがありますが、これの属しているModuleクラスのメソッドは例外が数多く存在しています。定数を管理するModule#const_getとModule#const_setなどがその例です。動詞が末尾に移動していますね。

Module#class_variable_get、Object#instance_variable_getなど実質ゲッターやセッターとして振舞っているメソッドが、その語順になっているのですが、次のメソッドの並びを見て違和感がある閾値を超えました。

Module#class_variable_get : クラス変数の値を得る。
Module#class_variable_set : クラス変数を設定する。
Module#remove_class_variable : クラス変数の削除。

removeだけはいきなり語順が変わる。何故なんでしょうね。

 

 

2.過去形がおかしい

Rubyは過去形でメソッド名を付けているものがあります。

例えばFile#closed?メソッドがその例です。ファイルは一度開いて閉じ終わった事を確認するのでその意味は分かりますが、そもそも英語の場合過去形で表現したものは日本語と違って今でも継続しているであろうというニュアンスは持っていません。

例えば、車を買ったと言っても今でも持っているであろうとニュアンスは持っていないです。

そのうえ、Module#autoload?メソッドは過去形でなかったり、その差は何処から来ているのか示されていない状態です。…なんなのでしょうね。

 

 

3.返り値の型がおかしい

Rubyは慣習として末尾に?を付けるメソッドは、真偽値を返すようにしています。

…がこれがRuby本体の中ですら意外に徹底されていない!?

先ほど出したModule#autoload?メソッドがその一例。

マニュアルを見てみるとこう書かれています。

autoload 定数がまだ定義されてない(ロードされていない) ときにそのパス名を返します。 また、ロード済みなら nil を返します。

他にもファイル関連のFile#world_readable?File#size?などのメソッド、あとはdefined?文もBooleanに見えて違うクラスを返す様になっています。

Rubyはその手触りの良さから広く普及しましたが、重箱の隅をつついてみると、最初によく考えないで作ったメソッドが仕様変更の機会無く澱のようにヘドロの様に積み重なっているライブラリ群が見え隠れしています。

Ruby自体は後方互換を大事にしている言語ですが一度冷静になって丁寧に不要となっている機能を整理整頓することを考えても良いのかもしれません。

Kernel#iterator?File#exists?など、廃止候補を明言しているメソッドも実際存在していますしね。

Published on 05/27/2017 at 17:11 under .

If you liked this article you can add me to Twitter

コメントは許可されていません