はじめに
すみません。ごめんなさい。
別に間違ってるわけじゃないです。「モノ」でもいいと思います。
ただ、「『オブジェクト指向』って何?」っていう状態の人に、「全てを『モノ』と考える」とか言ったら余計混乱するだろうなーと思ってます。皆さんそうですよね。
TL;DR
オブジェクト指向では、操作対象を重視する。
手続き型プログラムでは、操作対象はコマンドの引数とされる。目的語の扱い。
オブジェクト指向プログラムでは、操作対象が文の先頭にくる。主語の扱い。
「オブジェクト指向」とは
「オブジェクト指向」は、「object-oriented」の日本語訳です。
「oriented」が「指向」と訳されているわけですが、名詞ではなく本来は形容詞です。
また、「指向」という単語も意味がよく分からないので、別の訳語「○○を重視する」をあてましょう。
「オブジェクト指向」が意味するのは、「オブジェクト重視の○○」ということですね1。
では、「オブジェクト」とはいったい何なのでしょうか。
SVO文型
SVO文型(主語+動詞+目的語)を覚えていますか。英文法の第3文型です。
SVO文型の単純な例を挙げましょう。
I closed the window.
The program deletes the file.
これらの文は以下となります。
S (主語) | V (動詞) | O (目的語) |
---|---|---|
I | closed | the window |
The program | deletes | the temporary file |
さて、なぜ唐突にSVO文型の話を持ち出したかお分かりでしょうか。
SVO文型が「オブジェクト指向」に何の関係があるのでしょう。
察しの良い方はお気づきでしょう。SVOとは以下の英単語の頭文字です。
日 | 英 |
---|---|
主語 | Subject |
動詞 | Verb |
目的語 | Object |
そうです。ここにObjectが登場します。
そして、このObjectこそ、「オブジェクト指向」のオブジェクトなのです。
手続き型プログラムにおける引数と、SVO文型の目的語
オブジェクト指向プログラムとよく対比される概念として、手続き型プログラムがあります。
一般的に、手続き型プログラムは以下のような文法です。
関数名 引数
ここで、「関数名」は「命令」、「引数」は「操作対象」と言い換えることもできます。
では、手続き型プログラムの擬似コードを挙げてみましょう。前掲の英文をベースとします。
CLOSE a_window
'↑命令
' ↑操作対象
DELETE tmp_file
'↑命令
' ↑操作対象
このとおり、手続き型プログラムにおいて、「関数名」はSVO文型のV(動詞)に、「引数」はO(目的語)に相当するのです2。
ここ、大事なので表にしておきます。
SVO文型 | 手続き型プログラムでは… |
---|---|
主語(Subject) | - |
動詞(Verb) | 関数名(命令) |
目的語(Object) | 引数(操作対象) |
再考、「オブジェクト指向」とは
最初に「オブジェクト指向」とは「オブジェクト重視の○○」という意味だと述べました。
そして、「オブジェクト」とはSVO文型におけるO(目的語)であり、目的語は手続き型プログラムでは引数となると説明しました。
- オブジェクトとは → SVO文型におけるO(目的語)
- 目的語は → 手続き型プログラムでは引数(操作対象)となる
つまり、「オブジェクト指向プログラム」とは「操作対象を重視するプログラム」ということですね。
では、先ほどの擬似コードを、操作対象を重視したコードに書き換えてみましょう。
重視しているわけですから、文の先頭に持ってきてみます3。いわば主語の扱いです。
a_window.close();
tmp_file.delete();
どうでしょうか。ぐっと「オブジェクト指向」らしいコードになったことがお分かり頂けるのではないでしょうか。
親しみやすいように文法をJavaっぽく変更しましたが、使用している単語は手続き型の擬似コードと同じです。
というわけで、もう一度。
「オブジェクト指向プログラム」とは「操作対象を重視するプログラム」です。
SVO文型 | 手続き型プログラムでは… | オブジェクト指向プログラムでは… |
---|---|---|
主語(Subject) | - | 操作対象 |
動詞(Verb) | 関数名(命令) | メソッド |
目的語(Object) | 引数(操作対象) | - |
補足1 「目的語」という言葉について
日本語の「目的語」のことを「対象語」と呼ぶことがあるそうです。
また、文法用語の「Object」(SVO文型のO)を「目的語」としたのは誤訳だという議論もあるようです。
学生時代「目的語」という言葉にいまいちピンときていなかった私としては、「対象語」のほうが確かに分かりやすいと思います。
補足2 自動詞と他動詞
自動詞と他動詞を覚えていますか。
- 自動詞とは、動作が主語のみで完結する動詞で目的語は不要
- 他動詞とは、動作が主語以外に影響する動詞で目的語が必要
下記の例のように、日本語では自動詞と他動詞とでは形が異なります。
逆に、英語では自動詞も他動詞も同じ形なので文型で見分ける必要があります。
目的語の要否 | 文例 | |
---|---|---|
自動詞 | 目的語は不要 | 窓が閉まる, ファイルが消える |
他動詞 | 目的語が必要 | 窓を閉める, ファイルを消す |
一般的に、手続き型プログラムの関数は他動詞(主語は省略、目的語は引数)、オブジェクト指向プログラムのメソッドは自動詞(主語が操作対象)とみなすことができます。
具体的な例を挙げましょう。
JavaScriptでWindow
を移動するにはmoveTo
というメソッドを使用します。
このメソッド名は、前置詞(to)を含めることで"move"が自動詞であることを示唆し、移動するのは自分自身であることを明確にする意図があるものと考えられます。
a_window.moveTo(0, 0); // a_window自身が移動する
GUIとオブジェクト指向
一般的に、GUIはオブジェクト指向なUIと考えられます。
比較のために、まずはCUIでのファイル削除方法を見てみましょう。
rm tmpFile
del tmpFile
rmやdelというファイル削除の「命令」を先に入力し、その後ろに「操作対象」のファイルを引数として指定しています。
次に、以下の画像をご覧ください。
JavaのIDEでFileオブジェクトのメソッド候補が出ている状態と、OSのファイルのコンテキストメニューを並べてみました。これらが類似していることがお分かり頂けるでしょうか。
ポイントは「操作対象」が「命令」より先に決まっているというところです。
「操作対象」を先に決めることでや、IDEやOSがその「操作対象」に対して実行可能な「命令」を候補やメニューとして提示できるわけです。
おわりに
マサカリ必至のネタなので、このカレンダーにのっからせて頂きます。
Qiita新参者の私ですが、ご指導ご鞭撻のほど宜しくお願いいたします。