【ひきこもりが教える】オブジェクト指向プログラミング(OOP)って何?【プログラミング】

ひきこもりが教える

オブジェクト指向プログラミング(OOP)って何?

ひきこもりが教えるシリーズの記事です。

私は友人Kに「オブジェクト指向って何?」と聞かれたとき、メールで答えました。結構苦労して書いたのです。なので、その内容を改変して自分のブログ記事にしてしまおうという算段です。

「オブジェクト指向」という考え方

プログラムを作成するときに規模が大きくなって複雑になってくると、人間には把握しづらくなります。だからわかりやすくするために、プログラムを何らかの基準で分割したいのです。そこで、「人間が普段世界を認識している方法を参考にして、プログラムを分割すればいい」という考え方が出てきました。そうすれば、人間にとって、より速く+正確に+わかりやすいプログラムを書けるはずだと。それが「オブジェクト指向(object-oriented/意訳すれば「オブジェクトを基準とする」という意味)」という考え方です。

なんでそう呼ばれるんでしょう。人間は普段、オブジェクト(つまりモノ/コト)を単位にして世界を認識しています。それをふまえて名付けられたからです。

人間式の認識

普段人間は無意識にやってるから、オブジェクト(つまりモノ/コト)を単位にして世界を認識するということは、当たり前のように聞こえるかもしれません。

しかし、例えばコンピュータに野球をやっている人たちの映像を見せたとします。そうするとまず、例えば「球場」と「ボール」と「選手」をそれぞれ別のオブジェクト(コト/モノ)だと認識させるところから始めなければならないのです。

そこから何が言えるのかというと、「オブジェクトを単位にして世界を認識する」というのは実は人間的(あるいは動物的?)な”特殊な”やり方だということです。この例でいうなら、「球場」というオブジェクトの中で、「選手」というオブジェクトが「ボール」や「バット」というオブジェクトと関連しあって、全体として「野球」というプログラムを実現している、と人間は無意識に捉えているわけです。

コンピュータとしては、どんな複雑な計算だろうがちゃんと指令を与えてくれさえすれば、パパっと計算できてしまいます。だけど、プログラムが複雑化すると、コンピュータに指令を与える側の人間がついていけなくなったのです。 繰り返しますが、 だから人間にとってわかりやすいプログラムを作れるように 「オブジェクト指向」という考え方が考案されたのです。

オブジェクト指向型言語

そして、その「オブジェクト指向」という考え方をもとに人間がプログラムを作ることを前提にして設計された言語が、オブジェクト指向型言語なのです。 「オブジェクト指向に基づいてプログラムを便宜的に切り分けて記述する」という前提があるので、それを支援するために、オブジェクト指向型言語には、例えばクラス(オブジェクトの設計図)の定義とかを簡単にできるような文法が用意されています。

オブジェクトをコードに書く

ここで、存在するすべてのオブジェクト(つまりモノ/コト) は、属性(プロパティ)と働き(メソッド)を持っていると捉えられます(*注釈: ”プロパティ”とか”メソッド”という言葉は、言語によって別の言葉になったりすると思います)。例えば、ボールなら「位置」、「重さ」、「大きさ」、「反発係数」、「メーカー」などの属性。「動く」「回転する」などの働きをもっていると捉えられます。

クラスの定義

オブジェクト指向言語では、それをプログラムとして書くときにクラスとして書きます。ボールという現実に存在するオブジェクトをプログラムのなかに落とし込むために、オブジェクトの設計図を、すなわちクラスを、自分で書くのです。

オブジェクトの「属性」と「働き」

その際にボールをどう捉えて、どういった属性働きを持つかを設計するのはプログラマ次第です。プログラム全体として何を実現したいかを考え、そこから自分で設計する必要があります。

例えば、「動く」という漠然としたメソッドでもの足りないと考えたなら、「転がる」とか「跳ねる」とかいうメソッドをクラスに(つまりオブジェクトの設計図に)書けばいいのです。野球を例にするなら、極論、球場に存在する砂粒一つ一つをオブジェクトとして扱うこともできます。設計者次第です。ボールオブジェクトが動くときに、「空気オブジェクトのプロパティを参照してその値によって動きが変わる」とかを実装したいとするなら、今度は空気オブジェクトを作れば良いのです。

javascriptによる実例

例えばjavascript(ES6以上)なら以下のように書きます。

プロパティとしてサイズ/sizeが10、質量/massが100、メソッドとしてmove()をもつBallクラスを定義したいとしたら、

//クラスの定義
class Ball{
   //コンストラクタ
    constructor(){
  //プロパティ
        this.size = 10;
        this.mass = 100;
    } 
   //メソッド
    move(air_obj){//引数で空気オブジェクトを受け取る
      //何か書く。例えば加えられた力によってxyz座標空間上の位置を移動する計算式とか
      //空気オブジェクトを引数で受け取ったなら、その値を計算式に混ぜればよい
    }
}

あとは必要に応じて、設計図(クラス)から実体(インスタンス)を生み出します。その時、内部的には、PCのメモリ上にそのインスタンスの情報が追加で新しく書き込まれます。

//変数bにインスタンス化されたボールオブジェクトを代入。
var ball = new Ball();
console.log(ball.size); //コンソールに10と表示される。

インスタンス化されるとそのオブジェクトのプロパティやメソッドが使用可能になります。staticという例外はおいておきます。

インスタンス化の必要性

ところで、なぜインスタンス化が必要なのでしょう。

根源的な理由は、実体をまだ持っていないものが働くことを許すと、現実世界の動きにそぐわなくなるからです。言い換えれば、オブジェクト指向の基本原理に反することになるからです。それを許してしまうと、結局人間にとって何が何だか把握しづらくなってしまいます。それでは、何のためにオブジェクト指向という考え方が生み出されたのかわかりません。

結局「オブジェクト」とは

オブジェクトとは:

  • 一般に使われる広い意味では
    • 普段人間が認識している世界に存在するあらゆるコトやモノのこと
  • プログラミング世界で使われる狭い意味では
    • 広義のオブジェクトを実際にプログラムの中で定義したもの(つまりクラス)
    • その定義からメモリ上に実体化したもの(つまりインスタンス)

文脈によっては、インスタンス化されたものもオブジェクトと呼ばれたりします。考えてみれば当たり前のことです。ボールの例でいうなら、結局元は現実世界にあるボールのことだからです。それをプログラムの中に出現させるためのクラス(設計図)も、その設計図から生み出されたインスタンス(実体)も全部がボールオブジェクトと言えるのです。

オブジェクト、クラス、インスタンス

「インスタンスをオブジェクトとは呼べない」とか「クラスとオブジェクトは違う」と思う人がいるかもしれません。

ここでひとつたとえ話を。

あなたは鳥の絵を描いています。するとある男がやってきてこうあなたへ問います。
「あなたは何を描いているんですか」
あなたはこう答えます。
「鳥を描いてるんです」
するとその男は顔をしかめてこう言いました。
「いや、あなたは”鳥”ではなく、”鳥の絵”を描いているじゃないですか」

あなたは「ある男」についてどう思いますか。

もちろん鳥の絵は厳密にはただの絵です。しかしそれは鳥なのです。鳥の絵を鳥だと呼ぶことは自然なことです。ここで「ある男」が持つ”厳密さ”には文脈上意義がありません。

同様に、インスタンスもクラスも、それらはもちろんオブジェクトじゃないですよ。ただの、メモリ上の数値の羅列ですから。だけど、オブジェクトと呼べるのです。インスタンスやクラスが表しているものは結局はオブジェクト(現実世界にあるコトやモノ)ですからね。

オブジェクト指向は楽しいもの

あとは、例えば「継承」「カプセル化」「多態性」とかいう概念がオブジェクト指向には含まれていますが、それも本質が理解できていれば大したことはない…と言いたいところです。私自身初心者ですから、まだよくわかりません。

理解できれば、オブジェクト指向って楽しいし便利なものだと思います。例えば、野球というプログラムを書くとして、オブジェクト指向という手掛かりがなかったら何を書いていいか私なら見当がつきません。でもオブジェクト指向があれば、とりあえずこういうクラスを作って、それにこういうプロパティとメソッドを持たせればいい、というところまでは見当がつきます。

私はオブジェクト指向という概念を知った時、「存在するすべて(あるいはおよそ人間が想像しうる全て)をプログラム化することが可能かもしれない」とわくわくしました。

あとがき

世界を創造するというバカみたいな野望が私にはあります。その着想の一因に、オブジェクト指向という概念があることは間違いないです。

【ブログコンセプト】私の究極目標【Part 2/2】
私の究極目標で書いたことは、なんというか表面上の目標です。長期的な究極目標はまた別のところにあるんです。一言でいえば、それは「もう一つの世界を創造する」ことです。その具体的な一つの方法がゲームを作ることです。ひきこもり宣言ひきこも...

およそ観測できるものはすべて記述しうる。ニュートンはそんな気持ちだったのでしょうか。あるいはウィトゲンシュタイン?

この記事がわかりやすく興味深いものになっているといいなと願っています。

コメント

タイトルとURLをコピーしました