読書会(Java言語で学ぶデザインパターン入門)第1回議事録

[ 戻る ]


「Java言語で学ぶデザインパターン入門」を読む会 第1回議事録

日時:2001/11/24 10:00 - 16:30
場所:品川区荏原第一地域センター
最寄駅:東急目黒線武蔵小山駅
参加者:(席の並び順に書いてみました)
 小川さん       秋元さん
 立見さん       佐藤さん
 高橋(智)さん   上野さん
 布留川さん     倉村さん
 高橋(徹)       石黒さん
 西海さん       中村さん
 米内山さん     中尾さん
朗読者:小川さん、倉村さん、中尾さん
書記:高橋(徹)

今回から新しい本「デザインパターン入門」を読む会がスタートしました。
参加者も同率ながら過去最高の14人でした。初参加の方も多数いらっしゃいま
した。これから数ヶ月間、楽しく進めていきましょう。

第一回の読書範囲
今回は、p.iiiの「はじめに」から、第4章のFactory Methodまで読みました
(謝辞と目次は省略)。
以下、読書会中で行われた議論を記述していきます。

p.viii
一般的な意味のインタフェースには、privateメソッドは含まれますか?
→APIは普通巨視的に見たものなので、privateは含まれない。
→Javaのドキュメントには、privateは書かれていない。
→Javadocにはprivateメソッドもドキュメント化するオプションがある。

インタフェースは、メソッドの名前、戻り値、引数のことですか?
→クラスが持つメソッド全体を指してインタフェースと呼んでいる。

p.ix
「APIはapplication interfaceの略」とあるが、普通はapplication
programing interfaceの略ではないか?

p.xxvii
UMLの仕様書についての補足
・日本ラショナルソフトウェアのWebサイトにおいてUML1.1仕様の翻訳が公開
されている。
http://www.rational.co.jp/uml/index.html
・アスキーからUML1.3の仕様書を翻訳した書籍「UML仕様書」が出版されてい
ます。
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3962-0.html

現在のUMLのバージョンは?
→本議事録を書いているときにOMGのサイトを見てみると、2001年9月に1.4が
制定されたようです。
http://www.omg.org/technology/documents/formal/uml.htm

p.xxix
斜字体は日本語の文字にはない文化なので見分けにくい。

p.xxix 
ちょっと一言の、「知っている」という表現はかえって分かりにくいのでは?
→参照している、と捉えると分かりやすいのではないか。
→参照の意味が難しい。
→英語で(クラスの関連を)説明するときに並ぶ順番と、関連の矢印の方向が対
応している。(Child extends Parent.)

p.xxxi 集約
BasketとFruitは◆(コンポジション)では?
→Fruiteが別なBasketに移ることがあるので、◇(集約)でよいのではないか。

コンポジションの訳語は何?
→宿題:石黒さん

集約は、has-aでいいの?
→yes

p.xxxi アクセス制御
UML1.4で、~(チルダ)が追加された。これはJavaのアクセス修飾子が省略され
たデフォルトアクセスに対応する。

p.xxxii クラスの関連
クラスの関連を記述できるツールはあるか?
→IIOSSは関連名を記述できました。他のツールは未調査です。
http://www.iioss.org/index-j.html

p.xxxii シーケンス図
自分のメソッドを呼ぶ時に、スーパークラスのメソッドか自クラスのメソッド
か区別したいときはどうするか?
→シーケンス図はオブジェクト単位なので、区別はしない。

writeとかのメッセージでは引数が書かれていないが、これだとコードに落と
すことができないのでは(PD:Program Designとして使用できない)?
→シーケンス図のメッセージに引数を書いてもよい。

お昼休み
 近所の中華料理屋さんに行きました。人数が多かったので、円卓を2つ囲みま
した。僕のいた円卓では、JavaOneの話し、CORBAの話し、CORMA-MLの紹介といっ
た話題が出ていました。もう一つの円卓も盛り上がっていたようですが、どん
な話題だったのでしょうか?

□第1章 Iterator 1つ1つ数え上げる
p.5 Iteratorインタフェース
interfaceにpublicを付けないとどうなる?
→他のパッケージのクラスからそのinterfaceを使用できない。

interfaceのメソッドにはpublic abstractを付けるのか?
→「The Java(TM)言語仕様」(アジソンウェスレイ刊)p.166を調べてみました。
"インタフェースの本体中で宣言したメソッドはすべて暗黙のうちにabstractとな
り、...(中略)... abstractを指定することは許されているが、スタイルとし
ては勧められない。
インタフェースの本体中のメソッド宣言は、すべて暗黙のうちにpublicとなる。
インタフェース・メソッドに対して余分なpublic修飾子を指定することは許さ
れているが、スタイルとしては勧められない。"

p.6 List 1-3
なぜ、private String name = ""; と空文字列で初期化しているのか。必ずコ
ンストラクタで初期化されているので無駄(余分な処理が動く)ではないか?
→他のコンストラクタを追加した場合などで初期化されないケースが発生する
ので、(null以外の値で)必ず初期化されるようにしたのではないか?
(※後のコードでは空文字列で初期化されていない)

p.8 List 1-6
最後のSystem.out.println文で、"" + ...となぜ空文字列があるのだろうか?

Aggregateインタフェースが出てこない。なぜBookShelf型で変数が定義?
→ここではBookShelfクラスのメソッドappendBookを呼んでいるから。
→このmainメソッドでは、BookShelfを作ること、BookShelfをイテレートする
ことが記述されているので、Aggregateが使われていない。分離すべきかもし
れない。

Iteratorパターンでは、Aggregateインタフェースは欠かせないのか?
→GoF本では、Aggregateインタフェースが出ている。
BookShelfにiterator()メソッドを設ければ済むではないか?
→iteratorを取り出す方法も抽象化して扱いたい。
→Java Collection APIでは、java.util.Collectionインタフェースが
Aggregate役になっている。

BookShelfとBookShelfIteratorをなぜ分けるのか? BookShelfクラスにイテレー
タがあってもよいのではないか。
→カレントの位置は見る人によって違うから。別な人がイテレートするとカレ
ントが変わってしまう。

p.13
deleteIteratorというのが唐突に出てきているが?
→C++では必要になる。
→Javaでも参照を誰かが保持している限り、ガベージコレクション対象になら
ない。

1つのConcreteAggregator役に対して複数のConcreteIterator役を作るとは具
体的にどんなこと?
→例えば、偶数番目だけ返すiteratorを作る場合がある。
→Java Collectoin APIでも、リスト構造を順・逆にたどるListIteratorがあ
る。

Iteratorを使うとき、java.util.Iteratorを使うか独自に定義して使うかどち
らがよいのでしょうか?
→java.util.Iteratorを使うべきでしょう。

java.util.Iteratorには、remove()がある。removeを使いたくない時は、
java.util.Enumerationを使った方がよいのか?
→Enumerationは、JDK1.1時代のものでJava Collection APIはサポートしてい
ないので、Iteratorを使うべきでしょう。
→removeをサポートしたくないクラスは、UnsupportedOperationExceptionを
投げるようにする。
→Collectionsクラスには、unmodifiableCollectionメソッド等が提供されて
おり、集合の変更できないビューを返す。

□第2章 Adapter 一皮かぶせて再利用
p.18 List 2-1
フィールド宣言で、private String string; と= ""; で初期化されていない
のはなぜか?(List 1-3と記述が違っている)

p.22 List 2-5
このPrintクラスはabstractメソッドしか宣言されていないので、インタフェー
スのままでよいのではないか?
→Target役がinterfaceではなくclassの場合でもOKな例を示しているのでは。
 (p.21に、単一継承の話しが書かれているので)

p.27 問題2-2
解答例では継承を用いているが、一般的には委譲の方がよいのでは?
→Propertiesの他のメソッドも使えるようにするには、extendsの方が便利。
→ここでは、FileIOインタフェースが使えれば十分なので、委譲でもよいので
はないか。

委譲をする際に、転送するメソッドを自動生成するツールはあるのか?
→ Emacs JDEでは、"Delegates Methods"というWizard機能があり、委譲した
オブジェクトのメソッドへ転送するメソッドを自動生成できる。

□第3章 Template Method 具体的な処理をサブクラスにまかせる
p.35 List 3-1
open, print, closeのメソッドはサブクラスで定義し、AbstractDisplayクラ
スからしか使用されないので、publicではなくprotectedにした方がよいので
はないか?
→ 問題3-3で扱われている。

□第4章 Factory Method インスタンス生成をサブクラスにまかせる
p.48 List 4-1
abstract class Productはinterfaceの方がよいのではないか?
(useメソッドが使えればよいのだから)

p.56 問題4-2
解答例で、IDCardFactory.javaのregisterProductメソッド定義において、
database.put(card.getOwner(), new Integer(card.getSerial()));
とHashtable databaseに所有者とシリアルを格納しているが、この時キーに所
有者、値にシリアルが指定されている。キーにシリアルを指定するのが普通で
はないか?
(同性同名が存在する場合NGとなってしまう)

□懇親会
隣の西小山駅へ移動し、居酒屋和民で懇親会を実施しました。同日たまたま近
くで行われていた「計算機プログラムの構造と解釈」を読む会のメンバーとの
合同懇親会でした。約3時間に渡って楽しいおしゃべりをしながら懇親を深め
ることができました。


[ 戻る ]