やはり「オブジェクト指向」のオブジェクトを「モノ」とかって訳すのは間違っている。

# はじめに
すみません。ごめんなさい。
別に間違ってるわけじゃないです。「モノ」でもいいと思います。
ただ、「『オブジェクト指向』って何?」っていう状態の人に、「全てを『モノ』と考える」とか言ったら余計混乱するだろうなーと思ってます。皆さんそうですよね。


# TL;DR
オブジェクト指向では、**操作対象**を重視する。
手続き型プログラムでは、**操作対象**はコマンドの引数とされる。**目的語**の扱い。
オブジェクト指向プログラムでは、**操作対象**が文の先頭にくる。**主語**の扱い。


# 「オブジェクト指向」とは
「オブジェクト指向」は、「object-oriented」の日本語訳です。
「oriented」が「指向」と訳されているわけですが、名詞ではなく本来は形容詞です。
また、「指向」という単語も意味がよく分からないので、別の訳語「○○を重視する」をあてましょう。
「オブジェクト指向」が意味するのは、「オブジェクト重視の○○」ということですね[^oo-note]。

[^oo-note]: ○○には、「言語」や「プログラミング」、「設計」などが入ります

では、「オブジェクト」とはいったい何なのでしょうか。

# SVO文型
SVO文型(主語＋動詞＋目的語)を覚えていますか。英文法の第3文型です。
SVO文型の単純な例を挙げましょう。

```:第3文型の例1
I closed the window.
```

```:第3文型の例2
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文型の目的語
オブジェクト指向プログラムとよく対比される概念として、手続き型プログラムがあります。
一般的に、手続き型プログラムは以下のような文法です。

```:手続き型プログラムの文法
関数名 引数
```
ここで、「関数名」は「命令」、「引数」は「操作対象」と言い換えることもできます。
では、手続き型プログラムの擬似コードを挙げてみましょう。前掲の英文をベースとします。

```basic:手続き型プログラムの擬似コード１
CLOSE a_window
'↑命令
'      ↑操作対象
```
```basic:手続き型プログラムの擬似コード２
DELETE tmp_file
'↑命令
'       ↑操作対象
```

このとおり、手続き型プログラムにおいて、「関数名」はSVO文型のV(動詞)に、「引数」はO(目的語)に相当するのです[^svo-note]。

ここ、大事なので表にしておきます。

|SVO文型 |手続き型プログラムでは… |
|------|-------------|
|主語(Subject)   |-           |
|動詞(Verb)   |関数名(命令)  |
|目的語(Object) |引数(操作対象) |

[^svo-note]: 「主語(S)」が省略されているので、命令文として読むことができますね


# 再考、「オブジェクト指向」とは
最初に「オブジェクト指向」とは「オブジェクト重視の○○」という意味だと述べました。
そして、「オブジェクト」とはSVO文型におけるO(目的語)であり、目的語は手続き型プログラムでは引数となると説明しました。

- オブジェクトとは → SVO文型におけるO(目的語)
    - 目的語は → 手続き型プログラムでは引数(操作対象)となる

つまり、「**オブジェクト指向**プログラム」とは「**操作対象を重視する**プログラム」ということですね。

では、先ほどの擬似コードを、**操作対象を重視した**コードに書き換えてみましょう。
重視しているわけですから、文の先頭に持ってきてみます[^ori-note]。いわば主語の扱いです。

[^ori-note]: orientの"ori-"には「始まる」という意味があるそうです。originも同語源ですね

```java:操作対象を重視した擬似コード１
a_window.close();
```
```java:操作対象を重視した擬似コード2
tmp_file.delete();
```

どうでしょうか。ぐっと「オブジェクト指向」らしいコードになったことがお分かり頂けるのではないでしょうか。
親しみやすいように文法をJavaっぽく変更しましたが、使用している単語は手続き型の擬似コードと同じです。

というわけで、もう一度。
「**オブジェクト指向**プログラム」とは「**操作対象を重視する**プログラム」です。

|SVO文型        |手続き型プログラムでは… |オブジェクト指向プログラムでは… |
|--------------|-------------------|------------------------|
|主語(Subject)  |-                  |操作対象                 |
|動詞(Verb)     |関数名(命令)        |メソッド                  |
|目的語(Object) |引数(操作対象)       |-                      |


## 補足１ 「目的語」という言葉について
日本語の「目的語」のことを「対象語」と呼ぶことがあるそうです。
また、文法用語の「Object」(SVO文型のO)を「目的語」としたのは誤訳だという議論もあるようです。

学生時代「目的語」という言葉にいまいちピンときていなかった私としては、「対象語」のほうが確かに分かりやすいと思います。


## 補足2 自動詞と他動詞
自動詞と他動詞を覚えていますか。

- 自動詞とは、動作が主語のみで完結する動詞で目的語は不要
- 他動詞とは、動作が主語以外に影響する動詞で目的語が必要

下記の例のように、日本語では自動詞と他動詞とでは形が異なります。
逆に、英語では自動詞も他動詞も同じ形なので文型で見分ける必要があります。

|      |目的語の要否   |文例   |
|------|-------------|------------|
|自動詞 |目的語は不要   |窓が**閉まる**, ファイルが**消える**  |
|他動詞 |目的語が必要   |窓を**閉める**, ファイルを**消す**   |

一般的に、手続き型プログラムの関数は他動詞(主語は省略、目的語は引数)、オブジェクト指向プログラムのメソッドは自動詞(主語が操作対象)とみなすことができます。

具体的な例を挙げましょう。
JavaScriptで``Window``を移動するには``moveTo``というメソッドを使用します。
このメソッド名は、前置詞(to)を含めることで"move"が自動詞であることを示唆し、移動するのは自分自身であることを明確にする意図があるものと考えられます。

```js:メソッド名が自動詞であることを示唆する例
a_window.moveTo(0, 0); // a_window自身が移動する
```

## GUIとオブジェクト指向
一般的に、GUIはオブジェクト指向なUIと考えられます。
比較のために、まずはCUIでのファイル削除方法を見てみましょう。

```bash:ファイルの削除例(Linuxコマンド)
rm tmpFile
```

```bat:ファイルの削除例(Windowsのコマンドプロンプト)
del tmpFile
```

rmやdelというファイル削除の「命令」を先に入力し、その後ろに「操作対象」のファイルを引数として指定しています。

次に、以下の画像をご覧ください。
JavaのIDEでFileオブジェクトのメソッド候補が出ている状態と、OSのファイルのコンテキストメニューを並べてみました。これらが類似していることがお分かり頂けるでしょうか。
![context.png](https://qiita-image-store.s3.amazonaws.com/0/81235/5086ef91-7c61-9334-b959-1e5b23f925d5.png)
ポイントは「操作対象」が「命令」より先に決まっているというところです。
「操作対象」を先に決めることでや、IDEやOSがその「操作対象」に対して実行可能な「命令」を候補やメニューとして提示できるわけです。


# おわりに
マサカリ必至のネタなので、このカレンダーにのっからせて頂きます。
Qiita新参者の私ですが、ご指導ご鞭撻のほど宜しくお願いいたします。