「ジブン専用パソコン4」がついに発売! 「子供の科学」4月号では、「マインクラフトパイリボーン」の遊び方を紹介しました。そして、今回の「深ボリ講座」は、この春からますますプログラミングの修練に励むであろうみなさんに向けてお届け。テーマは「オブジェクト指向プログラミング」。みなさんはこの用語にどれくらい馴染みがあるでしょうか? 例えば、PythonやJava、連載でもおなじみのScratchなどは、すべてオブジェクト指向型プログラミング言語です。本誌の連載でもおなじみ阿部和広先生に、その大まかな枠組みについて解説していただきました!
コンピューターを理解するための研究
コンピューターのハードウェアはただの箱。その箱になにかをやってもらうためには、ソフトウェアが必要だ。そして、ソフトウェアはプログラムとデータからできている。
コンピューターはその名前(compute + er)の通り、計算することを目的につくられた。コンピューターは、人間が行うと何年もかかってしまうような計算の答えを一瞬で求めることができる。さらには、記憶した大量のデータを並べ替えたり、検索したりすることもできる。
ハードウェアの性能が向上するにつれて、コンピューターでできることは計算以外にも増えていき、そのためのソフトウェアもどんどん複雑で大きくなっていった。しかし、ソフトウェアをプログラムするのは人間だ。人間が作る以上、どんなに複雑なプログラムであったとしても人間が理解できるものでなければならない。
コンピューターを理解するためには、コンピューターとそれが扱っている情報の性質を科学的に理解する必要がある。このような研究分野を「計算機科学(Computer Science)」や「情報科学(Information Science)」という。一方、ソフトウェアは工業製品としての側面も持っている。高品質なソフトウェアを低コスト、短期間、小人数で開発して保守するため、言い換えると、“複雑さ”に対抗するために、計算機科学や情報科学を応用した「ソフトウェア工学(Software Engineering)」が生まれた。
手続き指向とオブジェクト指向
「オブジェクト指向プログラミング(OOP: Object Oriented Programming)」もそのようなソフトウェア工学の成果のひとつだ。オブジェクトは「もの」、指向は「それを中心とする」という意味だ。つまり、ものを中心に考えてプログラムすることがオブジェクト指向プログラミングということになる。
プログラムの構成要素には、処理の手順を示す「手続き」、情報を表現する「データ構造」、ある入力に対して出力を返す「関数」などがある。それらに対して、「もの」というのは、なんとなくしっくりこないかもしれない。
では、手続き中心のプログラミングを考えてみよう。手続き指向プログラミングでは、プログラムで行うことは、すべて手続きとして表されている。さすがにひとつの手続きだけでは表せないので、大きな手続きを小さな手続きに分割し、それぞれに名前をつけて抽象化する。それらの手続きは、順番に処理を実行する「順次」、ある処理を繰り返す「反復」、ある条件によって処理を分ける「分岐」の組み合わせとして構造化される(構造化定理)。データは、それぞれの手続きの間で受け渡され、加工される。
この考え方は、コンピューターのしくみに近く、その点では都合が良い。しかし、これは必ずしも私たちが普段行っていることや、周りにあるさまざまなものとの関係、それらの役割などを直接的に表現しているとはいえない。工場の製造ラインなどを除いて、私たちは、物事を手続きの集まりとして認識していない。手続き指向プログラミングは、コンピューターの能力が限られていて、人間がコンピューターの側に歩み寄る必要があった頃には有効だった。しかし、コンピューターの性能が飛躍的に向上した今日、余剰の力を使ってコンピューターが人間の都合に合わせても良いのではないだろうか。
「もの」を中心に考えるとは?
オブジェクト指向プログラミングでは、プログラムを「もの」の集まりと考える。ここでいうものとは、みなさんの目の前にあるさまざまなものだ。例えば、本や鉛筆、カップ、机、テレビ、エアコン、時計、温度計などなど。このようなものは、それぞれ名前があり、役割があり、できること、知っていることがある。そして、それらのものを押したり、触ったり、回したりすることで情報を送り合って処理を進める。見たり、聞いたりすることで情報を得られる。また、本は机の上に乗っているという関係があり、本はカバー、表紙、ページ、文字などに分解できる。これらのもののモデル(模型)をプログラムとして組み立てたものが、すなわちソフトウェアとなる。
オブジェクト指向プログラミングの考え方が生まれた半世紀前、このような説明は突拍子もないものとして、なかなか受け入れられなかった。しかし、Scratchを使ったことがある人なら、むしろ当たり前のように受け取れるのではないだろうか。
Scratchでは、スプライトとステージがオブジェクト(もの)だ。スプライトやステージが「できること」はブロックで、「知っていること」は変数とリストだ。スプライトはステージの上にあり、スプライト同士はメッセージを送りあって処理を進める。そして、ユーザーの操作はイベントとしてスプライトとステージに伝えられ、吹き出しや変数モニターで結果を返す。しかし、手続きがなくなったわけではなく、オブジェクトの中の「できること」、つまり、スクリプトやコードの中のブロックの並びに内包されている。
オブジェクト指向プログラミングには、その成り立ちによっていくつかの流派がある。今回は、そのような歴史を端折って概念について説明した。もし歴史や定義に興味がある人がいたら、次の資料を読むといいだろう。
●オブジェクト指向とは何ですか? https://www.slideshare.net/sumim/ss-152523149
文
コカネットプレミアム(DX)会員は、雑誌『子供の科学』バックナンバー電子版が読み放題! 以下をクリック☆