Comments
Description
Transcript
Stateパターン
専門演習B(木5) Java の復習 • 以下のキーワードで分からないものがある場 合は「プログラミング基礎」の資料で要復習! – 変数、型 – 条件分岐、繰り返し – 関数(メソッド) – クラス、オブジェクト – 配列(array) 題材:心理学実験っぽいアプリ 1. 2. 3. 4. 5. src.zip をダウンロード 解凍 Eclipse で Javaプロジェクトを作成 src フォルダに src.zip の中身をコピー 実行 状態遷移図 状態(ノード) 遷移(エッジ) 状態遷移図の作り方 • 可能な状態をすべて書きだす • 各状態で可能な行動をすべて書きだす (矢印の元) • 各行動の結果の遷移先をつなぐ (矢印の先) サンプルアプリの状態遷移図 ボタン 時間経過 ボタン 時間経過 時間経過 ボタン 状態遷移図からの実装 (復習:Scratchの場合) 1. クリック 2. クリックイベント通知 4. 状態変更を通知 コントローラ (ステージのスクリプト) 3. 状態遷移を決定 (変数statusを変更) 5. 状態(変数status) に合わせて表示を変更 状態遷移図からの実装 (Javaの場合) • 現在の状態を表す変数 state (MainFrame.java を参照) • 各状態に対応するクラスがコントロール – Ini@alState – CountDownState – ShowNumberState – InputAnswerState – ResultState 実装(つづき) • ボタンが押されたとき or 時間経過したとき gotoNextState が実行される (MainFrame) 1. gotoNextState 1. 現在の State が、次の State を返す 2. setState を実行する 2. setState 1. 現在の状態に合わせて、各部品を更新する 2. 必要に応じてタイマーをセットする interface • 必要な関数の一覧を決めておく機能 • 例:今回、状態を表すクラスにほしい機能 – 次の状態を教えてくれる機能 – 各部品の状態を教えてくれる機能 – など • State クラスは interface State を実装 1. implements State と宣言 2. すべてのメソッドを実装 interface (他の例) • Ac@onListener – ac@onPerformed というメソッド1つの interface • buOon.addAc@onListener – ボタンを押したときに ac@onPerformed を実行し てくれるように登録する • 今回は「無名クラス」を作っている 無名(匿名)クラス • 1つしかオブジェクトを作らない簡単なクラス を作るときに、その場でちょちょっと作る機能 Timer • Timer / TimerTask は BuOon / Ac@onListener と似たような関係 – 指定した時間が経ったら する – ボタンが押されたら する • TimerTask は interface ではない – abstract class TimerTask – 継承してクラスを作る 継承 • 親クラスを継承した子クラスは、 親クラスの機能を全部受け継ぐ • 子クラスに独自の機能を追加できる • 例: MainFrame extends JFrame デザインパターン • 「こういうプログラムはこう書くときれいに書け る」という定石のようなもの • 今回の状態遷移のパターンは 「State デザインパターン」などと呼ばれる 課題(どちらか1つ) • 短期記憶アプリの機能追加 – [必須] 正解か不正解かの判定をして表示する – [必須] 実験結果をファイルに保存する – [オプション] 桁数を変更できるようにする • 他の実験 – 反応時間の測定(表示されたのが○○だったら キーを押すけど違ったら押さない etc.) – 結果のファイル保存機能は必須 提出方法 • すべての ~.java をまとめた zip ファイルを 課題提出システムから提出 (授業のHPからリンクあり) ヒント:どんなcomponentがあるか • A Visual Guide to Swing Components – hOp://download.oracle.com/javase/tutorial/ui/ features/compWin.html – How to use … にリンクされている ヒント:ファイルに保存 • プログラミング基礎 「入出力ストリーム」 hOp://www2.kobe-‐u.ac.jp/~tnishida/course/ 2011/Programming/index.htm • どこに保存プログラムを入れるかは悩み所 – 保存ボタンがある State を作る? or いつの間に か保存する? – どこかの getNextState の中に入れてしまう? – interface State を拡張して、MainFrame で保存? ヒント:桁数の変更 • スライダーとかスピナーを追加する ヒント:キーを押すのに反応する • addKeyListener(KeyListener) • KeyListener は interface ヒント:時間の測定 • System.currentTimeMillis メソッドを使う • 1000ミリ秒 = 1秒