NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

入門本 Memento について

投稿者: さん  2001/11/01 09:55  MLNo.1130   [メール表示]

村山といいます。
いつもお世話になっております。

結城さんの「Java言語で学ぶデザインパターン入門」の
第18章 Mementoパターン において質問があります。
もし過去に同じ投稿があったら申し訳ありません。

現在,上記の本を教材にしたデザインパターンの勉強会
に参加しています。
Mementoのサンプルプログラムを実行したところ,
次のような出力が得られました(長いので本メール末尾に記します)

25番で復帰したときの,フルーツがおかしくなっています。
以下,私の考えを述べます。
本の274ページの下のほうに restoreMementoメソッドがありますが,
このメソッドの
  this.fruits = memento.fruits;
が問題なのではと思います。
一度 restoreMementoが呼ばれてしまうと,
this.fruits と memento.fruits に参照が張られてしまい,
次に createMemento()が呼ばれるまで,this.fruits に
フルーツを追加すると,memento.fruits にも追加されてしまいます。

解決策はいろいろありますが,以下が一番適当かなと思っています。
いかがでしょう。

1,GamerクラスのrestoreMementoメソッドを次のようにする。

public void restoreMemento(Memento memento) {
this.money = memento.money;
this.fruits = memento.getFruits(); //変更
}

2,MementoクラスにgetFruitsメソッドを追加する。

Vector getFruits() {
return (Vector)fruits.clone();
}


-------------------------------------------
↓↓↓↓↓プログラム修正前の出力ログ↓↓↓↓↓
-------------------------------------------
==== 17
現状:[money = 350, fruits = [おいしいリンゴ]]
所持金が増えました。
所持金は450円になりました。
(だいぶ増えたので、現在の状態を保存しておこう)

==== 18
現状:[money = 450, fruits = [おいしいリンゴ]]
フルーツ(おいしいバナナ)をもらいました。
所持金は450円になりました。

==== 19
現状:[money = 450, fruits = [おいしいリンゴ, おいしいバナナ]]
フルーツ(おいしいバナナ)をもらいました。
所持金は450円になりました。

==== 20
現状:[money = 450, fruits = [おいしいリンゴ, おいしいバナナ, おいしいバナナ]]
所持金が半分になりました。
所持金は225円になりました。

==== 21
現状:[money = 225, fruits = [おいしいリンゴ, おいしいバナナ, おいしいバナナ]]
所持金が半分になりました。
所持金は112円になりました。
(だいぶ減ったので、以前の状態に復帰しよう)

==== 22
現状:[money = 450, fruits = [おいしいリンゴ]]
所持金が半分になりました。
所持金は225円になりました。

==== 23
現状:[money = 225, fruits = [おいしいリンゴ]]
フルーツ(おいしいぶどう)をもらいました。
所持金は225円になりました。

==== 24
現状:[money = 225, fruits = [おいしいリンゴ, おいしいぶどう]]
所持金が増えました。
所持金は325円になりました。

==== 25
現状:[money = 325, fruits = [おいしいリンゴ, おいしいぶどう]]
所持金が半分になりました。
所持金は162円になりました。
(だいぶ減ったので、以前の状態に復帰しよう)

==== 26
現状:[money = 450, fruits = [おいしいリンゴ, おいしいぶどう]]
フルーツ(おいしいバナナ)をもらいました。
所持金は450円になりました。



---------------------------------------
横河システムエンジニアリング(株)
生産情報ソフトウェア部1課:村山 智之
murayama@…
TEL:0422-52-6314 内線:731-20165
FAX:0422-52-0611
---------------------------------------


 読み込み中...

  • MLNo.1132   結城浩さん  (0) 2001/11/01 20:59  [メール表示する]
    村山さん、結城です。

    > 本の274ページの下のほうに restoreMementoメソッドがありますが,
    > このメソッドの
    >   this.fruits = memento.fruits;
    > が問題なのではと思います。

    なるほど!
    ご指摘の通り、これは問題ですね。
    # 過去の思い出が現在の経験に侵食されてしまうわけですね。

    > Vector getFruits() {
    > return (Vector)fruits.clone();
    > }

    この修正も動作確認しました。
    貴重なご指摘感謝します。

    - - - - -

    以下余談。
    mementoという映画があるようです。
    題材はまさに「失われていく自分の記憶」です。
    主人公は刺青を使ってcreateMementoするらしいです。

    ◆memento (映画)
    http://www.otnemem.jp/

    ----
    結城浩
    http://www.hyuki.com/
    http://www.textfile.org/
    Pray without ceasing. (Bible, I Thessalonians 5:17)




メールへの返信はMLのメンバーしかできません。
【PR】こだわりのブログにぎやかな掲示板携帯対応日記女性向けブログ無料のブログ
4LDK超ってこんなに広い?/SUUMO