2ntブログ

プログラマに必要な基礎知識(5) オブジェクト指向とは?

最近はいろいろな開発言語があります。
割と新しいタイプの開発言語ってのは、ほぼ全て「オブジェクト指向」のプログラミング言語です。
超初心者がプログラムを勉強しようとすると、この「オブジェクト」ってやつが一番理解に苦しむと思います。
この「オブジェクト」は開発言語の中枢の仕組みであり、これが理解できないとプログラムが組めません。
今回はこの「オブジェクト」とか「オブジェクト指向」が何なのかを、超簡単に解説します。


1.プログラム言語の歴史の中で誕生した「オブジェクト」という概念

オブジェクト」ってのは、どっかの天才がいきなり考え付いた仕組みではありません。
コンピュータというものが登場してから、長いプログラムの歴史の中で誕生したものです。
オブジェクト」の前身は「サブルーチン」と言い、一番最初に登場し、現在でも最も簡単(ただしその分複雑な処理や高度な動作はできませんが)な「開発言語」である「BASIC」(ベーシック)でできた考え方です。
よってまずはこの「BASIC」の「サブルーチン」から学ぶのが、最も理解しやすいと思います。

数学に例えるなら、プログラム組んだ事ない超初心者が「オブジェクト」を学ぶというのは、掛け算割り算はもちろん、足し算引き算すら知らない人がいきなり二次関数を勉強するようなものです。
理解できるはずがないですし、まずは足し算引き算から勉強するのが普通ですよね。



2.BASICのサブルーチン

「BASIC」については詳しく解説しませんが、行番号付きのテキストに命令を書いて行き、それを行番号の若い順から実行していく単純なものです。

「BASIC」でプログラムを組んでみれば分かりますが、処理の中に同じような事を何回もやる場面が出てきます。
例えば画面の同じ場所に次々と文章を表示するようなプログラムを作ったとします。

10 A$=”こんにちわ”
20 LOCATE(10.10):PRINT A$
30 FOR I=0 TO 10
40 NEXT I
50 A$=”今日は良い天気ですね”
60 LOCATE(10.10):PRINT A$
70 FOR I=0 TO 10
80 NEXT I
90 A$=”ではさようなら”
100 LOCATE(10.10):PRINT A$
110 FOR I=0 TO 10
120 NEXT I
130 END

簡単に解説すると、
・A$という文字列が格納できる変数に表示したい文字列を入れ
・それを画面上の左から10列目、上から10行目の場所を先頭に表示
・すぐ次の文字を表示したのでは人間の目には速すぎて見えなくなってしまうので、ループ(繰り返し)処理で時間を稼ぐ
というものです。

さてこのプログラム、赤文字で書かれた部分がタブってますよね?
この程度の短いプログラムであればそれほどでもありませんが、何千行も必要なプログラムだとその分長くなってしまいます。
何度も同じ事を書くのは手間で時間掛かるし、間違い(バグ・不具合)の原因にもなってしまいます。
そこでこの赤文字の部分を1回書くだけで済むように、改良してみようと思います。

10 A$=”こんにちわ”
20 GOSUB 100
30 A$=”今日は良い天気ですね”
40 GOSUB 100
50 A$=”ではさようなら”
60 GOSUB 100
70 END
80 LOCATE(10,10):PRINT A$
90 FOR I=0 TO 10
100 NEXT I
110 RETURN

今回は非常に短いプログラムなので、行数的にはたった2行分しか節約できませんでしたが、見やすくなったし、プログラムを書く手間も多少省けました。
この80行目以降の処理を青文字の命令を使って何度も再利用できるようにした仕組みを「サブルーチン」と言います。
10~70行目の処理を「メイン(主)ルーチン(処理)」とした時の「サブ(副)ルーチン(処理)」って事ですね。

GOSUB」は別の行の処理に飛ぶ命令ですが、同じ動作をする「BASIC」の命令である「GOTO」とは違って、飛ぶ前の行番号が内部的に一時記憶されます。
そして「RETURN」命令によって、一時記憶されていた元の行番号へ飛びます。
これによってどこから「サブルーチン」を呼び出しても、「メインルーチン」の元の場所へ帰ってくる事ができるって寸法です。



3.Windows以前のOSやパソコンにあったBIOSコールやライブラリ

コンピュータが高性能になりできる事も多様化すると、その分プログラムを組むのも大変になっていきました。
そこで次に登場したのが、良く使いそうな「サブルーチン」を予めOSやコンピュータのBIOSという基幹システムに用意して、自由に使えるようにしたものが登場しました。
現在のWindowsにも「API」という形で同様のものが実装されています。
この「ライブラリ」とか「API」とか「BIOSコール」は「サブルーチン」の拡張版であり、複数の「サブルーチン」の集合体の事です。
プログラマは予め定められた「変数」やメモリ上の特定の場所に「入力値」と言われるデータを書き、これらの中の特定のものを呼び出します。
呼び出された「ライブラリ」「API」「BIOSコール」はそれらの「入力値」を元に、プログラムで書くと何十行も、あるいは「BASIC」などの単純なプログラムではできない(マシン語でプログラムしないとできない)高度な処理を行い、結果を定められた変数や場所に返して元の場所に帰るというものです。

これによってマシン語など難しくて複雑なものでプログラムしなくても、あるいはそれらで1から全部自分で作らなくても、ゲームとかワープロとか表計算などの「アプリケーション」が作れるようになりました。
ゲームで例えれば、表示したい座標と表示したいキャラクターのグラフィックデータを用意して「API」を呼び出したり「BISOコール」するだけで、コンピュータの指定した座標の画面上に指定したキャラクターが表示されるみたいなものです。
簡単に画面上でキャラクターを動かせるようになり、ゲーム作りが多少楽になった感じです。



4.オブジェクト

Windows以降の時代になるとコンピュータは更に高性能になり、また普及も進みました。
その分、プログラマの仕事の量も作るプログラムの大きさも増え、もはや一人で「アプリケーション」を作るのはほぼ不可能になりました。
ファミコンやパソコンの初期の頃のゲームって一人で全部作ったものも多かったですが、今のPS3とかWindowsパソコンのゲームとかって何人ものプログラマが参加して作る事からも分かるでしょう。

プログラムの量が増えればこのように作るのに時間や人員が必要になるだけでなく、バグも増えます。
こういった事からプログラムを単純化し、「メインルーチン」さえも「サブルーチン」化、つまり再利用可能な形の「部品」として扱おうという考えが生まれました。
これはプログラム独特の考え方ではなく、多くの工業製品の分野が辿った歴史と同じです。

例えば、車を一番最初に作った人は、タイヤもハンドルもエンジンも車体も全て自分で材料を用意して、加工して作ったと思います。
でもそれだと自分一人で全て作るので、時間は掛かりますし大量生産できません。
そこでタイヤやハンドルやエンジンや、車体を構成するものを統一した規格の部品にしました。
そうする事によって多くの人間によって分業できるようになり、大量生産が可能になったわけです。
全ての工業製品にはネジの1本に至るまで、このように統一した規格があります。
日本だとJISとか有名ですよね?

これと同じ事をプログラムにも取り入れたわけです。
そしてこの統一した規格を元に作られた部品、つまり小さなプログラムの塊りの事を「オブジェクト」と言うわけです。

これによって工業製品と同じように、「アプリケーション」も複数のプログラマが分業して作ったり、あるいは過去の資産を利用して短期間で作れるようになりました。
だから現在の開発言語はほぼ全てこの「オブジェクト指向」が取り入れられているんです。

開発言語のひとつひとつの命令文は、工業製品で言うと鉄とかアルミとか布とかの性質の異なる素材のようなものです。
もちろんそれらを理解していないと適切な部品や製品は作れませんが、肝心なのはどんな部品が必要なのか、それらをどう組み合わせて「車」だったり「家」だったり「服」という完成品を作るかという事です。

話が逸れましたが、「オブジェクト」についてもう少し説明します。

プログラムというのを最も単純化して分析すると
・入力
・計算処理
・結果出力
という3つの要素の繰り返しで構成されている事が分かります。
よって「オブジェクト」には必ず「入力」「計算処理」「結果出力」のやり方や形が決められています。

また、現在のWindowsアプリケーションとかは、全て絵やボタンをマウスでクリックしたり、定められた空欄に何かをキーボードで入力する事で操作します。
絵やボタンや空欄に個々のプログラムが機能として付随している感じですね。
なのでこれら絵やボタンや空欄と、その機能であるプログラムを合わせたものを、纏めて1つの「オブジェクト」と言ったりもします。

余談ですが、絵やボタンがクリックされた時に機能を呼び出すのは起動したアプリケーションソフト本体というより、WindowsなどのOSのシステムです。
そのため、昔のプログラムのように「このボタンがクリックされたら・・・」というキー入力を定期的に調べたり、その内容によってそれぞれの処理に分岐したりという「メインルーチン」部分は今は作る事はないです。
プログラマは「このボタンがクリックされた」後の処理を作り、それをボタンに設定するだけで良いのです。
昔、単純なコンピュータで「BASIC」でプログラムを組んだ事のある人が、一番理解に苦しむのがこの部分かと思います。
私もそうでしたが、これはそういう理由ですって事です。
もっともOS自体やドライバ、あるいは家庭用ゲーム機のゲームはそういうものも含めて全てプログラマが作りますけど。

さて、「オブジェクト」を勉強すると「クラス」とか「インスタンス」って言葉が出てきます。
「クラス」は簡単に言うとこの「オブジェクト」という部品の規格を定めた部分の事です。
どういう変数を使うのか?
その変数は整数の数値が入れられるものか、あるいは文字列が入れられるものか、数値や文字数の上限や、それが何の為に使われるものか。
そしてそれらをどう処理するのか。
その結果をどう返すのか。
これらのプログラムの「入力」「計算処理」「結果出力」の仕様を決めた部分です。
それらが実際に動く形でコンピュータ上に実装された状態を「インスタンス」と言います。

分かりやすく車のアクセルに例えると、アクセルの踏み込める角度の幅とか、どの程度の力でどれだけ踏み込めるかとかの動作仕様と、それによって油圧なのか電圧なのかそういうものが変化する仕組みを決めたものが「クラス」。
そして実際に車に取り付けられ、アクセルとして機能するようにした状態のものが「インスタンス」。
車に取り付けられなければ、アクセルとしては機能しないただの部品なので「オブジェクト」とは言っても「インスタンス」とは言わないみたいな感じです。

纏めると
・アプリケーションが「車」なら「オブジェクト」はアクセルとかハンドルとかエンジンとかの部品の事
・「オブジェクト指向」プログラミングとは、そういった規格化されたアクセルやハンドルやエンジンなどの部品を使って「車」という「アプリケーション」を組み上げる開発言語の事
です。



補足.プロパティとメソッド

「オブジェクト」を定義する「クラス」には、「プロパティ」と「メソッド」というものがあります。
最初の方で説明した「BASIC」の「サブルーチン」のとこをもう一度見てください。
あの「サブルーチン」も「オブジェクト」です。
機能としては、A$という文字列変数に入れた文字を画面に表示するというものでした。
このA$という変数や、この変数に表示したい文字を入れてくれという仕様部分、これが「プロパティ」です。
A$という文字列の中身を画面に表示する命令文である「PRINT」やそれを一定時間表示し続ける「FOR~NEXT」の時間稼ぎの処理などの「動作」部分が「メソッド」です。
ちなみに表示する場所の座標も指定できるよう、別に「LOCATE(X,Y)」としてX,Yという2つの整数を入れるための変数を作ったとしたら、それは「プロパティ」になります。
それと今気づいたのですが、このプログラムだと表示前に画面クリアしてないので、以前より短い文字列を同じ場所に表示した場合、以前の文字列の後ろが残って見えてしまいます。
そこで本来は「PRINT」命令の前に「CLS」(クリアスクリーン、画面全消し命令)を入れるべきだったわけですが、その追加処理を入れたとしてらそれは「メソッド」になります。

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR