02. SNAP! でオブジェクト指向(1/2)

出席登録は、課題提出で代用。

先回の Viscuit 作品紹介

2015年度作品:

http://develop.viscuit.com/3.1/Land.html?path=2518958&name=59&smoothMotion=true&dynamicFile=false

http://develop.viscuit.com/3.1/Land.html?path=2518958&name=58&smoothMotion=true&dynamicFile=false

http://develop.viscuit.com/3.1/Land.html?path=2518958&name=42&smoothMotion=true&dynamicFile=false

2014年度作品:

http://develop.viscuit.com/3.1/Land.html?path=2518958&name=40&smoothMotion=true&dynamicFile=false

http://develop.viscuit.com/3.1/Land.html?path=2518958&name=38&smoothMotion=true&dynamicFile=false

http://develop.viscuit.com/3.1/Land.html?path=2518958&name=41&smoothMotion=true&dynamicFile=false

復習用の課題1:

Viscuit で OOPの 継承の概念を解説した。以下の点について確認し、回答する。

確認

OOPで、クラスの継承を用いるメリットはなにか?

クラスとインスタンスの関係は?

インスタンスの持つプロパティ(または変数)は、Viscuitでは、何が相当するか?

親クラスに設定されたルールと 子クラスに設定されたルール が競合する場合( 親 右に動け 、 子 左に動け)

Viscuit ではどのように処理されているか?

他のOOP言語で(例 Java)、親子間でルールの競合がある場合は、どのように処理されるのか、調べる。

WebClassの第2回課題に回答。

今回導入する概念・用語:

オブジェクトの状態と振舞い インスタンス変数 メッセージ 引数

■ Scratch2.0

http://scratch.mit.edu/

ScratchとJava http://prezi.com/o1jlsf_celo1/scratchjava/

■SNAP!

Scratchに、ブロック作成機能を加えたプログラム学習環境。

http://byob.berkeley.edu/ ← こちらのページの Run SNAP! Now から利用できる。

SNAP!のページ ← 直接利用するには、こちらから。

SNAP!マニュアル

特徴:

関数スタイルのコード作成が可能。

独自の制御ブロックを作成することができる。

再帰呼び出しのプログラムも可能。

※ Chrome ブラウザからの利用を推奨

■演習内容

http://byob.berkeley.edu/ から run SNAP! now で、SNAP!のプログラムを作成し、以下の内容を確認。

言語は英語環境になっているので 歯車アイコン から Language を 日本語 に切り替えておくとよい。

SNAP!マニュアル P30~

クラスとインスタンス

確認内容:

・スプライト固有の変数

・スプライトのクローン

クローンの位置・向き・サイズ・画像

SNAP!は、プロトタイプベースのオプジェクト指向プログラミング

変数を新しく作る から 変数を作成

global_a を全てのスプライト用で作成

class_a をこのスプライトに用で作成

※注 クローンは オリジナルと同じ位置に、重なって作成されます。クローン作成後、マウスで移動してください。

※注 SNAP!のスプライトの クローン は、クローンした時点のオリジナルのスプライトのコードを引き継ぎます。

※クローンを削除するブロックはクローンのコードで利用する。クローンを実行中に自分自身を破壊するブロック。オリジナルのスプライトは削除されない。

※プログラムの停止ボタン(赤丸)を押すと、クローンは消える。

作業例)

グローバル変数(全スプライト共用) と クラス変数(あるスプライト専用)

2つ目以降のスプライトはコスチュームを編集して見た目で区別がつくようにしておく。

クラス変数 と インスタンス変数(クローンのプロパティ。座標や向きなど)

クローンを新規作成した場合、XY座標や向きなどは元のスプライト同じ値に初期化される。

マウスやプログラムで、各クローンに個別のプロパティ(座標や向きなど)を操作できる。

その他の変数:

SNAP! で利用できる変数の種類は、以下のとおり。

スプライト全体で共用の変数

固有のスプライト専用の変数

スクリプト変数(スクリプト変数ブロックで一時的に作成した変数。ブロックの実行終了時に消滅する)

カスタムブロックの引数(自作ブロックを作成した際に、パラメータとして渡す変数。カスタムブロックの実行開始時に生成され、終了時に消滅する)

関数オブジェクトの引数

継続の引数

※関数の再起呼び出し、ブロックの再起呼び出しの際に、引数は毎回新たに生成される(次回説明)

プロパティ(スプライト、スプライトのクローンの 座標・向き・サイズ・コスチュームなどの要素。予め決められた名前と決められたブロックでのみ操作可能)

変数

プロパティ

関数オブジェクト

・計算式ブロック

・関数オブジェクト (関数化(リング化))

・パラメータ適用 (関数呼び出し)

・関数オブジェクトの利用

関数オブジェクト と 関数適用

・ 1 + 3 の計算処理と X + 3の計算処理の例

・計算式を関数化する例 関数オブジェクトを作成し 変数に格納する。 変数に値を適用(代入ではなく、関数オブジェクトの引数として処理される)して関数オブジェクトの処理を呼び出す。

数値を2乗する関数と、関数オブジェクトの利用例)

※ 関数ブロック と 関数オブジェクト の比較

・関数ブロックを変数にセットしようとすると、プログラムの実行時に、関数が計算され、計算結果の数値が変数にセットされる

・関数オブジェクトそのものを変数にセットすることができる。変数にセットされた関数オブジェクトを、別のプログラムから実行することができる。

継続(コンティニュエイション)について

継続は、関数オブジェクトに似ている。

関数オブジェクトは、計算式をオブジェクト化したもの。

継続は、プログラム(上下に接続可能なブロック)をオブジェクト化したもの。

プログラム内部で使用されている変数の値は、継続を作成・保存したときの状態で保存される。

継続は、 プログラムのコード + 実行環境 を記録する仕組み。

SNAP!の継続を、他の言語では ラムダ式 クロージャ(closure) 関数閉包 無名関数 などと呼ぶ。

観覧車の骨組みと籠を描く例)

観覧車の骨組みを描くプログラムの内部で、変数Aにセットされた籠(○)を描くプログラムを利用する。

変数Aに別の籠(△)を描くプログラムをセットすると、観覧車の骨組みを描くプログラムを修正せずに、全体の動作を変更することができる。

※プログラムの合成が可能になる。コードをシンプルかつ柔軟に記述できる。

関数スタイルのプログラミング

SNAP!マニュアル P49~

・再帰呼び出し

・継続

・継続渡しスタイルプログラミング(CPS)

■プログラムの保存と提出など

SNAP!で作成したコードは、IDを取得すればクラウド上に保存できる。

クラウドに保存の他、ブラウザの保存領域(File API利用?)に保存することも可能。

提出方法:

WebClassの第2回課題に SNAP!の今回の演習内容を書き出したXML ファイルをアップロードする。

XMLファイルの作成方法は↓の記述を参照。

今回の課題の提出手順:

1.Fileアイコンから、「プロジェクトを書き出す」を選ぶ。

2.ブラウザのダウンロード領域にXMLファイルとして保存される。

ファイル名: 名称未設定.xml

保存されたファイルをWebClassにアップロードする。

※インターネットエクスプローラーの利用者へ

IEからはプロジェクトを書き出す 機能が使用できない。

対応方法として、

1. クラウド利用の id を登録する。

2. id 登録後、プログラムを クラウドに保存する。

3. google Chrome を起動して、SNAP! のページを表示する。

4. SNAP!にログインする。

5. ファイルを開く。クラウドに保存したプロジェクトを開く。

で、chromeに環境を切り替えて、上記の提出方法を使う。