JavaFX Scriptプログラム言語を学ぼう

レッスン3:オブジェクトを使う

このレッスンはオブジェクトの使い方の入門です。 高レベルでオブジェクトが何なのかを記述していて、オブジェクトリテラルとインスタンス変数、 インスタンス関数も紹介します。 このレッスンはコンパイル可能なAddressとCustomerの例を挙げます。 実際のアプリケーションでオブジェクトがどのように使われているかを、コードの引用で紹介して 締めくくります。

オブジェクトって何?


JavaFX Scriptプログラム言語はオブジェクト指向言語です。 ですがこれが意味するものは何でしょうか。オブジェクトとは正確には何なのでしょうか。 簡単に言えば、オブジェクトは、状態振る舞いから成る個々のソフトウェアのまとまりです。 ソフトウェアのオブジェクトをより理解することは、少しの間ソフトウェアの外を出て、 あなたが既に親しんでいる概念について考えることを助けます。

あなたのテレビは例えるならオブジェクトです。それは状態(現在のチャンネル、現在の音量、 オン、オフ)と振る舞い(チャンネルを変える、音量を調節する、つける、消す)を持っています。 私達はテレビをひとつのオブジェクトと考えがちですが、実際は、 テレビは多くの他のオブジェクトで構成されています。 (様々な部品がテレビの内部にあるように、正面のボタンとノブはすべてオブジェクトです。) 多くのケースで、これらの小さなオブジェクトも他のオブジェクトで作られています。

私達はテレビの部品を、これ以上できないぐらいまで分解することができます。 (例えば、ネジは実に単一のオブジェクトで、他の何ものでも構成されていません。) もし、あなたが運動の道具や、または何か"組み立てが必要な"何かを買ったことがあれば、 たぶんその書類の中に分解図を見たことがあるでしょう。 そこにはその構造物のすべての単一のオブジェクトが見られます。 一見しただけでどれぐらいのオブジェクトがあるか、 そしてどのようにそれらのオブジェクトがすべて互いに適合するのか、 を理解することができます。 同じことが.fxソースファイルでも言えます。あなたはスクリプトのオブジェクトの全てが アプリケーション全体を形作るのに、どのように適合するのかを簡単に見ることができます。

オブジェクトリテラルの宣言


ソフトウェアのオブジェクトは、コードレベルでは何のように見えるでしょうか。 JavaFX Scriptプログラム言語では、オブジェクトはオブジェクトリテラルで生成されます。

Address {
     street: "1 Main Street";
     city: "Santa Clara";
     state: "CA";
     zip: "95050";
}

これはひとつのAddressオブジェクトを作成していて、仮のアドレスブックアプリケーションに使われます。 それは指定した値でstreet, city, state, zipが初期化されています。 実際のアプリケーションでは、アドレスブックアプリケーションのGUI部品は その下層のAddressオブジェクトと同期していて、画面上に現れるものがプログラムによって 保存されている実際のデータを反映していることが想像できます。

このコードをコンパイルしてみる前に、あなたはもうひとつ知る必要があります。 コンパイラは最初に特別な"設計図"(クラスと呼ばれる)を必要とします。 それはAddressオブジェクトが含むデータがなのかを正確に記述したものです。 (この例では、Addressはstreet, city, state, zipを持っていると言えます。) 私達はあなた独自のクラスの書き方をチュートリアルの最後までは考察しません。 なぜならJavaFXのアプリケーションプログラミングインターフェース(API)は あなたのプログラムにすぐに使える多くの組み込まれたクラスを含んでいるからです。 さらに、JavaFX Scriptプログラム言語はJavaプラットフォーム上に構築されているので、 Javaプログラム言語のAPIにも同様にアクセスすることができます。

そうは言っても、Address.fxファイル(Addressクラスの定義のある)をダウンロードして 前に見せたサンプルコードと同じディレクトリに置けば、Addressの例をコンパイルできます。 (サンプルコードをAddressTest.fxのような違う名前のファイルに必ず保存してください。) このコードには何かを出力するものが何もありませんが、 コンパイルされたということは、オブジェクトの生成が成功したまさしく証拠です。

注意:この例のAddressオブジェクトの変数(street, city, state, zip)は技術的には インスタンス変数として知られています。 あなたはインスタンス変数を組み込まれた属性のセットと考えることができ、 各オブジェクトが含むことを保証されています。 実際、"属性(attribute)"という言葉は初期のJavaFX Script言語で使われていました。 (今もなお古いドキュメントやデモに使われているのをときどき見るかも知れません。) オブジェクト指向プログラミングの世界では、"インスタンス"と"オブジェクト"という言葉は同意語で、 この言葉(注釈:インスタンス変数を指していると思われ)の起源はそこです。

オブジェクトリテラルの構文


オブジェクトリテラルの構文は簡単に学習でき、使うのも直感的でわかりやすいです。 私達の例を続けると、最初の語(Address)があなたが作ろうとしているオブジェクトの型を指定しています。 中括弧で始まって終わっている部分がオブジェクトの本体を定義しています。 他のすべて(street, city, state, zip)はオブジェクトのインスタンス変数を初期化しています。

Address {
     street: "1 Main Street";
     city: "Santa Clara";
     state: "CA";
     zip: "95050";
}

(訳注:原文では例を画像で表示していますが、内容的にそうするまでもないのでテキストで代用します。)

オブジェクトリテラルを記述するときに、インスタンス変数はカンマ、空白、セミコロンで 区切られることに注意してください。いずれも使えますが、私達はこのチュートリアルを通して 全般的にセミコロンを使います。 この構文のもっと形式的な記述方法については、 JavaFX言語リファレンス図 6.38 を参照してください。

あなたは後のアクセスのために変数にオブジェクトを生成することもできます。

def myAddress = Address {
     street: "1 Main Street";
     city: "Santa Clara";
     state: "CA";
     zip: "95050";
}

または、オブジェクトを他のオブジェクトの中にネストすることもできます。

def customer = Customer {
     firstName: "John";
     lastName: "Doe";
     phoneNum: "(408) 555-1212";
     address: Address {
          street: "1 Main Street";
          city: "Santa Clara";
          state: "CA";
          zip: "95050";
     }
}

この最後の例では、Customerオブジェクトはいくつかの新しい変数を導入していて、 address変数にオリジナルのAddressオブジェクトを含んでいます。 オブジェクトがネストを始めるコードをどのようにインデントしたか注意してください。 実際のアプリケーションは大体はたくさんのネストしたオブジェクトを含みます。 このネストのパターンは、一見してどのオブジェクトがどこに属するかを見やすくします。 この例をコンパイルするには、 Customer.fx を現在のディレクトリに追加する必要があります。

実際の使用例:Video Puzzle

(訳注:上の画像は原文が表示している画像そのものです。)

video puzzleのデモは動画のfeedの配信を取得して、それを切り刻んでパズルにします。 ここで私達が強調したコードの部分はオブジェクトリテラルを使っています。 あなたは与えられたクラスになじみがなくても、構文の認識はできるはずです。 このコードの引用では、visibleとcontentのインスタンス変数がGroupオブジェクトに属しています。 インスタンス変数のx, y, width, height,arcWidtg, arcHeight, fill,blockMouseは、 Rectangleオブジェクトに属します。Groupオブジェクトは後でアクセスできるように previewDimOverlay変数に保存されています。

インスタンス関数の呼び出し


インスタンス変数に加えて、オブジェクトはインスタンス関数も同様に含むことができます。 インスタンス関数を呼び出すにはこうタイプします。変数の名前(次の例でのcustomer)、 それに続きドット(".")、それに続きあなたが呼び出したい関数です。

def customer = Customer {
     firstName: "John";
     lastName: "Doe";
     phoneNum: "(408) 555-1212"
     address: Address {
          street: "1 Main Street";
          city: "Santa Clara";
          state: "CA";
          zip: "95050";
     }
}

customer.printName();
customer.printPhoneNum();
customer.printAddress();

出力結果:

Name: John Doe
Phone: (408) 555-1212
Street: 1 Main Street
City: Santa Clara
State: CA
Zip: 95050

前のレッスンで学んだように、インスタンス関数は引数と戻り値を定義することもできます。


Home