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
ScratchとJava http://prezi.com/o1jlsf_celo1/scratchjava/
■SNAP!
Scratchに、ブロック作成機能を加えたプログラム学習環境。
http://byob.berkeley.edu/ ← こちらのページの Run SNAP! Now から利用できる。
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に環境を切り替えて、上記の提出方法を使う。