オブジェクトは目的語

オブジェクト指向プログラミング言語ではメソッドを呼び出したいとき、

<インスタンス名>.<メソッド名>

インスタンスを示す変数の名前のあとに、そのオブジェクトに属するメソッドの名前を示します。このプログラミング言語の構文は、誤解も招く良くない構文であったと思います。 <インスタンス名>.<メソッド名> の構文は英語の SV 文型を連想させるので、インスタンスが主語でメソッドが動詞であると勘違いしてしまいます。

しかし、実際にはオブジェクトを目的語とした方が自然な――人間に優しい――プログラムとなるように思います。 Java の標準ライブラリを見ても、オブジェクトが目的語となっているものが多いです。例えば Callable インターフェイスは call() メソッドを持ちます。 "callableObject.call();" とプログラム上は書きますが、英語で書くと "call the callable-object." を意味していると考えるのが自然です。他にも、 String 型の split メソッドも説明に "Splits this string around matches of the given regular expression." と書かれています。プログラミング言語では文は目的語の次に動詞が来るような形になります。主語が明らかではないかと思われるのですが、これは自明でメソッドの呼び出し元です (プログラムを書く人でも計算機でもいいですが)。

オブジェクトが主語になってしまうプログラムはあまり良いプログラムとはいえません。例えば、FooManager のような名前のクラスを作って、 "manager.doSomething();" と書くこともできるのですが、別にこれなら static メソッドで記述すれば十分なわけでクラスにする意味がありません。そもそもクラスとはあくまでデータ構造であって、そのデータに対する操作がメソッドです。操作の対象とはつまり目的語のことです。

プログラミング言語は決して英語ではないのですが、英語らしいプログラムが正しいプログラムだとしばしば思われているように思います。 というより私がそのような勘違いをしていました。 <インスタンス名>.<メソッド名> の構文は、そのような考えを持っていたときに、適切でない設計を招いてしまいます。これはプログラミング言語の欠陥だと思います。

例外は真偽値を返すメソッドです。Java の String 型だと、 contains() や isEmpty() が挙げられます。 "string.contains(sequence)" だとか "string.isEmpty()" という形で使われ、これらの文はオブジェクトが主語となった命題として振る舞います。オブジェクトが目的語となる場合の文は命令であり、オブジェクトが主語となる場合の文は命題です。既存のプログラム言語は、命令と命題が区別がなく、この点も良くないと思っています。

参考