オブジェクト

SenseTalkは複雑かつ難解なプログラミングを詳細に理解するのに長い年月をかけることなく、ユーザーが自らのソフトウェアを作成できるように設計されました。本ドキュメントの前半に記した情報では、コンピュータにしたいことを伝えるステートメントの簡潔なリストとして、SenseTalkスクリプトに主に焦点を当ててきました。多くのユーザーにとって、スクリプト記述への基本的なアプローチは、各自のニーズを満たしていると思われます。

また、さらにより詳しく学習したい人向けには、 その複雑性をほとんど変化させることなく、SenseTalkのオブジェクトモデルにおいてより豊かな環境を提供します。

ここでは、 SenseTalkのモジュラー構造の概要を説明し、さらに、ユーザー自身のオブジェクト指向のSenseTalkソフトウェアの記述方法の学習を進めるのに伴い、知っておきたいキーコンセプトや用語を紹介します。

ステージ設定

SenseTalkは「スクリプト」言語です。ユーザーは、システムの異なる要素が実行することを描写するスクリプトを記述することで、SenseTalk ソフトウェアを作成できます。SenseTalkでこれを行うには、通常、システム内でアクターとなる多数の異なる「オブジェクト」を作成します。各オブジェクトは、システム内で実行することを伝える独自のスクリプトを備えています。このモジュラーアプローチの採用により、各スクリプトは比較的短く自己完結しており、複雑なシステムでさえも動作させるのが比較的簡単になっています。

各自のシステム内のオブジェクトは、メッセージを送信および受信することでやり取りします。オブジェクトは、メッセージ用のハンドラを有する場合にメッセージに応答します。スクリプトは、オブジェクトが応答する各メッセージ用の一連のハンドラで構成されます。それ以外のメッセージは、オブジェクトから無視されます。

SenseTalkオブジェクトは互いにヘルプすることができます。類似の挙動や能力を備える必要がある多くのオブジェクトが存在する場合は、共有する挙動および能力を体現するヘルパーオブジェクトを作成できます。これにより、その他のオブジェクトをそのヘルパーオブジェクトでヘルプできるようになり、それら独自のスクリプト内で挙動を定義する必要性を排除できます。これで時間と手間を大幅に削減できます。さらに、ヘルパーオブジェクトのスクリプトを単に変えるだけで、挙動のアップデートを簡単に行えるようになります。その他すべてのオブジェクトはその後、変化した挙動を 「受け継ぎ」ます。

その他のオブジェクト指向の言語に詳しい人は、SenseTalkは他の言語とは少し異なることに注意が必要です。その他の多くの言語は、オブジェクトの「クラス」を定義し、そのクラス内のすべてのオブジェクトについて、 一般的にそのクラスレベルでの挙動のみを実行します。SenseTalkでは、個々のオブジェクトはその独自のスクリプトを有するため、それ独自の挙動を備えることができます。

SenseTalkにはクラスは存在しませんが、オブジェクトがその他多くのオブジェクトから提供される機能を使用する(または受け継ぐ)ことで、そのヘルパーが同様の豊富な機能を提供します。このオールオブジェクト(クラスレス)アプローチは、クラスベースのシステムより簡単かつ万能となっています。

オブジェクトの定義

SenseTalkはオブジェクト指向の言語です。SenseTalkスクリプトはオブジェクトの挙動を描写します。ホスト環境に応じて、オブジェクトは画面上のボタンや画像などで直接操作したり、やり取りしたりできる可視化されたものである場合や、銀行口座や運動スケジュールを表すオブジェクトなどのより抽象的なものである場合があります。

オブジェクトが可視化されている物を表すか、純粋に概念上のものを表すかにかかわらず、SenseTalkにおけるすべてのオブジェクトは特定の特性を共有します。すべてのオブジェクトには、そのオブジェクトにとって重要な情報を格納するプロパティと呼ばれる属性が備わっています。オブジェクトには、そのオブジェクトのスクリプトによって定義され、オブジェクトが実行できることを定義する挙動も備わっている場合があります。

コンピュータ画面上に示される画像の場合は、そのプロパティは、高さや幅のほか、その画像を形成するすべてのドットの色などを含む場合があります。連絡先情報を表すオブジェクトの場合は、連絡先の名前、電話番号、メールアドレスなどのプロパティが含まれます。

スクリプトによって定義されるオブジェクトの挙動には、画像を上下逆さまにしたり、メールをメールリスト上の人物に送信したりする動作が含まれます。オブジェクトのその他の「挙動」は、プロパティ内で直接的に表されないオブジェクトに関する情報を提供するなど、より受動的なものとなります。例えば人を表すオブジェクトには、誕生日を格納するプロパティが含まれます。オブジェクトのスクリプトは、現在の日付にアクセスし、誕生日から経過した年数を計算することでその人の年齢を提供したりすることも可能です。

プロパティリスト

前セクションにおいて、プロパティリストはキーによって特定される値を集めたものとして説明しました。その中で、プロパティリストは実際にシンプルなオブジェクトであると述べました。

プロパティリストは、主にプロパティであるオブジェクトです。しかし、ヘルパーの割り当てか有効なスクリプトへのスクリプトプロパティの設定のいずれかにより、プロパティリストに挙動を追加することが可能です。ヘルパーは本セクションの後半で説明します。オブジェクトのスクリプトを設定するには、単に1つ以上のハンドラテキストをそのオブジェクトの「スクリプト」プロパティに保存します。

put (width:7,length:12) into myRect

set the script of myRect to {{

function area

return my width * my length

end area

}}

put myRect's area -- 84

スクリプトファイル

SenseTalkの多くのスクリプト環境では、各スクリプトはディスク上のテキストファイルに保存されます。このような環境において、これらの各ファイルがSenseTalkオブジェクトであり、ファイルのコンテンツがオブジェクトスクリプトとなります。

スクリプトは、そのオブジェクトの挙動を定義する一連のSenseTalkコマンド(ステートメントと呼ぶ場合もある)を構成します。以下は、ユーザーがよく見かける最も簡潔で短い、完全なSenseTalkスクリプトの例です。

put "Hello, World!"

スクリプトファイルは、主に挙動であるオブジェクトです。上に示したスクリプトは非常に簡潔なオブジェクトを構成しており、本スクリプトの実行時に呼び出される、「Hello, World!」という語句を表示する単一の挙動を備えています。

挙動に加えて、スクリプトファイルには必要に応じてプロパティ宣言も含まれます。オブジェクトがディスクからスクリプトのロードにより作成される場合は、そのスクリプトにおけるプロパティ宣言は、オブジェクトプロパティの初期値を定義します。プロパティ宣言は、本例で示す形式を採用します。

Properties

name:"Charlie Brown",

birthDate:"May 14, 1942",

hairColor: brown,

numberOfSiblings:1,

helpers: ("Linus", "Lucy")

end properties

このプロパティ宣言は、本オブジェクトの5つのプロパティを定義し、これらに初期値を割り当てます。スペースや特殊文字を含む値は、本例のnameプロパティとbirthDateプロパティで示したように、引用符で囲む必要があります。単純な値は引用符を必要としませんが、希望する場合は引用符で囲むことができます。一部のプロパティは、ヘルパープロパティについて本例で示したように、値リストが割り当てられる場合があります。

スクリプトフォルダ

フォルダはSenseTalkオブジェクトとしての機能を果たすこともできます。フォルダをオブジェクトとして扱う場合は、フォルダ内の各スクリプトファイルは、そのオブジェクトのハンドラとして扱われます。特別な名前「_initialHandler_」を持つスクリプトがそのフォルダ内に存在する場合は、フォルダオブジェクトのinitialハンドラとしてロードされ、使用されます。そして、そのスクリプト内で定義されたプロパティが、フォルダオブジェクトの初期プロパティ値として使用されます。

オブジェクトの使用

プロパティリストの作成

単純なプロパティリスト(プロパティを含むがハンドラは含まないオブジェクト)は、以下に示す形式で、プロパティと値を単純にリストすることで作成できます。

put (x:44, y:108, z:-19) into point2

単純なオブジェクトの作成

オブジェクトはその他のオブジェクトによってヘルプされます(ヘルパーは本セクションの後半で詳しく説明します)。

put (name:"Hank", age:47) helped by parent,actor into person

初期化オブジェクトの作成

完全な初期化オブジェクトは、new object式で作成できます。

put new object with (width:14, length:9) into dimensions

本例で示したように、new objectを使用してオブジェクトを作成する場合は、その結果は基本的に、既に示した単純なオブジェクトと同じ名前となります。唯一の相違点は、「初期化」メッセージが新たに作成されたオブジェクトに送信される点です。もちろん、そのようなハンドラを備えたヘルパーが含まれない限り、そのメッセージに応答するハンドラは含まれません。ユーザーは、以下のように1つ以上のヘルパーを利用してオブジェクトを作成できます。

put new object with (partNum:1234) helped by part into aPart

プロトタイプオブジェクトによる作成

new object式を使用するより一般的な方法に、以下の例で示すように、「プロトタイプオブジェクト」を指定する方法があります。

set child to be a new Person with (name:"Penny", age:6)

本例では、Personがプロトタイプオブジェクトとなります。プロトタイプオブジェクト(必要な場合)は、新しいオブジェクトの構成方法を正確に制御できます(この詳細な仕組みについては、本セクションの後半で説明します)。ただし一般的なケースでは、新しいオブジェクトには、スクリプト内で与えられるプロパティとプロトタイプからのその他のプロパティのコピーが備わり、プロトタイプオブジェクトによってヘルプされます。このため、Personオブジェクトが通常の挙動を上書きしない限り、上に示したステートメントは、以下の例と等価となります。

set child to a new object with ((name:"Penny", age:6) adding properties of (object Person)) helped by Person

オブジェクトプロパティへのアクセス

オブジェクトのプロパティには、ドット (.)やアポストロフィーS(‘s)、オブジェクトの後ろのプロパティ名、またはオブジェクトの前に「of」を付けたプロパティ名など、 複数の異なる方法でアクセスできます。

put (make:Yamaha, model:"U3", finish:"Walnut") into piano

put "My piano is a " & piano.make && piano's model

put "It has a pretty " & finish of piano & "finish"

オブジェクトプロパティは、コンテナです。プロパティは、ListsにおけるプロパティリストおよびProperty Listsで詳しく説明するように、追加、削除、または値の変更を行うことができます。

「Me」および「My」を利用したオブジェクト自身のプロパティへのアクセス

オブジェクトがそのスクリプトに含まれるプロパティにアクセスする必要は、非常に多く発生します。オブジェクト自身に名前で参照するのではなく、meおよびmyという用語を使用してこれを実行できます。

put the age of me

if my name begins with "S" then return "Smilin' " & my name

未定義プロパティとStrictPropertiesグローバルプロパティ

通常、オブジェクトに存在しないプロパティにアクセスすると、SenseTalkはそのプロパティ値としてemptyを返します。これはプロパティ名のスペルをうっかり間違えてしまった場合など、トラブルを招く場合もあります。このような場合にスクリプトのデバッグを手助けするため、または単により厳格なアプローチを好む場合に、strictPropertiesグローバルプロパティを設定することができます。このプロパティを設定すると、事前に設定されていないオブジェクトのプロパティにアクセスする試みにより、例外が投げられます。

put a new object into emptyObj

put (property abc of emptyObj) is empty -- 「true」を表示します

set the strictProperties to true

put (property abc of emptyObj) is empty -- 例外を投げます

「Object」を利用してオブジェクトのアクセスを確認する

ほとんどのコンテキストにおいて、SenseTalkはオブジェクトが必要とされるときを認識し、スクリプトオブジェクトの名前として文字列値を処理します。ただし、意味が曖昧な場合もあります。このような場合は、object というワードを使用して、オブジェクト名として処理すべき値であることを示すことができます。

put "Person"'s greeting

-- 「Person」はオブジェクトではなくテキストなので、greeting関数が呼び出されます

put (object "Person")'s greeting

-- 「Person」をオブジェクト名として扱い、そのgreetingプロパティにアクセスします

 

This topic was last updated on 2月 01, 2019, at 11:13:23 午前.

Eggplant icon Eggplant.io | Documentation Home | User Forums | Support | Copyright © 2019 Eggplant