• 検索結果がありません。

第 11 回 アプリケーションの 構成

N/A
N/A
Protected

Academic year: 2021

シェア "第 11 回 アプリケーションの 構成"

Copied!
52
0
0

読み込み中.... (全文を見る)

全文

(1)

第 11 回 アプリケーションの 構成

~ CUI

自動販売機の完成!~

(2)

学習目標

簡単なオブジェクト指向アプリケー ションが書ける

関連の実装ができる

オブジェクトの構造を構成できる

シーケンス図が読める

(3)

11.1 プログラムの仕様を決め る

 11.1.1

自動販売機が提供するサービス

(4)

自動販売機アプリケーション

 CUI(Character User Interface)

による、

自動販売機アプリケーションの構築

>

商品を選択してくだ さい

[1]

コーラ

[2]

ソーダ

[3]

お茶

>

お金を入れてくださ

100

どのようなアプリケーションを作るの?

プログラムの仕様を決めよう

(5)

11.1.1

自動販売機が提供するサービ ス

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

(6)

自動販売機が提供するサービ ス

管理者に対するサービス

商品種類の管理

商品の在庫管理

ユーザ(購入する人)に対するサービ ス

商品の購入

(7)

目的の階層構造

自動販売機を管理する(管理者)

商品種類を管理する

商品種類を追加する

商品種類を削除する

取扱っている商品種類を確認する

在庫を管理する

商品を補充する

在庫を確認する

(8)

商品を購入する

ユーザへのサービスを考える

商品を購入する

金を投入する

商品を選択する

商品を受け取る

おつりを受け取る

今度は少し詳しく目的を書いてみよう

(9)

商品を購入する(詳細)

商品を購入する

金を投入する

投入金勘定に金を追加する

商品を選択する

Id

を指定する

商品を受け取る

商品種類を検索する

商品保管庫を取得する

商品保管庫から商品を取り出す

商品を表示する

おつりを受け取る

おつりを計算する

おつりを表示する

投入金勘定をリセットする

階層が深くなるにつれ、

目的が手段に近くなる

(細かくなりすぎないよう 分かりにくくならない程度 まで書けばよい)

(10)

1.2 オブジェクトの構造を考 える

 11.2.1

これまで作ったプログラム

 11.2.2

オブジェクトの構造をつなげる

には

 11.2.3

オブジェクトの構造を構築する

ための実装

(11)

11.2.1 これまで 作ったプログラム

自動販売機を管理する(管理者)

商品種類を管理する

商品種類を追加する

商品種類を削除する

取扱っている商品種類を確認する

在庫を管理する

商品を補充する

在庫を確認する

(12)

① 商品種類管理プログラム

商品種類 - 商品番号 - 商品名 - 価格

商品種類リスト + 追加 ()

+ 削除 () 1

0..n 1 0..n

リスト

A

:商品種類リスト 種類

A

:商品種類

商品番号

=1001

商品名

=

コーラ

価格

=120

種類

C

:商品種類 商品番号

=1004

商品名

=DD

レモン 種類

B

:商品種類

商品番号

=1002

商品名

=

ソーダ

価格

=120

クラス図

インスタンス図

(13)

② 商品管理プログラム

商品保管庫

+

追加

( ) +

削除

( )

商品

-

製造年月日

0. . n 1

0. . n 1

保管庫

A :

商品保管庫 商品

A

:商品

製造年月日

=2002/1/21

商品

B

:商品 製造年月日

=2002/1/22

商品

C

:商品 製造年月日

=2002/1/23

クラス図

インスタンス図

(14)

11.2.2 オブジェクト の構造をつなげるには

① 商品と商品種類の関係

日付だけでは

どのような種類か わからない

商品保管庫

+

追加

( ) +

削除

( )

商品

-

製造年月日

0. . n 1

0. . n 1

保管庫

A :

商品保管庫 商品

A

:商品

製造年月日

=2002/1/21

商品

B

:商品 製造年月日

=2002/1/22

商品

C

:商品 製造年月日

=2002/1/23

クラス図

インスタンス図

(15)

解決案Ⅰ

商品に名前と価格を加える

商品保管庫 + 追加 ()

+ 削除 ()  商品 

- 商品名 - 価格

- 製造年月日

保管庫

A :

商品保管庫

商品A:商品 商品名=コーラ

価格=120

製造年月日=2002/1/21 商品B:商品 商品名=コーラ

価格=120

製造年月日=2002/1/22 商品C:商品 商品名=ソーダ

価格=120

製造年月日=2002/1/23

クラス図

インスタンス図

(16)

解決案Ⅱ

商品と商品種類をリンクする

商品保管庫 + 追加 () + 削除 () 商品

- 製造年月日

0..

n

1 0..

n

1 商品種類

- 商品番号 - 商品名 - 価格

保管庫

A :

商品保管庫 商品

A

:商品

製造年月日

=2002/1/21

商品

B

:商品 製造年月日

=2002/1/22

商品

C

:商品 製造年月日

=2002/1/23

種類

A

:商品種類

商品番号

=1001

商品名

=

コーラ

価格

=120

種類

B

:商品種類

商品番号

=1002

商品名

=

ソーダ

価格

=120

(17)

どちらがよい解決法か?

どちらでもうまくいく。

問題はどちらがよいプログラムになるか

利点・欠点を挙げてみよう

(18)

ポイントⅠ

価格の変更はどちらがしやすいか

商品に名前を加えた場合

商品からある名前の商品をすべて検索して、す べて書き換える必要がある

商品種類とリンクする場合

商品種類一ヶ所ですむ

(19)

ポイントⅡ

ユーザが商品を買う時を考える

「商品」を選ぶのか、「商品種類」で選ぶ のか

取り扱っている商品を知る必要があるか

その種類の商品がなくなってしまった場合、売 り切れなのか、それとも取り扱っていないのか 区別する必要があるか

自動販売機の場合、

「商品」も「商品種類」も別の意味を持っている

→ 意味ごとにまとめてカタマリに

(20)

② 商品種類と

商品保管庫の関係

問題点

異なる商品がおなじ保管庫に入っている

保管庫

A :

商品保管庫 コーラ

A

:商品

製造年月日

=2002/1/21

コーラ

B

:商品 製造年月日

=2002/1/22

ソーダ

A

:商品 製造年月日

=2002/1/23

(21)

解決案

種類ごとに保管庫を用意する

コーラ保管庫

:

商品保管庫 コーラ

A

:商品

製造年月日

=2002/1/21

コーラ

B

:商品 製造年月日

=2002/1/22

ソーダ

A

:商品 製造年月日

=2002/1/23

ソーダ保管庫

:

商品保管庫

種類

A

:商品種類 商品番号

=1001

商品名

=

コーラ

価格

=120

種類

B

:商品種類 商品番号

=1002

商品名

=

ソーダ

価格

=120

(22)

2つのプログラムの結合

下図のようなインスタンス構造ができ る

クラス図を書いてみよう

コーラ保管庫

:

商品保管庫 コーラ

A

:商品

製造年月日

=2002/1/21

コーラ

B

:商品 製造年月日

=2002/1/22

ソーダ

A

:商品 製造年月日

=2002/1/23

ソーダ保管庫

:

商品保管庫

種類

A

:商品種類 商品番号

=1001

商品名

=

コーラ

価格

=120

種類

B

:商品種類 商品番号

=1002

商品名

=

ソーダ

価格

=120

リスト

A

:

商品種類リスト

(23)

解答例

商品

-

製造年月日

商品種類リスト

+

追加

( )

+

削除

( ) +

検索

( ) +

表示

( )

商品種類

-

商品番号

-

商品名

-

価格

1 0. . n

1

0. . n 1

0. . n 1

商品保管庫

+

補充

( )

+

取り出し

( ) +

表示

( )

0. . n 1 0. . n

1 1

1 1

1

0. . n

(24)

11.2.3 オブジェクト

の構造を構築するための実装

① 商品と商品種類

② 商品保管庫と商品種類

③ 既に実装されている部分

商品

-

製造年月日

商品種類リスト

+

追加

( )

+

削除

( ) +

検索

( ) +

表示

( )

商品種類

-

商品番号

-

商品名

-

価格

1 0. . n

1

0. . n 1

0. . n 1

商品保管庫

+

補充

( )

+

取り出し

( ) +

表示

( )

0. . n 1 0. . n

1 1

1 1

1

0. . n

関連

(25)

① 商品と商品種類

商品 - 製造年月日 商品種類

- 商品番号 - 商品名 - 価格

商品

A

:商品 製造年月日

=2002/1/21

商品

B

:商品 製造年月日

=2002/1/22

商品

C

:商品 製造年月日

=2002/1/23

種類

A

:商品種類

商品番号

=1001

商品名

=

コーラ

価格

=120

種類

B

:商品種類

商品番号

=1002

商品名

=

ソーダ

価格

=120

クラス図

インスタンス図

(26)

① 商品と商品種類

// 商品クラス(抜粋)

public class Item {

private String date;//

製造年月日

private ItemType itemType;// 商品に対応する商品種類 // コンストラクタ

public Item(String newDate,ItemType newItemType) {

date = newDate;

itemType = newItemType;

}

//

商品に対応する商品種類を取得する public ItemType getItemType() {

return itemType;

} }

参照を追加

コンストラクタで 参照を設定

取得メソッドを追加

例題

11-1

(Item.java)

(27)

② 商品保管庫と商品種類

コーラ保管庫

:

商品保管庫

ソーダ保管庫

:

商品保管庫

種類

A

:商品種類 商品番号

=1001

商品名

=

コーラ

価格

=120

種類

B

:商品種類 商品番号

=1002

商品名

=

ソーダ

価格

=120

商品種類

-

商品番号

-

商品名

-

価格 商品保管庫

+

補充

() +

取り出し

()

+

表示

() 1 1 1 1

クラス図

インスタンス図

(28)

② 商品保管庫と商品種類

// 商品種類クラス(抜粋)

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;

} }

コンストラクタで 保管庫を生成

例題

11-1

(ItemType.java)

(29)

③ 既につながっている部分

商品と商品保管庫の関連

前回キューで実装されている

商品保管庫

+

追加

( ) +

削除

( )

商品

-

製造年月日

0. . n 1

0. . n 1

保管庫

A :

商品保管庫 商品

A

:商品

製造年月日

=2002/1/21

商品

B

:商品 製造年月日

=2002/1/22

商品

C

:商品 製造年月日

=2002/1/23

クラス図

インスタンス図

(30)

③ 既につながっている部分

その他

商品種類と商品種類リスト

配列や連結リストを使って実装した

金と勘定

前回にスタックを利用して実装した

(31)

④ 関連の実装 まとめ

 1

1

の実装

参照で実装

コンストラクタで設定、または生成

設定メソッドを用意しても良い

取得メソッドを実装

 1

対多の実装

配列や、連結リストを使って実装

方法はその他いろいろある

追加、削除メソッドを実装

発展

双方向の参照を持つにはどうすればよいか

(32)

11.3 オブジェクト

の構造を構築、操作する

 11.3.1

オブジェクトの構造を構築、操

作するプログラム

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

② 商品を生成して、補充する

③ 金を投入し、商品を購入する

 11.3.2

シーケンス図

記法

② シーケンス図例

(33)

11.3.1 オブジェクトの

構造を構築・操作するプログラ ム

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

/*** 商品種類の管理、商品の管理、商品の販売を行うプログラム

*/

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)

A

(34)

② 商品を生成して、補充する

  // コーラ在庫を追加 // コーラの保管庫を取得

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));

例題

11-1

(Example11_1.java)

B

種類A:商品種類 商品番号=1001 商品名=コーラ

価格=120

種類B:商品種類 商品番号=1002 商品名=ソーダ

価格=120

コーラ保管庫

:

商品保管庫 ソーダ保管庫

:

商品保管庫

リスト

A :

商品種類リスト

商品A:商品 製造年月日=2002/1/21 商品B:商品

製造年月日=2002/1/22

(35)

//商品を購入する //金を投入する

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+"円です");

}

③ 金を投入し、商品を購入す る

例題

11-1

(Example11_1.java)

C

<練習問題>

インスタンスの構造 を書いてみよう

(36)

//商品を購入する //金を投入する

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();//投入金勘定を空にする       

解答例 1

種類A:商品種類 商品番号=1001 商品名=コーラ

価格=120

種類B:商品種類 商品番号=1002 商品名=ソーダ

価格=120

コーラ保管庫

:

商品保管庫 ソーダ保管庫

:

商品保管庫

リスト

A :

商品種類リスト

商品B:商品 製造年月日=2002/1/22

例題

11-1

(Example11_1.java)

C

(37)

解答例 2 勘定の変遷

投入金勘定

:

勘定

A:金 =100

100

円投入された時点

投入金勘定

:

勘定

B:金 =50 A:金

=100

50

円投入された時点

投入金勘定

:

勘定

購入後

(38)

12.3.2 シーケンス図

構造が変化する過程を図式化する

ex)

このような構造が どのように構築されたか

シーケンス図

種類A:商品種類 商品番号=1001 商品名=コーラ

価格=120

種類B:商品種類 商品番号=1002 商品名=ソーダ

価格=120

コーラ保管庫

:

商品保管庫 ソーダ保管庫

:

商品保管庫

リスト

A

:

商品種類リスト

(39)

① 記法

Exampl e11_1 ソーダ保管庫 :

商品保管庫

: 商品種類リ

スト コーラ : 商品

種類 ソーダ : 商品

: 種類 コーラ保管庫

商品保管庫

( )

追加 コーラ 商品種類を追加する

生成

生成

生成 生成

( )

追加 ソーダ

インスタンス

(

インスタンス名

:

クラス名

)

メッセージのやり取り

(

メソッドのコール

)

(40)

② シーケンス図例

1

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

Exampl e11_1 商品を補充する

: 商品種類リ

スト コーラ : 商品

種類 商品4/ 28 :

商品4/ 29 :

: コーラ保管庫

商品保管庫 ( 1001)

検索

保管庫取得( )

( )

生成 コーラ

( 4/ 28)

追加 商品

( )

生成 コーラ

( 4/ 29)

追加 商品

(41)

2

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

Exampl e11_1 商品を補充する

: 商品種類リ

スト コーラ : 商品

種類 商品4/ 28 :

商品4/ 29 :

: コーラ保管庫

商品保管庫 ( 1001)

検索

保管庫取得( )

( )

生成 コーラ

( 4/ 28)

追加 商品

( )

生成 コーラ

( 4/ 29)

追加 商品

(42)

3

)金を投入し、商品を購入する

記述してみましょう

(43)

3

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

:

Exampl e11_1 100 : 50 : : 勘定 : 商品種類リ

スト コーラ : 商品

種類 コーラ保管庫 :

商品保管庫 コーラA : 生成

( 100 ) 追加 生成

( 50 ) 追加

( 1001) 検索

保管庫取得( )

商品取り出し( )

製造年月日取得( ) 総額取得( )

リセット( )

(44)

シーケンス図で明らかになる こと

シーケンス図を書く利点を議論してみ よう

(45)

シーケンス図の利点

時間の流れに沿ってオブジェクトの構造の変 化の過程を追える

クラス図、オブジェクト図では明らかでない動的 な変化を追える

オブジェクトのメッセージのやり取り(メ ソッドの呼び出し)を追える

そのオブジェクトにどのような役割があるか が分かりやすくなる

そのオブジェクトがどのようなメッセージを受け ているのか

(46)

1.4 CUI アプリケーションの構 築

① メニューの構成

② プログラムの構成

③ クラス図

④ ソース

(47)

1.4 CUI アプリケーションの構 築

メニューを表示してユーザに入力を促 す対話型アプリケーション

//メインメニュー(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);

} }

例題

11-2

(CUIVMApp.java)

(48)

① メニューの構成

メインメニュー

管理者メニュー

ユーザメニュー

(49)

② プログラムの構成

Example11_2 CUIVMApp

mainMenu() main()

CUIAdminApp

adminMenu() addItemType() addItem()

CUIUserApp

userMenu() insertCoin()

selectItemType()

(50)

起動役を分離する

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

Example11_2 CUIVMApp

mainMenu() main()

起動役 本体

(51)

③ クラス図

自動販売機機のアプリケーションプログラ ムは、勘定と商品種類リストだけ知ってい

関連をたどることによって、すべてのオブジェ クトにたどり着け、構造を変化させることが可

商品 - 製造年月日

商品保管庫 + 追加( ) + 削除( )

0. . n 1

0. . n 1

- 価値

勘定 + 追加( ) + 削除( )

商品種類 - 名前 - 商品番号 - 価格

CUI User App

商品種類リスト + 追加( ) + 削除( ) 1

0. . n 1

0. . n

CUI AdminApp

(52)

④ ソース

 Example11_2.java

 CUIVMApp.java

 CUIAdminApp.java

 CUIUserApp.java

 UserApp

は、メソッドが実装されていませ ん。練習問題で各自実装するようになって います

参照

関連したドキュメント

第2 この指導指針が対象とする開発行為は、東京における自然の保護と回復に関する条例(平成12年東 京都条例第 216 号。以下「条例」という。)第 47

平成3

第2条第1項第3号の2に掲げる物(第3条の規定による改正前の特定化学物質予防規

第7回 第8回 第9回 第10回

第1回 平成27年6月11日 第2回 平成28年4月26日 第3回 平成28年6月24日 第4回 平成28年8月29日

61 の4-8 輸入品に対する内国消費税の徴収等に関する法律(昭和 30 年法律 第 37 号)第 16 条第1項又は第2項に該当する貨物についての同条第

「練馬区廃棄物の処理および清掃に関する条例」 (平成 11 年練馬区条例第 56

[r]