「オブジェクト指向とは何か」の答えが『なぜ、あなたの仕事は終わらないのか(中島聡[著])』に書いてあったので紹介します

オブジェクト指向とは

『なぜ、あなたの仕事は終わらないのか(中島聡[著])』には以下のように書いてあります。

なんらかの対象(オブジェクト)を先に選択したうえで動作を指定することをオブジェクト指向といいます。

考えてみる

Wikipediaオブジェクト指向を調べてみると、

オブジェクト指向 - Wikipedia

オブジェクト指向(オブジェクトしこう)とは、オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である。

とあります。これに異論はありません。

ただ、Wikipediaの文章は、オブジェクト指向がわかる人であれば理解できる文ですが、初心者にとっては抽象的すぎて何を言ってるのか捉えにくいかもしれません。

冒頭で引用した説明もこれだけでは何を言っているのかよくわからないかも知れませんが、 書籍中では、 Windows95での右クリックやダブルクリック、ドラック&ドロップが現在のようになった、という話の中で出てきており、理解がしやすいようになっていました。 以下に例を示します。

オブジェクト指向GUI

WindowsののGUIでは、 ファイルの上で右クリックすると、選択できる動作が表示されます。

f:id:yucatio:20180801122931p:plain

また、ダブルクリックで、文書ファイルならMicrosoft Wordが起動し、音楽ファイルなら音楽プレーヤーが起動します。

注目すべきは、動作(ファイルを開く、ファイルを削除する)を始めに指定するのではなく、ファイルを先に指定しているという点です。

オブジェクト指向以前は動作が先

オブジェクト指向以前では、ユーザがコマンドという文字列を最初に入力してそのあとにファイルやディレクトリを指定していました。

例えばエクセルファイルを開くのにはexcel.exeコマンドを使用します。

excel.exe 集計.xls

ファイルの削除はdelコマンドを使用します。(delはdeleteの略)

del 集計.xls

扱う言語(自然言語)による違い

書籍には続いて以下のように書いてあります。

オブジェクト指向のわかりやすい例として、私たちがいつも使っている日本語が挙げられます。

あなたがテーブルの上の塩を取ってほしいとき、あなたは「すいません、塩を……」まで言葉にしたところで一呼吸置くと思います。「塩」という対象を指定した時点で、あなたが相手にしてほしいことは決まり切っているからです。

(中略)

これはWindowsにおけるダブルクリックと非常によく似ていると思いませんか?このようなグラフィカルでオブジェクト指向な機能を思いつくことができたのは、もしかしたら私が当時マイクロソフトで唯一の日本語話者だったからかもしれません。

これは面白い考察でした。確かに英語の命令文だとはじめに動詞が来ます。なのでコンピュータに対する命令を入力するときに、始めにコマンド(動詞であることが多い)、そのあとに対象ファイルを指定するのが自然な考えでしょう。

日本語がオブジェクト指向な言語かどうかよくわかりません。目的語が最初というより、動詞が最後にくるだけな気がしますがどうなのだろう。

ところで、オブジェクト指向において、メソッド呼び出しを「メッセージ」と呼ぶのは、オブジェクト指向のプログラミングにおいて、オブジェクト.命令の部分を英語的に読みくだしたい場合に、オブジェクトに対して呼びかけている様子をイメージさせるためかと思いました。

# オブジェクト指向的にファイルを開くコード
fileA.open()

# 英語的に読みくだしてみる(適当)
# Hey fileA! Open!

まとめ

オブジェクト指向がよくわからない、と思ったときには、 windowsのファイルアイコンの操作のように、「先に操作の対象(ファイルやディレクトリ)を決めて、次に動作(開く、移動する、削除する、など)を決める」 というイメージを持つとよいかと思います。

実際、JavaIDEでは、対象を指定した段階で、呼び出す動作(メソッド)の候補が表示されます。

f:id:yucatio:20180801115942p:plain

(オブジェクト指向をよくわかっている人の場合にはこのイメージだけでは物足りないと思いますが。カプセル化とかポリモーフィズムとか)。

書籍の紹介

引用した書籍はプログラミングの本ではなく、仕事術の本ですが、著者がマイクロソフトWindows95の開発をしていた頃のエピソードも盛り込まれています。そのエピソードがエキサイティングなので読み物としてもとても楽しめました。


引用した文章はこちらで読めます

www.huffingtonpost.jp

あとがき

普段オブジェクト指向でプログラミングをしていて、オブジェクト指向の利点を利用したプログラムを書いていますが、いざ「オブジェクト指向とは何か言葉で説明しなさい」ともし言われたとしたら答えられない、ということに気づきました。

この記事を書くにあたり、オブジェクト指向とは何かというのをwebで検索しました。書籍に書かれていたような定義をしているサイトがなく(そもそもサイトごとに定義が違う)、"書籍の中で使用している「オブジェクト指向」と私が思っている「オブジェクト指向」は別物なのでは"という疑念も湧きましたが、

オブジェクト指向と20年戦ってわかったこと

ここの記事に書いてあった、

言語ごとの多少の表記法の違いはあれど、「最大公約数」を取り出そうとしたら、たぶん

オブジェクト.メソッド(引数...)

という部分しか残らないのでは、と思います。

という記述を見つけ、安心しました。