第11回 アプリケーションの構成 ~CUI自動販売機の完成!~.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
4 相互作用図 後半 FM13001 青野大樹.
オブジェクト指向プログラミング(4) 静的分析(2)
アルゴリズムとデータ構造1 2005年7月8日
~手続き指向からオブジェクト指向へ(Ⅰ)~
アルゴリズムとデータ構造 2010年7月5日
プログラミング基礎I(再) 山元進.
アルゴリズムとプログラミング (Algorithms and Programming)
第14回 GUIの構成とイベント・ドリブン ~GUIを使ったプログラム(Ⅰ)~.
変数のスコープの設計判断能力 を育成するプログラミング教育
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
オブジェクト指向入門.
アルゴリズムとデータ構造 2011年6月20日
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
プログラミング演習3 第2回 GUIの復習.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
~手続き指向からオブジェクト指向へ[Ⅱ]~
オブジェクト・プログラミング 第12回 状態遷移図 シーケンス図.
アルゴリズムとプログラミング (Algorithms and Programming)
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
47070 オブジェクト指向モデリング [7] 2001年11月 12日.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
WebサービスII (第7回) 2007年11月7日 植田龍男.
アルゴリズムとデータ構造1 2006年7月4日
第1回 プログラムの基本 他人が読めるプログラムを書く.
プログラミング演習3 第2回 GUIの復習.
Jakarta Struts (2) ソフトウェア特論 第11回.
UML関係のTIPS 2008年5月26日 2010年5月16日改訂 海谷 治彦.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
実装編②HashTable,JavaAPI
オブジェクト プログラミング 第2回 プログラムの基本.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
サブゼミ第7回 実装編① オブジェクト型とキャスト.
第8回 データを収納する (スタックとキュー)
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年7月2日
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
第5回 プログラミングⅡ 第5回
プログラム分散化のための アスペクト指向言語
アルゴリズム入門 (Ver /10/07) ・フローチャートとプログラムの基本構造 ・リスト ・合計の計算
JAVA入門⑥ クラスとインスタンス.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
アルゴリズムとデータ構造 2012年6月21日
ソフトウェア工学 知能情報学部 新田直也.
より分かりやすい ユースケースモデルを作る
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト・プログラミング 第10回 オブジェクト指向設計のキモ.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

第11回 アプリケーションの構成 ~CUI自動販売機の完成!~

学習目標 簡単なオブジェクト指向アプリケーションが書ける 関連の実装ができる オブジェクトの構造を構成できる シーケンス図が読める

11.1 プログラムの仕様を決める 11.1.1 自動販売機が提供するサービス

自動販売機アプリケーション CUI(Character User Interface)による、自動販売機アプリケーションの構築 どのようなアプリケーションを作るの? >商品を選択してください [1]コーラ [2]ソーダ [3]お茶 プログラムの仕様を決めよう >お金を入れてください 100

11.1.1 自動販売機が提供するサービス あなたが考える、自動販売機が行う主なサービスを考えてみよう

自動販売機が提供するサービス 管理者に対するサービス 商品種類の管理 商品の在庫管理 ユーザ(購入する人)に対するサービス 商品の購入

目的の階層構造 自動販売機を管理する(管理者) 商品種類を管理する 在庫を管理する 商品種類を追加する 商品種類を削除する 取扱っている商品種類を確認する 在庫を管理する 商品を補充する 在庫を確認する

商品を購入する ユーザへのサービスを考える 商品を購入する 金を投入する 商品を選択する 商品を受け取る おつりを受け取る 今度は少し詳しく目的を書いてみよう

商品を購入する(詳細) 商品を購入する 階層が深くなるにつれ、 目的が手段に近くなる 金を投入する 商品を選択する 商品を受け取る 投入金勘定に金を追加する 商品を選択する Idを指定する 商品を受け取る 商品種類を検索する 商品保管庫を取得する 商品保管庫から商品を取り出す 商品を表示する おつりを受け取る おつりを計算する おつりを表示する 投入金勘定をリセットする 階層が深くなるにつれ、 目的が手段に近くなる (細かくなりすぎないよう 分かりにくくならない程度 まで書けばよい)

1.2 オブジェクトの構造を考える 11.2.1 これまで作ったプログラム 11.2.2 オブジェクトの構造をつなげるには 11.2.3 オブジェクトの構造を構築するための実装

11.2.1 これまで 作ったプログラム 自動販売機を管理する(管理者) 商品種類を管理する 在庫を管理する 商品種類を追加する 商品種類を削除する 取扱っている商品種類を確認する 在庫を管理する 商品を補充する 在庫を確認する いままで作ったプログラムを つなげればできるはず

①商品種類管理プログラム クラス図 インスタンス図 商品種類 - 商品番号 - 商品名 - 価格 商品種類リスト + 追加() + 削除() 1 0..n クラス図 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 インスタンス図 リストA :商品種類リスト 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 種類C:商品種類 商品番号=1004 商品名=DDレモン 価格=120

②商品管理プログラム クラス図 インスタンス図 商品A:商品 製造年月日=2002/1/21 商品B:商品 保管庫A :商品保管庫 製造年月日=2002/1/22 商品C:商品 製造年月日=2002/1/23

11.2.2 オブジェクト の構造をつなげるには ①商品と商品種類の関係 クラス図 インスタンス図 日付だけでは どのような種類か 商品A:商品 製造年月日=2002/1/21 インスタンス図 保管庫A :商品保管庫 商品B:商品 製造年月日=2002/1/22 日付だけでは どのような種類か わからない 商品C:商品 製造年月日=2002/1/23

解決案Ⅰ 商品に名前と価格を加える クラス図 インスタンス図 保管庫A :商品保管庫 商品保管庫 + 追加() + 削除() 商品  商品  - 商品名 - 価格 - 製造年月日 クラス図 商品A:商品 商品名=コーラ 価格=120 製造年月日=2002/1/21 インスタンス図 保管庫A :商品保管庫 商品B:商品 商品名=コーラ 価格=120 製造年月日=2002/1/22 商品C:商品 商品名=ソーダ 価格=120 製造年月日=2002/1/23

解決案Ⅱ 商品と商品種類をリンクする 商品保管庫 + 追加() + 削除() 商品 - 製造年月日 0..n 1 商品種類 - 商品番号 - 商品名 - 価格 商品A:商品 製造年月日=2002/1/21 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 保管庫A :商品保管庫 商品B:商品 製造年月日=2002/1/22 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 商品C:商品 製造年月日=2002/1/23

どちらがよい解決法か? どちらでもうまくいく。 問題はどちらがよいプログラムになるか 利点・欠点を挙げてみよう

ポイントⅠ 価格の変更はどちらがしやすいか 商品に名前を加えた場合 商品種類とリンクする場合 商品からある名前の商品をすべて検索して、すべて書き換える必要がある 商品種類とリンクする場合 商品種類一ヶ所ですむ

ポイントⅡ ユーザが商品を買う時を考える 「商品」を選ぶのか、「商品種類」で選ぶのか 取り扱っている商品を知る必要があるか その種類の商品がなくなってしまった場合、売り切れなのか、それとも取り扱っていないのか区別する必要があるか 自動販売機の場合、 「商品」も「商品種類」も別の意味を持っている →意味ごとにまとめてカタマリに

②商品種類と 商品保管庫の関係 問題点 異なる商品がおなじ保管庫に入っている コーラA:商品 製造年月日=2002/1/21 コーラB:商品 :商品保管庫 コーラB:商品 製造年月日=2002/1/22 ソーダA:商品 製造年月日=2002/1/23

解決案 種類ごとに保管庫を用意する 種類A:商品種類 コーラA:商品 商品番号=1001 商品名=コーラ 製造年月日=2002/1/21 価格=120 コーラA:商品 製造年月日=2002/1/21 コーラ保管庫 :商品保管庫 コーラB:商品 製造年月日=2002/1/22 ソーダ保管庫 :商品保管庫 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 ソーダA:商品 製造年月日=2002/1/23

2つのプログラムの結合 下図のようなインスタンス構造ができる クラス図を書いてみよう コーラA:商品 種類A:商品種類 製造年月日=2002/1/21 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 コーラ保管庫 :商品保管庫 コーラB:商品 製造年月日=2002/1/22 リストA :商品種類リスト ソーダ保管庫 :商品保管庫 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 ソーダA:商品 製造年月日=2002/1/23

解答例

11.2.3 オブジェクト の構造を構築するための実装 ①商品と商品種類 ②商品保管庫と商品種類 ③既に実装されている部分 関連

①商品と商品種類 クラス図 インスタンス図 商品種類 商品 - 商品番号 - 製造年月日 - 商品名 - 価格 種類A:商品種類 製造年月日=2002/1/21 インスタンス図 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 商品B:商品 製造年月日=2002/1/22 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 商品C:商品 製造年月日=2002/1/23

①商品と商品種類 参照を追加 コンストラクタで 参照を設定 取得メソッドを追加 例題11-1 (Item.java) //商品クラス(抜粋) public class Item { private String date;//製造年月日 private ItemType itemType;//商品に対応する商品種類 //コンストラクタ public Item(String newDate,ItemType newItemType) { date = newDate; itemType = newItemType; } //商品に対応する商品種類を取得する public ItemType getItemType() { return itemType; 参照を追加 コンストラクタで 参照を設定 取得メソッドを追加

②商品保管庫と商品種類 クラス図 インスタンス図 種類A:商品種類 コーラ保管庫 商品番号=1001 :商品保管庫 商品名=コーラ 価格=120 コーラ保管庫 :商品保管庫 ソーダ保管庫 :商品保管庫 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120

②商品保管庫と商品種類 コンストラクタで 保管庫を生成 例題11-1 (ItemType.java) //商品種類クラス(抜粋) public class ItemType { private int id; //商品ID private String name; //商品名 private int price; //価格 private ItemStock itemStock; //この種類の商品だけを格納する商品保管庫 //コンストラクタ public ItemType(String newName,int newPrice,int newID) { name = newName; price = newPrice; id = newID; itemStock = new ItemStock(); } //商品保管庫を取得する public ItemStock getItemStock(){ return itemStock; コンストラクタで 保管庫を生成

③既につながっている部分 商品と商品保管庫の関連 前回キューで実装されている クラス図 インスタンス図 商品A:商品 製造年月日=2002/1/21 インスタンス図 保管庫A :商品保管庫 商品B:商品 製造年月日=2002/1/22 商品C:商品 製造年月日=2002/1/23

③既につながっている部分 その他 商品種類と商品種類リスト 配列や連結リストを使って実装した 金と勘定 前回にスタックを利用して実装した

④関連の実装 まとめ 1対1の実装 1対多の実装 発展 参照で実装 コンストラクタで設定、または生成 取得メソッドを実装 ④関連の実装 まとめ 1対1の実装 参照で実装 コンストラクタで設定、または生成 設定メソッドを用意しても良い 取得メソッドを実装 1対多の実装 配列や、連結リストを使って実装 方法はその他いろいろある 追加、削除メソッドを実装 発展 双方向の参照を持つにはどうすればよいか

11.3 オブジェクト の構造を構築、操作する 11.3.1 オブジェクトの構造を構築、操作するプログラム 11.3.2 シーケンス図 ①商品種類を生成して、リストに追加する ②商品を生成して、補充する ③金を投入し、商品を購入する 11.3.2 シーケンス図 ①記法 ②シーケンス図例

11.3.1 オブジェクトの 構造を構築・操作するプログラム ①商品種類を生成して、リストに追加する 例題11-1 (Example11_1.java)「A」 ソーダ保管庫 :商品保管庫 コーラ保管庫 :商品保管庫 /** * 商品種類の管理、商品の管理、商品の販売を行うプログラム */ public class Example11_1 { //メイン public static void main(String[] args) { ItemTypeList itemTypeList = new ItemTypeList(); //商品種類リストを生成 Account account = new Account(); //投入金勘定を生成 //--------管理者-------- //商品種類を追加 itemTypeList.add(new ItemType("cola",120,1001)); //コーラを追加 itemTypeList.add(new ItemType("soda",120,1002)); //ソーダを追加 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 リストA :商品種類リスト

②商品を生成して、補充する 例題11-1 (Example11_1.java)「B」 ソーダ保管庫 :商品保管庫 コーラ保管庫 :商品保管庫 製造年月日=2002/1/22 商品A:商品 製造年月日=2002/1/21 例題11-1 (Example11_1.java)「B」 ソーダ保管庫 :商品保管庫 コーラ保管庫 :商品保管庫   //コーラ在庫を追加 //コーラの保管庫を取得 ItemStock colaStock;//コーラの保管庫 ItemType colaItemType;//コーラ商品種類 colaItemType = itemTypeList.search(1001); //コーラ商品種類を検索 colaStock = colaItemType.getItemStock();//コーラ保管庫を取得 //コーラを補充 colaStock.supply(new Item("2002/04/28",colaItemType)); colaStock.supply(new Item("2002/04/29",colaItemType)); 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 リストA :商品種類リスト

③金を投入し、商品を購入する <練習問題> インスタンスの構造 を書いてみよう 例題11-1 (Example11_1.java)「C」 //商品を購入する //金を投入する account.insert(new Money(100)); //100円投入 account.insert(new Money(50)); //50円投入                    //商品を選択する int id = 1001;//コーラ                   //商品を受け取る //商品を取り出す colaItemType = itemTypeList.search(id);//商品種類を検索 colaStock = colaItemType.getItemStock();//保管庫を取得 Item item = colaStock.takeout(); //商品を一つ取り出す              System.out.println("製造年月日が"+item.getDate()+"の"+item.getItemType().getName()+"を購入しました");                //おつりを受け取る int amount;//投入総額 amount = account.getAmount(); int change;//おつり change = amount - item.getItemType().getPrice(); account.reset();//投入金勘定を空にする               System.out.println("おつりは"+change+"円です"); } <練習問題> インスタンスの構造 を書いてみよう

解答例1 例題11-1 (Example11_1.java)「C」 ソーダ保管庫 :商品保管庫 コーラ保管庫 :商品保管庫 リストA //商品を購入する //金を投入する account.insert(new Money(100)); //100円投入 account.insert(new Money(50)); //50円投入                    //商品を選択する int id = 1001;//コーラ                   //商品を受け取る //商品を取り出す colaItemType = itemTypeList.search(id);//商品種類を検索 colaStock = colaItemType.getItemStock();//保管庫を取得 Item item = colaStock.takeout(); //商品を一つ取り出す              System.out.println("製造年月日が"+item.getDate()+"の"+item.getItemType().getName()+"を購入しました");                //おつりを受け取る int amount;//投入総額 amount = account.getAmount(); int change;//おつり change = amount - item.getItemType().getPrice(); account.reset();//投入金勘定を空にする               System.out.println("おつりは"+change+"円です"); } 商品B:商品 製造年月日=2002/1/22 ソーダ保管庫 :商品保管庫 コーラ保管庫 :商品保管庫 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 リストA :商品種類リスト

解答例2 勘定の変遷 100円投入された時点 50円投入された時点 購入後 投入金勘定 :勘定 投入金勘定 :勘定 投入金勘定 :勘定 金B:金 値=50 金A:金 値=100 50円投入された時点 投入金勘定 :勘定 購入後 金A:金 値=100 投入金勘定 :勘定

12.3.2 シーケンス図 構造が変化する過程を図式化する ex)このような構造が どのように構築されたか シーケンス図 ソーダ保管庫 :商品保管庫 コーラ保管庫 :商品保管庫 ex)このような構造が どのように構築されたか 種類A:商品種類 商品番号=1001 商品名=コーラ 価格=120 種類B:商品種類 商品番号=1002 商品名=ソーダ 価格=120 シーケンス図 リストA :商品種類リスト

①記法 インスタンス (インスタンス名:クラス名) 時間軸 メッセージのやり取り (メソッドのコール)

②シーケンス図例 (1)商品種類を生成して、リストに追加する

(2)商品種類を生成して、リストに追加する

(3)金を投入し、商品を購入する 記述してみましょう

(3)金を投入し、商品を購入する 解答例

シーケンス図で明らかになること シーケンス図を書く利点を議論してみよう

シーケンス図の利点 時間の流れに沿ってオブジェクトの構造の変化の過程を追える クラス図、オブジェクト図では明らかでない動的な変化を追える オブジェクトのメッセージのやり取り(メソッドの呼び出し)を追える そのオブジェクトにどのような役割があるかが分かりやすくなる そのオブジェクトがどのようなメッセージを受けているのか

1.4 CUIアプリケーションの構築 ①メニューの構成 ②プログラムの構成 ③クラス図 ④ソース

1.4 CUIアプリケーションの構築 メニューを表示してユーザに入力を促す対話型アプリケーション 例題11-2 (CUIVMApp.java) //メインメニュー(CUIVMApp.java(11_2)から抜粋) public void mainMenu(){ //無限ループ while(true){ //ユーザが自動販売機を利用する目的を選ぶ System.out.println("メインメニュー:(1,自動販売機の管理をする 2,自動販売機を利用する q,自動販売機の終了)"); String input = Input.getInput(); //選ばれた目的を実行する if (input.equals("1")){ //自動販売機の管理をする adminApp.adminMenu(); }else if(input.equals("2")){ //自動販売機を利用する userApp.userMenu(); }else if(input.equals("q")){ //自動販売機の終了 System.exit(0); }

①メニューの構成 管理者メニュー メインメニュー ユーザメニュー

②プログラムの構成 CUIAdminApp Example11_2 CUIVMApp CUIUserApp adminMenu() addItemType() addItem() … main() mainMenu() Example11_2 CUIVMApp CUIUserApp userMenu() insertCoin() selectItemType() …

起動役を分離する 起動役と、本体を分離することによって、より分かりやすいプログラムになります Example11_2 CUIVMApp main() mainMenu() Example11_2 CUIVMApp 起動役 本体

③クラス図 自動販売機機のアプリケーションプログラムは、勘定と商品種類リストだけ知っている 関連をたどることによって、すべてのオブジェクトにたどり着け、構造を変化させることが可能

④ソース Example11_2.java CUIVMApp.java CUIAdminApp.java CUIUserApp.java