[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10085] Re: Java 言語で学 ぶデザインパターン入門第 6 回議事録



福嶋です。
ちょっと仕事が立て込んでいまして、返信遅れました。

On Sun, 28 Apr 2002 00:25:49 +0900, according to the article
"[jfriends-ml 10079] Java 言語で学ぶデザインパターン入門第 6 回議事録"
"TAKAHASHI, Tomohiro" <t_takahashi@xxxxxxxxxxxxxx> wrote:

>   Statck.push()する際に、thisをpushしないようにチェックしているが、これは無限
>   ループを防止するためである。しかし、これではチェックが足りないハズである。
>   というのも、循環参照していることもあり得るからである。
>     --> executeメソッド内で再入してくるかどうかをチェックするというのは使えな
>         いか?
>     --> 福嶋さん@PFUは、会社の仕事で「循環参照を検出するための特許」を取った
>         そうである。後々、当メーリングリストにて委細を教えていただけるそうです。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
※重要
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
本件ですが、現在、公開広報を発行し、権利化(=特許成立)はまだしていません。
ただし、会社のモノですので、私の意志にかかわらず、今後権利化が行われる
可能性がないとは言えないので、真似はしないで参考程度にしておいてください。
お願いします。m(_ _)m
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

で、大したことはないのですが、作りは以下のようなものです。
(資料がどっかに行ってしまったので覚えている範囲で)

■基本的なアイデア
群(グループ)と、その祖先一覧の対を1行とするテーブルを考えます。
A群の中にB群があり、B群の中にC群がある、というのは、このテーブルを
利用すると、以下のようなイメージになります。

群         祖先一覧
---------------------
A          (なし)
B          A
C          B,A

ここで、C群にA群を入れようとする(CグループのメンバにAを追加しようとする)
と、Cの祖先一覧に既にAが入っているため、循環を検出することになります。

■テーブルへの追加のルール
あらたな親子関係が発生する場合、以下のルールで行を追加します。
・「群」には、子となるものを入れる
・「祖先一覧」には、親と、親の祖先一覧を入れる
・「祖先一覧」内で重複するものは取り除く
・ある群Aが新たに親になる場合に、その群Aを祖先一覧に含む群のすべての
  祖先一覧に、群Aの祖先一覧を追加する

以下の場合、循環を検出します。
・親の祖先一覧に、自分(「群」の欄のもの)が含まれている

例えば、
  A群の中にB群があり、B群の中にC群があり、C群の中にD群がある、
ときには、

(1)A群の中にB群があり、
  群         祖先一覧
  ---------------------
  A          (なし)    <-- 親がいない場合は祖先一覧は空
  B          A         <-- Bの親はA

(2)B群の中にC群があり、
  群         祖先一覧
  ---------------------
  A          (なし)
  B          A
  C          B,A       <-- Cの祖先は直接の親であるBと、Bの祖先であるA

(3)C群の中にD群がある
  群         祖先一覧
  ---------------------
  A          (なし)
  B          A
  C          B,A
  D          C,B,A     <-- Dの祖先は直接の親であるCと、Cの祖先であるB,A

となります。
ここで注目すべきは、再帰的な計算は全く行っていないということです。
(3)で参照しているのは、親のCと、Cの祖先一覧にあるものを取ってきている
だけです。

複雑なのは最後のルールで、例えば、群Eが群Bを含むようになった時、すなわち、
  A→B→C→D

という親子関係が、

  A┬→B→C→D
  E┘

となったときにどうするか。
このとき、まずEの行が追加されます。

(4)Eの行を追加
  群         祖先一覧
  ---------------------
  A          (なし)
  B          A
  C          B,A
  D          C,B,A
  E          (なし)

次に、Bの祖先一覧にEと、Eの祖先一覧を追加します。Eは今祖先一覧がないので
追加するのはEだけになります。

(5)Bの行を更新
  群         祖先一覧
  ---------------------
  A          (なし)
  B          A,E
  C          B,A
  D          C,B,A
  E          (なし)

最後に、Bを祖先一覧に含むものすべてに対して、EとEの祖先一覧を追加します。
Eは祖先一覧がないので、やはり追加するのはEだけになります。

(6)Bを祖先一覧に含むものすべての祖先一覧にEを追加
  群         祖先一覧
  ---------------------
  A          (なし)
  B          A,E
  C          B,A,E
  D          C,B,A,E
  E          (なし)

これで完了です。

■削除のルール
追加の逆のことをやるわけですが、長くなるので省略します。だいたい想像が
つくと思います。

これを考えた時(4年くらい前)には、Javaのサンプル実装も作りましたが、
そのソースが行方不明になってしまいました…。
(単純な構造なので、作ろうと思えばすぐ作れますけどね)

> P347
>   ここのソース(クラス)では突然Swingを使用するように設計されているが、何故だろ
>   うか?
>     --> Swingを使わざるを得ない状況だったのではないだろうか?
>     --> 結城さんパターンとして練習問題に関係しているのではないか?
> 
>   SwingとAWTを組み合わせたGUIを作成することはお薦めできない。
>   正常に動作しないことがある。
>     --> 本で紹介されているプログラムも、実際には正常に動作しないことがあるの
>         ではないだろうか?

この辺が参考になりますね。
http://java-house.jp/ml/archive/j-h-b/018258.html#body

> P370
>   CommandListNodeクラスのtoString()メソッドの中で「"" + list」という記述を行っ
>   ている
>     --> あまりお薦めできない。
>     --> 結城さんパターンである

Object.toString()を使うよりも、String.valueOf()を使うのが好みです。
toString()って、何だがデバッグコードっぽいし、Javaコアクラスの中には、
バージョンによって出力形式が変わるものが(確か)ありましたし。

関係ないですが、StringBufferのインスタンスからStringのインスタンスを得る
時は、私は、

  new String(instanceOfStringBuffer)

のように書きます。

> P377
>   なぜ AbstractExpression は、抽象クラスなのか? interfaceではダメなのか?
>     --> 結城さんパターンによれば、練習問題と関係しているのではないだろうか?
>           --> 練習問題を見てみると、どうやら関係なさそうだ

言語を特定しないGoF本にならったのではないか、という話も出ましたね。

> ◆ 打ち上げ
>   一次会は近くの居酒屋「天狗」で17:00より開始。こんな早い時間にもかかわらず、
>   既にお客さんがいました。お一方\2,000也。
>   近に座っていた学生たち20人くらいがいきなりイッキ飲みを始めてめちゃくちゃ
>   うるさくなったので、石黒さんが一喝!! 学生おとなしくなる。(笑)

自分も学生の頃は騒いでいたなぁと反省しつつ、「あの頃は若かった…」と
懐かしんでみたり。(^^)

> ◆さいごに
>   次回に読書会の課題図書は既に投票が始まっています。
>   5月の中旬をメドに締め切りたいと思います。

今見たら僅差ですが1位はリファクタリングになってますね。
社内の勉強会では、最初と最後の章を抜かして、約2週間に1回2時間、輪講形式
(各自3トピックくらいを担当しレジメにまとめて発表)でやって9ヶ月(16回)で
終わりました。

----------------------------------------
(株)PFU ソフトプロダクト事業部第二開発部
  福嶋 航  w.fukushima@xxxxxxxxxxxxxxx