中尾さん朗読者:小川さん、倉村さん、中尾さん書記:高橋(徹)今回から新しい本「デザインパターン入門」を読む会がスタートしました。参加者も同率ながら過去最高の14人でした。初参加の方も多数いらっしゃいました。これから数ヶ月間、楽しく進めていきましょう。Methodまで読みました(謝辞と目次は省略)。以下、読書会中で行われた議論を記述していきます。p.viii一般的な意味のインタフェースには、privateメソッドは含まれますか?→APIは普通巨視的に見たものなので、privateは含まれない。→Javaのドキュメントには、privateは書かれていない。→Javadocにはprivateメソッドもドキュメント化するオプションがある。インタフェースは、メソッドの名前、戻り値、引数のことですか?→クラスが持つメソッド全体を指してインタフェースと呼んでいる。・日本ラショナルソフトウェアの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.htmp.xxix斜字体は日本語の文字にはない文化なので見分けにくい。p.xxixちょっと一言の、「知っている」という表現はかえって分かりにくいのでは?→参照している、と捉えると分かりやすいのではないか。→参照の意味が難しい。集約BasketとFruitは◆(コンポジション)では?→Fruiteが別なBasketに移ることがあるので、◇(集約)でよいのではないか。アクセス制御UML1.4で、~(チルダ)が追加された。これはJavaのアクセス修飾子が省略されたデフォルトアクセスに対応する。クラスの関連クラスの関連を記述できるツールはあるか?→IIOSSは関連名を記述できました。他のツールは未調査です。自分のメソッドを呼ぶ時に、スーパークラスのメソッドか自クラスのメソッドか区別したいときはどうするか?→シーケンス図はオブジェクト単位なので、区別はしない。Designとして使用できない)?→シーケンス図のメッセージに引数を書いてもよい。お昼休み近所の中華料理屋さんに行きました。人数が多かったので、円卓を2つ囲みました。僕のいた円卓では、JavaOneの話し、CORBAの話し、CORMA-MLの紹介といった話題が出ていました。Iteratorインタフェースinterfaceにpublicを付けないとどうなる?→他のパッケージのクラスからそのinterfaceを使用できない。Java(TM)言語仕様」(アジソンウェスレイ刊)p.166を調べてみました。abstractを指定することは許されているが、スタイルとしては勧められない。インタフェースの本体中のメソッド宣言は、すべて暗黙のうちにpublicとなる。インタフェース・メソッドに対して余分なpublic修飾子を指定することは許されているが、スタイルとしては勧められない。空文字列で初期化しているのか。...となぜ空文字列があるのだろうか?Aggregateインタフェースが出てこない。BookShelf型で変数が定義?→ここではBookShelfクラスのメソッドappendBookを呼んでいるから。→このmainメソッドでは、BookShelfを作ること、BookShelfをイテレートすることが記述されているので、Aggregateが使われていない。分離すべきかもしれない。Iteratorパターンでは、Aggregateインタフェースは欠かせないのか?→GoF本では、Aggregateインタフェースが出ている。BookShelfにiterator()メソッドを設ければ済むではないか?→iteratorを取り出す方法も抽象化して扱いたい。APIでは、java.util.CollectionインタフェースがAggregate役になっている。BookShelfクラスにイテレータがあってもよいのではないか。→カレントの位置は見る人によって違うから。別な人がイテレートするとカレントが変わってしまう。p.13deleteIteratorというのが唐突に出てきているが?→C++では必要になる。→Javaでも参照を誰かが保持している限り、ガベージコレクション対象にならない。体的にどんなこと?→例えば、偶数番目だけ返すiteratorを作る場合がある。APIでも、リスト構造を順・逆にたどるListIteratorがある。Iteratorを使うとき、java.util.Iteratorを使うか独自に定義して使うかどちらがよいのでしょうか?→java.util.Iteratorを使うべきでしょう。java.util.Iteratorには、remove()がある。APIはサポートしていないので、Iteratorを使うべきでしょう。→removeをサポートしたくないクラスは、UnsupportedOperationExceptionを投げるようにする。→Collectionsクラスには、unmodifiableCollectionメソッド等が提供されており、集合の変更できないビューを返す。2-5このPrintクラスはabstractメソッドしか宣言されていないので、インタフェースのままでよいのではないか?→Target役がinterfaceではなくclassの場合でもOKな例を示しているのでは。問題2-2解答例では継承を用いているが、一般的には委譲の方がよいのでは?→Propertiesの他のメソッドも使えるようにするには、extendsの方が便利。→ここでは、FileIOインタフェースが使えれば十分なので、委譲でもよいのではないか。Methods"というWizard機能があり、委譲したオブジェクトのメソッドへ転送するメソッドを自動生成できる。問題3-3で扱われている。有者、値にシリアルが指定されている。隣の西小山駅へ移動し、居酒屋和民で懇親会を実施しました。同日たまたま近くで行われていた「計算機プログラムの構造と解釈」を読む会のメンバーとの合同懇親会でした。約3時間に渡って楽しいおしゃべりをしながら懇親を深めることができました。