RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/079/
INDEXに戻る

OOP University:パート 3

前回のレッスンでは、我々はイベント駆動プログラミングを学習し、従来のモーダル・プログラミングからの変更点を学びました。そうして、オブジェクトの入り口へと導きました。ところで、オブジェクトとは何でしょうか?

オブジェクト入門

オブジェクトの概念は、単純でもあり複雑でもあります。我々は毎日、山のようなオブジェクト(物体)を使い、慣れ親しんでいるので、それは単純な概念です。ペン、テーブル、家、猫、人などといった物質界において我々の身の回りにあるものは、全てオブジェクトです。それからの類推を抽象的なコンピュータ・プログラミングに拡張しようとすると、オブジェクトの概念は複雑なものになります。どのようにして、猫がコンピュータのオブジェクトになり得るのでしょうか?

まず始めに、現実世界のオブジェクトを考察しましょう。直感的にそれを理解するだけではなく、子供が学ぶような方法で学習し(子供にテディ・ベアをあげるとき、それがオブジェクトだと説明するでしょうか?)、科学的な視点からそれを考えることにしましょう。

科学者(または哲学者)は、オブジェクトを分類することから始めるでしょう。似ているもの、似ていないもの、様々な種類のオブジェクトがあります。例えば、全てのオブジェクトはすぐに、動くものと、動かないもの(生きているものと生きていないもの)の2つに分類することが出来ます。本は動かないものですし、猫は生きているものです。

項目がどの部類に属するかが分かれば、さらに細かく分類することができます。例えば、猫は哺乳類で、四本の足と爪を持つと言えるでしょう。いくつかの特徴は数値的に特徴付けられるので、全てのデータが二者択一ということではありません。猫の定義の一部として、ある範囲内の体重(0.1〜20ポンド)、体色を持ち、そして種類(シャム、マンクス、その他)に属するということが出来るでしょう。

我々がここで行ったことは、猫の一般的な特徴を明らかにすることです。少なくとも、全ての猫はこのような特徴を持つと言えます。オブジェクトがこれらの特徴を持たなければ、それは猫でないと予測できます。しかし、その反対は結論することが出来ないことに注意しましょう。すなわち、オブジェクトが猫の特徴を満たすからといっても、それが猫である保障はありません(猫と同様に、犬も上記の特徴を満たすでしょう)。

一般的な猫の特徴を書き出せば、ある猫の特徴を含めるためのさらに細部の定義ができるでしょう。例えば、Mischiefという名前の私の飼っている一匹の猫は、白黒の体色を持ち、体重は11ポンドで、神経質でとても敏感な性格です。

我々はできる限り詳しくこのような項目を書き出すことができるでしょう。例えば、"性格"を項目に含めて、その中に"孤立的"、"神経質"、"敏感"、"好奇心旺盛"、"お調子者"のような特定の事項を入力することができます。それから、二匹の猫の性格を比較して、お互いに気が合うか確かめることができます。

ここで行ったことは、猫の属性の定義です。我々は一般的な猫のカテゴリーを作成しました。そして、そのサブセットはMischiefという特定の猫です。

これは何でしょうか?ここでは、OOPの概念である継承を利用したのです!

少し考えて見ましょう。コンピュータにとっては、オブジェクトはただの構造(structure)です。構造は属性(特徴)のリストによって構成されます。それを一般的な猫のオブジェクトであるcatObjectClassと呼びましょう。そのcatObjectClassanimateObjectClassのサブセットであり、またanimateObjectClassobjectClassオブジェクトのサブセットです(我々はオブジェクトから始め、それを生きているものと生きていないものに分類し、それについて、猫のサブセットを作成しました)。これを系統図としてまとめれば、次のようになります。

あるクラス・オブジェクトのサブセットを作成するとき、我々は両親の特徴をすべて持つ新しいクラス・オブジェクトを作成していることになります(それは両親の属性のすべてを継承します)。それが、"alive"属性を、catObjectClassanimateObjectClassから継承し、猫のMischiefとMayhemがcatObjectClassの属性を継承する理由です。

ここが、継承が分かりにくくなるところです。猫のMischiefとMayhemが、catObjectClassから"color"属性を継承することは理解に難しくありません。しかし、重要なのは彼らはその属性のを継承する必要がないことにあります。それが重要な特徴です。catObjectClassは"color"の属性を含みますが、MischiefとMayhemの内部以外ではそれは定義されません。

またMischiefとMayhemは、既にある属性を上書きできます。悲しいことですが、Mayhemが宅配便のトラックにひかれてしまったとすると、彼の"alive"属性はfalseに設定されるでしょう。

これを理解することは非常に重要です。それは、オブジェクトがさらに複雑になるにつれ、属性とそのを混同しやすくなるからです。その理由は、人間からみると、オブジェクトはとても自然で分かりやすいので、特徴そのものとして捕らえ、それを属性として普通は考えないからです。黒猫を目にするとき、我々は"黒猫がいる"と考えます。"黒のcolor属性を持った猫のオブジェクトがある"とは考えません。そうすると、"黒色"が属性のように思えますが、そうではありません。属性はcolorです。黒色は値です。コンピュータは人間のように考えず、このような区別をするときはとても厳格に行います。

またサブクラスは属性を追加できる、ということを理解することが重要です。それがcatObjectClassが"体色"や"種類"のようなものを追加する方法です。サブクラスは、その親から継承した属性を削除することはできませんが、再定義することはできます(その意味の変更)。例えば、objectClassは"alive"を論理型(true/false)のデータタイプとして定義できます。しかしcatObjectClassは"alive"をdoubleとして再定義することができます(それは必ずしも良いことではありませんが)。しかし、catObjectClassは、お祖父さんから受け継いだハゲの遺伝子を削除することができないのと同じように、親から継承した"alive"属性を削除することはできません(増毛薬を使って、遺伝子の働きを変更しようと試みることはできますが)。

次週

オブジェクトのネーミングについてのデスカッションを通じて、オブジェクトの概念を詳しく解説します。

Letters

今週は、実行中のプログラムを停止するための、コマンド―シフト―ピリオドの使用に関する質問をDaveさんから頂きました。

私はこれについてのレファレンスを、以前のRBUのRB 2.1に関する記事で目にしました。RB自体を止めないで、これと同じようにRB 4.5のエンドレス・ループから抜け出す方法はあるでしょうか?

Dave

コマンド―シフト―ピリオドはRB 4.5では機能しないようです。Mac OS Xではアプリを強制終了しても何も問題はありませんが、それも面倒なことです。より良い解決策は、非常終了ルーチンを挿入することでしょう。これを行うにはいくつかの方法があります。

1つは、ループ内にuserCancelledについてのチェックを置くことです。これにより、ユーザ(あなた)はコマンド―ピリオドを押すことで、エンドレス・ループを停止することができます。

  
if userCancelled then
exit
end if

私が時々使うそれ以外の方法は、カウンターの変数を増加させていき、カウントがあまりにも高くなってしまったときには(常識では考えられないくらいに大きな値にセットする)、エンドレス・ループに入ってしまったと仮定して、それを停止します:

  
count = 0
do
// loop's code is here
...

// Emergency exit
count = count + 1
if count > 100000 then
exit
end if

loop until done

これはただループから出るだけということに注意しましょう。エンドレス・ループの原因となることについては何も解決しません。

またこの種の手法は、デバッグやプログラムのテストをする間だけにとどめておきましょう。あなたのプログラムが完成した後には、いかなるエンドレス・ループも含まれていないはずですからね!


RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る