35
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

マサカリAdvent Calendar 2017

Day 17

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

Last updated at Posted at 2017-12-17

はじめに

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

TL;DR

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

「オブジェクト指向」とは

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

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

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文型の目的語

オブジェクト指向プログラムとよく対比される概念として、手続き型プログラムがあります。
一般的に、手続き型プログラムは以下のような文法です。

手続き型プログラムの文法
関数名 引数

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

手続き型プログラムの擬似コード1
CLOSE a_window
'↑命令
'      ↑操作対象
手続き型プログラムの擬似コード2
DELETE tmp_file
'↑命令
'       ↑操作対象

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

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

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

再考、「オブジェクト指向」とは

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

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

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

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

操作対象を重視した擬似コード1
a_window.close();
操作対象を重視した擬似コード2
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でのファイル削除方法を見てみましょう。

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

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

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

おわりに

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

  1. ○○には、「言語」や「プログラミング」、「設計」などが入ります

  2. 「主語(S)」が省略されているので、命令文として読むことができますね

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

35
35
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?