これは RuntimeRevolution 1.1.1 のヘルプにある文書を邦訳したものです。この文書の文責はUDIにあり、またUDIはこの文書についての一切の債務を負いません。 間違いがありましたら eudio@chabashira.co.jp までお知らせ下さい。この文書は必要と思われる時に適宜アップデートされます。

Help -> Revolution Documantation -> Development Guide -> Developing with Revolution -> About... Revolution for experienced developers


About Revolution for experienced programmers
プログラミング経験者のための Revolution
==============

参照:
--------------
Supported Platforms Reference, Getting Started Tutorial, Independent Study Tutorial


 このトピックは、従来のプログラミング言語( C、C++、Java など)による開発経験を持つ、Revolution の新規開発者に向けて書かれたものである。ここでは Revolution による開発過程の概要と、そのプログラミングモデルを解説する。

 このトピックをきちんと理解するには、手続き型プログラミングの基本(サブルーチン、関数、条件文、変数)を理解している必要がある。またモダンインターフェースデザイン(ウィンドウ、ダイアログボックス、メニュー)の理解も必要である。もし従来の手続き型言語を使ってモダンOS用のアプリケーションをコンパイルしたことがあるなら、このトピックは充分に理解可能だろう。

Contents:
Moving Into Revolution
The Revolution Development Environment
Revolution's Object Model
The Transcript Language
The Development Process


Moving Into Revolution
Revolutionへの移行
 Revolution は、インターフェースデザイン、プログラムコードの編集、そしてテスト環境までを統合した開発環境である。つまりひとつの環境でインターフェースを作り、別の環境でコードを書いて、それらを統合する、というやりかたではなく、開発環境上で直接インターフェースを作ることが出来る。まるでドローツールのように、作成中のアプリケーションウィンドウへボタンやテキストフィールドなどをドラッグドロップする。これらのオブジェクトの外見や動作はプロパティパレットを使って編集する。

 その後 Transcript 言語を使ってそれぞれのオブジェクトにコードを書き込む。コードはオブジェクトと直接結びつけられている。(例えばそのボタン用のコードがボタン自身に書かれているなら、そのボタンをコピーペーストして使用できる) オブジェクトのプロパティは開発環境のプロパティパレットから操作するだけでなく、Transcript プログラムから直接変更することも出来る。これはインターフェースの外見や動作を、アプリケーション動作時に決めることが出来ることを意味する。

 コンパイル/リンク/テスト、の繰り返しは不要である。テスト用ランタイム環境、インターフェースビルダー、そしてプログラムエディタは全てひとつにまとめられている。他の環境に切り替えることなく、アプリケーションのテスト中にそのままコードを編集して、インターフェースを変更することも出来る。 Development メニューの 'Suspend Revolution UI' を利用すれば、開発用パレットなどの Revolution パーツを排除して、「クリーンな」環境でアプリケーションをテストすることも出来る。

 全てのテストが済んだら Distribution Builder を使って、ダブルクリックで起動するスタンドアローンアプリケーションにコンパイルする。あなたは Revolution のサポートするいずれかの、或いは全てのプラットホーム用のスタンドアローンを作ることが出来る。あなたの仕上げたアプリケーションは、各プラットホームに最適化された外見と動作を備え持つだろう。

 Revolution と Transcript 言語は豊富な機能と複雑な処理をする能力をを持ち、その学習カーブはゆるやかである。経験豊かなプログラマであれば、チュートリアルを済ませたあと、ほんの数時間でアプリケーションを作り始めることが出来るだろう。


The Revolution Development Environment
Revolution の開発環境
 統合された開発環境の中には、インターフェースビルダー、コードエディタ、デバッガ、ランタイム環境、そしてアプリケーションビルダーと言った、アプリケーションを作るのに必要なツールが全て含まれている。開発用のメニューやパレットやダイアログボックスは全て Revolution で作られている。これは単に Revolution エンジンのパワーやスピードを誇示するためにあるのではなく、必要ならこれらを調べたり、カスタマイズすることが出来ることを意味する。

 Revolution のアプリケーション作成でよく使われる基本ツールとその使い方については、全てチュートリアルに書かれている。ここではその概要を説明する:

The browse and pointer tools:
ブラウズツールとポインタツール:
 Revolution では、ドローツールでよく見られるようなツールパレットから、様々なツールを選択してインターフェースを作り上げる。ツールパレットを表示するには、Tools メニューから 'Tools Palette' を選択する。最もよく使われるのは、上部にある2つのツールである。

 左側にある手の形をしてたものはブラウズ( Browse )ツールと呼ばれる。ボタンをクリックしたり、フィールドにテキストを入れるなど、ブラウズツールを使ってアプリケーションの動作テストをすることが出来る。

 右側にある矢印の形をしたものはポインタ( Pointer )ツールと呼ばれる。ポインタツールはアプリケーションウィンドウ上のオブジェクトを選択する時に使われる。フィールドやボタンなどのオブジェクトを選択するには、ポインタツールでオブジェクトをクリックする。

The Properties palette:
プロパティパレット:
 プロパティとは、Revolution オブジェクトの属性のことである。それぞれのオブジェクトは、そのオブジェクトの外見や動作を決定する、組み込みのプロパティを持っている。また、任意のオブジェクトにカスタムプロパティを設定することが出来、そこにはどんなデータでも入れることも出来る。

 選択されているオブジェクトのプロパティにアクセスするには、Object メニューの 'Object Properties' を選択する。プロパティパレットの上部にはこのようなタブが並んでいる:
* 基本プロパティ (全てのオブジェクトに共通)(basic)
* オブジェクトのスクリプト(script)
* オブジェクトのカスタムプロパティ(custom properties)
* そのオブジェクトに特有のプロパティ(ボタンなどのオブジェクトでは、このタブが2つある)

The script editor:
スクリプトエディタ:
 スクリプトエディタを使うには、オブジェクトのプロパティパレットで Script タブをクリックする。各オブジェクトは自分のスクリプトを持っている。スクリプトは Transcript コードで書かれており、オブジェクトの中にある。

 Revolution のスクリプトエディタはテキストスタイルをサポートしているので、強調したい部分のカラーやフォントを変更したり、書きかけのコードに目印を付けたりすることが出来る。スクリプトエディタを開いている時に Script メニューから 'Find and Replace' を選択すれば、スクリプトを検索することも出来る。

The message box:
メッセージボックス:
 メッセージボックスは、簡便なコマンド実行環境であり、ミニコンソールであり、計算機であり、また簡易コマンドテスターでもある。メッセージボックスで直接コマンドを実行したり、任意の式を評価させることが出来る。

 メッセージボックスを開くには、Tools メニューから 'Message Box' を選択する。

The Application Overview:
アプリケーションオーバービュー:
 オーバービュー(Application Overview)は、Revolution が開いている全てのファイルの全階層構造を表示するものである。ここでオブジェクトツリーをブラウズして、オブジェクトのプロパティやスクリプトにアクセスしたり、マルチメディアオブジェクトをプレビューしたり、オブジェクトの読込、移動、削除をすることが出来る。

 オーバービューを開くには、View メニューから 'Application Overview' を選択する。


Revolution's Object Model
Revolution のオブジェクトモデル
 Revolution のオブジェクトモデルは、オブジェクトベースである。オブジェクトには12のクラスがあり、それらはオブジェクト階層の中に組み込まれている。そしてオブジェクトは上位の階層の動作を継承する。ユーザーの操作やその他のイベントが起きると、Revolution エンジンが送るメッセージや、オブジェクト階層に沿って他のオブジェクトから送られてくるメッセージによって、プログラムが起動する。2つの例外を除いて、全てのオブジェクトは視覚情報を持っている。

 オブジェクトは「〜である」ではなく「〜の一部としての〜」という形で他のオブジェクトとの関係を持っている。それぞれのオブジェクトはより上位の他のオブジェクトの一部である。例えばウィンドウにあるボタンはウィンドウの様々な情報を継承するが、ボタンはウィンドウの一種ではなく、あくまでウィンドウの一部である。

Object types:
オブジェクトタイプ:
 Revolution のウィンドウはスタックと呼ばれる。そしてスタックはその他の全てのオブジェクトを含む、オブジェクト階層のトップに位置する。 Revolution の各ウィンドウもスタックで出来ている。 Revolution のパレット、ダイアログボックス、そして標準的なウィンドウも、全てスタックである。

 Revolution の各ファイルはひとつ以上のスタックを含んでいる。一番最初のスタックはメインスタックと呼ばれ、そのファイル内の全スタックのオブジェクト階層の一部である。その他のスタックはそのメインスタックのサブスタックと呼ばれる。ファイル内のメインスタックを入れ替えるには、the mainStack プロパティを変更するか、アプリケーションオーバービューを使う。

 各スタックはカードと呼ばれるスクリーン情報を1つ以上持つことが出来、それは二重にリンクされたリストで結ばれてる。カードはスタックウィンドウ内の部品の入れ物であり、一度に1つしか表示することは出来ない。各カードは異なったオブジェクトのセットを持つこともできるし、全てのカードで同じオブジェクトを共有することも出来る。スタックはカードの集まりであると言うことも出来る。

 各カードは、ボタン、テキストフィールド、ビットマップイメージ、ベクターグラフィック、スクロールバー、ビデオプレイヤーとサウンドプレイヤー、そして( Unix システムでは) EPS オブジェクトを持つことが出来る。これらのオブジェクトはユーザーインターフェースとして働くので、コントロールと呼ばれる。

 1つ以上の任意のコントロールをまとめてグループにすることが出来る。コントロールがグループに含まれている時、そのグループはコントロールのオブジェクト階層の一部となる。グループに1つ以上のグループを入れて、グループをネストすることも出来る。また、グループはスタック中の複数のカードで表示させることが出来る。

 最後に、オーディオクリップ(audio clip)とビデオクリップ(video clip)は、サウンドやムービーのデータを持つオブジェクトである。オーディオクリップもビデオクリップもスタックウィンドウには現れない。そしてどちらも直接スタックに属するオブジェクトである。

Messages and the message path:
メッセージとメッセージパス:
 メッセージパスとは、何らかの要求に対して、どのオブジェクトが反応するかを決定するためのルールである。

 各メッセージには最初のターゲットがある。それはそのメッセージが最初に送られたオブジェクトである。例えばユーザーがウィンドウの中をクリックすると、クリックされたオブジェクトに mouseDown メッセージが送られる。もしそのオブジェクトがメッセージに対応したハンドラを持っていない場合は、そのメッセージはオブジェクト階層に従って次のオブジェクトに渡される。もしそのオブジェクトもメッセージのハンドラを持っていなければ、オブジェクト階層のトップに辿り着くまで、同様にして次のオブジェクトに渡され続ける。

 pass コマンドや send コマンドを使って、通常のメッセージパスを飛び越えることが出来る。 また insert script コマンドや start using コマンドを使って、メッセージパスの指定した位置に、オブジェクトを挿入することも出来る。

 Revolution は、キーボードタイピングなどのユーザーのアクションや、システムイベントに反応して、メッセージを送ってくる。 Revolution のメッセージの完全なリストは Revolution documentation の Transcript Dictionary セクションにある。また自分で定義したカスタムメッセージを任意のオブジェクトに送り、そのメッセージ用に書いたハンドラを実行させることも出来る。

Event-driven programming:
イベント駆動型のプログラミング:
 Revolution は基本的にイベント駆動型である。全ての Transcript コードはメッセージハンドラの中にある。メッセージを受け取ったオブジェクトのスクリプトに、そのメッセージに対応するハンドラがあれば、メッセージを受け取った時に、そのハンドラが実行される。

 イベントループや main() 関数は存在しない。スタックがオープンした時、カードが開いた時、そしてアプリケーションが起動した時に、Revolution はメッセージを送る。アプリケーションの初期化が必要な場合は、これらのメッセージを受け取るハンドラを書けばよい。

Scripts:
スクリプト:
 各オブジェクトはスクリプトを持つことが出来、そこに含まれる全ての Transcript コードはそのオブジェクトと関連づけられている。スクリプトも、set コマンドで操作可能なプロパティのひとつである。各オブジェクトのコードは各オブジェクトの付属物であり、それはオブジェクトと同じファイルに保存される。


The Transcript Language
Transcript 言語
 Transcript は英語に似た文法を持っており、可読性とメンテナンス性に優れている。スクリプトは内部でバイトコードのような表現にコンパイルされるので、インタプリタ言語の柔軟性を持ちながら、コンパイル言語特有のスピードを持ち合わせている。

 ステートメントは改行かセミコロンで区切らなければならない。スクリプトエディタは制御構造を示すためにオートインデントでスペースを挿入するが、Transcript スクリプトはスペースを厳密には解釈しない。また大文字小文字を区別しない。

Script structures:
スクリプトの構造:
 各オブジェクトのスクリプトには、ハンドラと呼ばれるルーチンが1つ以上ある。ハンドラには4つのタイプがある:

* メッセージハンドラは、オブジェクトがそのメッセージを受け取った時に実行される。メッセージハンドラは on で始まる。
* 関数ハンドラは、オブジェクト自身、あるいは下位階層のオブジェクトのハンドラから関数コールがあった時に実行され、多くは呼び出したハンドラに値を返す。関数ハンドラは function で始まる。
* SetProp (プロパティセット)ハンドラは、オブジェクト自身、あるいは下位階層のオブジェクトの、特定のカスタムプロパティを設定しようとした時に実行される。 SetProp ハンドラは setProp で始まる。
* GetProp (プロパティ取得)ハンドラは、特定のカスタムプロパティに対する読出し要求があった時に実行される。 GetProp ハンドラは getProp で始まる。

 ひとつのオブジェクトのスクリプトにはこれらの任意のタイプのハンドラを含めることが出来る。それぞれのタイプのハンドラの数に制限はない。

Parameters:
パラメータ:
 ハンドラには、値、或いは参照のパラメータを渡すことが出来る。パラメータの名前はハンドラの最初の行で定義する。各パラメータはカンマで区切られる。

 例えば、あるカスタムメッセージ用のハンドラの第1行は、こんな感じになる:

  on myMessage firstParam,secondParam,thirdParam
 この 'myMessage' はハンドラ名であり、同名のメッセージが来た時にこのハンドラが実行される。このハンドラには 'firstParam'、'secondParam'、そして 'thirdParam' の3つのパラメータを渡すことが出来る。このハンドラを呼び出す文はこのようになる:
  myMessage "Some string", 2, 8+4
 もし呼び出し側でパラメータに値を入れなかった場合は、ハンドラ側は空の文字列を受け取る。

 また param、paramCount、params 関数を使うと、ハンドラ内で明示的に宣言されていないパラメータにアクセスすることが出来る。これを利用すれば、任意の数のパラメータをハンドラに渡すことが出来る。

Variables and sources of value:
変数と、値のソース:
 Transcript はスカラー変数と配列をサポートする。このため、配列の要素をアクセスするキーに整数以外の値を用いることも出来る。

 配列はサポートされるが、一方で Transcript は型を持たない言語である。コンパイラは数値を扱う時に内部で適切なキャスト(型変換)を行うが、Transcript 開発者から見れば全ての変数は文字列であり、変数の型を割り当てる必要は無い。変数(やその他の値のソース)の型を調べるには、is a オペレータ、または is not a オペレータを使う。

 変数にはテキストもバイナリデータも入れることが出来る。変数に値を入れるには put コマンドを使う:
  put "something or other" into myVariable
 ローカル変数は宣言や初期化を必要としない。もし存在しない変数に値を入れようとすると、ローカル変数が作られて、その値で初期化される。( explicitVariables グローバルプロパティを true にすれば、全ての変数に宣言が必要になる)

 デフォルトでは変数のスコープはカレントハンドラである。オブジェクトローカルやグローバルな変数を宣言するには、local、global コマンドを用いる。その際に変数を初期化することも出来るが、特に指定が無ければ宣言された変数は空の文字列で初期化される。

 Transcript では変数以外に、関数、パラメータ、オブジェクトプロパティ、フィールドテキスト、そして URL を値のソースとして利用することが出来る。一般的に、これら値のソースは、変数に入れ直すことなくそのまま Transcript の式の中に置くことが出来る。例えばこの Transcript スクリプトは、フィールドテキストと、変数と、関数の返値とを合計している:
  (field "Some Number") + someNumericVar + currentSum()
Control structures:
制御構造:
 Transcript は、これら標準的な制御構造をサポートする:

* repeat: repeat 制御構造はひとまとまりのステートメントを、指定回数だけ、条件が true である間、カウンターが指定値以上になるまで、或いは exit repeat で明示的に抜けるまで、繰り返し実行する。
* 条件文: if 制御構造を使って、条件に合ったときにだけステートメントのセットを実行させることが出来る。
* switch: switch 制御構造を使って、多くのケースから実行条件を選ぶことが出来る。
* try/catch/throw: try コントロールを使うと、エラーハンドリングを含めたステートメントを実行することが出来る。

 制御構造は任意の深さでネストが可能である。

Calling subroutines and functions:
サブルーチンコールと関数:
 Transcript は、メッセージハンドラとして実装されるサブルーチンと、関数ハンドラとして実装される関数とを区別する。

 メッセージハンドラを呼ぶには、その名前を(必要ならパラメータを付けて) Transcript のステートメントと同じように使うだけで良い。呼び出したオブジェクト自身のスクリプト内にあるハンドラだけでなく、他のオブジェクトにあるハンドラも実行することが出来る。メッセージはカレントオブジェクトから通常のメッセージパスを通って送られていく。

 任意のメッセージを send コマンドで送れば、メッセージパスを越えて任意のオブジェクトのメッセージハンドラを起動することも出来る。

 関数ハンドラを呼ぶには、式の中でその名前を(括弧で囲った)パラメータと共に、使うだけでよい。関数ハンドラはメッセージハンドラと同じメッセージパスを通る。関数コールはこのようになる:
  put someFunction(firstParam,secondParam) into myVariable
  put myFunction() into field "Help"
 value 関数を利用すれば、メッセージパスを越えて、別のオブジェクトにある関数ハンドラを利用することも出来る。

 関数ハンドラでは、return 制御構造を使って、呼び出したハンドラに値を返すことが出来る。

Libraries and code re-use:
ライブラリと、コードの再利用:
 メッセージ継承階層を利用すれば、ひとつのハンドラで複数のオブジェクトをコントロールすることが出来る。例えば、カード上のオブジェクトをクリックするとカードスクリプトの mouseDown ハンドラが反応するのは、カード上のコントロールがカードというオブジェクトよりも下の階層にあるからである。同じように、スタックスクリプトはスタック上のどのオブジェクトに対しても反応する。メッセージ継承階層のどこにハンドラを置くかを工夫すれば、オブジェクト間のコードの重複を避けることが出来る。

 メッセージを最初に受け取ったオブジェクトを target 関数で調れば、階層の下の、特定のオブジェクトにだけ反応するようにフィルタをかけることも出来る。

 insert script コマンドを使うと、任意のオブジェクトをメッセージ階層に加えることが出来る。スタックで再利用したいハンドラを任意のオブジェクトに置いて、insert script コマンドでそのオブジェクトをメッセージ階層に加えれば、スタックのどこからでも使えるコードライブラリとして機能する。このオブジェクトのスクリプトにあるハンドラは Revolution のどのハンドラからも利用出来る。


The Development Process
開発プロセス
 以下は Revolution を使った基本的なアプリケーション開発プロセスの概要である。より具体的な情報を得るにはチュートリアルを実行しなさい。

1. Revolution によるアプリケーション開発の最初のステップは、新しいメインスタックを作ることである。多くはこのスタックがアプリケーションのメインウィンドウとなる。

2. 次に、パレットやダイアログボックスなど、アプリケーションに必要となるその他のウィンドウを、メインスタックの中のサブスタックとして作る。これはアプリケーションをひとつのファイルにまとめる効果がある。

3. 次に、アプリケーションの各ウィンドウに、プッシュボタン、ポップアップメニュー、テキストフィールド、リストフィールドなどの必要なコントロールを作る。各コントロールは Object メニューの 'New Control' サブメニューからも作ることが出来る。

4. Tools メニューの Menu Manager を利用して、クロスプラットホーム対応のメニューバーをアプリケーションに加える。

5. 最後に、各オブジェクトの動作に必要なコードやライブラリルーチンを、各オブジェクトに書く。

 この開発プロセスは従来の開発手法と全く逆である。 Revolution ではまずインターフェースを作り、それから各インターフェース部品のコードを書くのが一般的に効率的である。(もちろんこの過程の中でインターフェースやコードの修正/変更/追加を簡単に行うことが出来る)

 作ったアプリケーションはクロスプラットホームにほぼ対応できているが、機能や表示を最適化するためには、いくらかの変更が必要になる。 Transcript 言語のプラットホーム間の違いについては、Transcript Dictionary に書かれている。 View メニューの 'Look and Feel' サブメニューを使えば、アプリケーションの任意のプラットホーム上のルック&フィールをプレビューすることが出来る。

 全てが終わったら File メニューの 'Build Distribution' を選択して、配布しようとするプラットホーム用のスタンドアローンアプリケーションを作る。 Distribution Builder は、あなたの選択した各プラットホーム用のネイティブアプリケーションを作ることが出来る。

邦訳/文責:UDI
2002.12.26
2003.01.04

inserted by FC2 system