読書会(アジャイルソフトウェア開発の奥義)第9回議事録
[ 戻る ]
今回は、翻訳者の瀬谷さんが特別参加してくださったので、「特別版」
です。
PS.
[凡例]
「28.3 acyclic visitor pettern」
^^^^ 行頭から章番号から始まっているものは本の章のタイトル
「acyclic visitor は visitor の変形る」
^ 先行するものなにも無い場合は、本の内容や、メモ
「Q. ここでいう API って ?」
^^
「A. JDBC のことでは ? ( 見方によるが.. )」
^^ Q./A. で始まるのは主に、会話記録
「S. 依存関係逆転の法則を適用した点がポイント」
^^ S. で始まるのは、瀬谷さんからのコメント !!
# この表現に関しては、事前に、瀬谷さん
# の御承諾を頂いております。
## 御快諾、ありがとうございます >> 瀬谷さん
-- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< --
java 読書会
BOF in 高津区民館 第 4 会議室 at 2005/07/16 10:00 - 17:00
出席者(敬称略)
前
開始 →
+---------------+↓
| |
| 机 |
| |
+---------------+
↑ ←
金井, 小棚木, 中島, 高橋(徹)o, 門脇
村上, 岩室o, 村山
SEYA*, 高橋(智)o, 遠藤o, 吉本, 塩沢
栗野, 根本
朗読者: 高橋(徹), 岩室, 高橋(智), 遠藤
書記: 栗野
本 : 「アジャイルソフトウェア開発の奥義」
==
後、二回で終りたいので、p.500 位を目標に...
次回は、残業 ( - 21:00 ) Okey
次の本を選ばなければなりませんが、投票には、2 月位かかるので、侯補図書の推薦をお願いします。
# 参加者が多いのに、投票が少いのはなぜ..
Q. Java Puzzle は ?
A. 英語ですね.. 今なら、まだ在庫があるはずだから、手にはいりやすいかも
A. (英語なので)話者の担当者を予め决めるための CGI も作らないと..
Q. 英語訳の問題だけでなく、そもそも意味が解るかどうか.. (puzzle だから..)
==
# 今日は、訳者の SEYA さんがきている !!
[自己紹介]
<<削除>>
==
p.500
28.3 acyclic visitor pettern
# エイサイクリック
# 目標は 80 ページ
visit される側 ( modem 側 ) が、visitor ( Modem Visitor ) に依存している
逆に、visitor も visit される側に依存する。
=> 関係が循環 ( ciclic ) になっている。
visit される側 ( modem 側 ) が変更されない場合に利用できる
# visitor 側は継承しても Okey
純粋な visitor pattern では、 visit される側が visitor を知っている必要がある
結合が強くなっている。
visit 側に変更を加えると、visitor 側を compile し直す必要がある
C++ の場合は、逆も真なので、大変
この問題を解決するには..
acyclic visitor を利用する
acyclic visitor は visitor の変形
縮退クラスを利用して実装
# 縮退クラス : メソッドを持たない ( マーカーインターフェース )
# cf. p. 497
[誤殖] p.501 の脚注 「maker インターフェース」 => 「marker インターフェース」
acyclic visitor
# 180 回転して、派生クラスから I/F に切り換える
# キャストが成功すれば、正しいものが選ばれ、実行される
=> visit する側を変えても、visitor 側に影響しない
accept method
try - cache でかこみ、キャストしている
Q. List 28-16 は、p.499 の 28-7 と同じでは ?
A. Yes : (内部) Logic は変っても、Test Code は同じ..
これならば、循環する関係がなくなるので、順番に Compile できる
キャストを使っているのがよくない
パターンが複雑
組み込み系では、時間の制約でだめかも
S. 依存関係逆転の法則を適用した点がポイント
関係の間に抽象クラスを導入する
依存関係を断ち切ることができる
# 発想として自然
これ位ならば、単純かも..
だんだん、新しい物を入れて行くと複雑になるので..
Q. java のキャストって、関係がなくてもキャストしてよい ?
動的にやるから Okey ?
A. Yes, But, compile error ( fail first ) でないから嫌われる。
Q. マーカ I/F の必要性は ? (Object で十分では ?)
A. 確かに、この機能は Object でも Okey
A. 少しでも Compile Error にしたい
A. 普段は LWL を使っているので、必要性が、よく解らなかった..
Q. dynamic キャストは 400 倍遲い ( java )
A. クラスの継承をおっかけるので.. ?
Q. 比較している相手とは ?
up cast と比較して ( donw cast は.. ) ってこと ?
[宿題 ?] 本当に遲いの ?
# 255 段階の継承をさせて..
# JDK だと、Compiler ができないとか..
S. 時間がかかることも問題だが、どの位かかるかが解らないので、実行時間の予測ができない。どちらかと言えば、その方が問題 ( real time system では.. )
Q. Rela Time Java では.. ?
S. そうゆうキャストは許さないのでは ?
28.3.1 Acyclic Visitor パターンは踈行列に類似
Acyclic は、( Visitor と同様 ) 関数行列を作るが、踈行列になっている場合
# 要素が 0 の所は、実装がなくても良い所を表現している
=> 一つの利点 ( 特定の組み合わせを無視してよい )
28.3.2 レポートジェネレータで Visitor パターンを利用する
利用する場合
構造が複雑なデータ構造に、レポート機能を実現する場合
レポート機能を本体から分離できる !! (SRP)
# 後から、いくらでも追加できる
Q. PieceMap は何を表わしているの ?
A. System に含まれている個々の Piece (Parts) の個数を数えている
A. LWL でならば、1, 2 行で書けるものを長々と書いている.. ( 大変かも.. )
Q. BOM って ?
S. Bill of Materials といって、B/M の部品表など..
Q. Private Method に作られる Inner Class も Public Class となる
Security Hole になるかも ??
Coding 規約上では、Private Method での Innter Class は、ご法度
A. そうゆう場合は java はやめろ..
Q. 問題になるケースは ?
28.3.3 visitor pattern のその他の使い道
例:
Compiler の最適化
Setup ( 初期化 Routing )
visit される側は visitor から分離している点が利点
==
28.4 Decorator パターン
既存のクラス構造に手を加えずに、メソッドを追加する手段を提供
振舞いをパーソナライズしたい..
=> パーソナライズの部分を分離する
# そうしないと、週 80 時間の残業が必要に..
Q. 本当に残業は 80 時間で十分なの ?
A. 空しいからやめよう..
パーソナライズ部分の実装をプログラマに強制するには..
Template Method パターンを使う
# プログラマの記憶に頼るには危険なので..
CCP/SRP を適用しよう.. ( Modem は、User の希望を知らなくてもよいはず )
=> Decorator パターン
追加機能(User の希望)を本体から分離する
Q. Modem I/F に setVolume があるのはまだ、好ましくない形が続いている ?
A. setVolume そのものは、Modem の機能だから良いのでは ..
Q. 別に I/F (setVolume のない) を作るのでは ..
A. そこまで考えていないかも..
Q Dial で setVolume してはいけない ?
A. Yes # 結局、「どこでやるか」の問題
# 機能の集中する場所の違い
28.4.1 複数の Decorator
ModemDecrator 抽象クラスを作ると、Decorator が作りやすい
Q. 最後のパターンは C++ だったら、多重継承 ?
A. 多重継承は不要では ?
Q. delegate を使わないってことか ?
Q. 最後の例は Decorator になっている ?
==
一旦、昼休み
S. 翻訳は大変.. たった 1, 2 行に 1 時間以上かかることも..
妥協すると、クオリティが下るので...
Q. 全部を訳すのにどのくらい.. ?
A. 一年かかった..
本業は別にあるし..
S. 日本語にするには、大変 ( 流し読みなら簡単なんだけど.. )
Q. 「ぶつける」って ? ( cf. 以前の議事録 )
S. ダイヤモンド継承で、親でまた継承関係がぶつかる
Q. 原文があるとかえって難しい
なければ、自分の言葉が使える
「日本語」にするために、工夫が必要
# 追加をしている部分もある。
Q. 訳注を入れるのは ?
A. スタンスの違い
訳注を多用する翻訳者の基本スタンスは、「原文を読め」
二つのスタンスの違い
直訳 + 註釈
超訳 ( 日本語にするように努力.. )
==
28.5 Extension Object パターン
既存のクラス構造に、機能を追加するもう一つのパターン
# 複雑だが、パワフル
機能を名前で呼出す仕組 ( Q. Command パターンとの関係は ? )
Q. 「役割が違う2つのクラスを、『同じクラス階層構造』に押し込める」 ?
S. 『一つのクラス』の意味かなぁ
Q. これだけ読んでも、良く解らない.. (list 27 - )
# TestCase を積み上げることによって、作り上げた
Q. どうゆうふう考えれば.. 良いのか.. ?
A. Core の部分を先に調べたら ? ( Piece とか )
A. 今回だけ Test が先
[誤殖] List 28-36 クロオビのファイル名の所の exception は extension の間違い
S. (最新版は..) 直っています
A. 第1版なので..
[誤殖] p.526 本文 1 行目 「BOM 『オブジェク』に」=>「BOM 『オブジェクト』に」
S. これも直っています
28.6 結論
既存のクラスに影響させずに、機能を追加できるパターン
OCP/CCP/SRP/LSP/DIP
Q. 「9 章」って..
A. 色々な図形を扱う場合
S. (9 章では、まだ、必要なパターンが説明されなかったので..) 新しい図形を作る度に、クラスへの改変が必要だった、
visitor パターンは「既存のクラスの階層構造に変更を加えずに、機能を追加する」ので、これを利用することによって解決(クラスの改変が不要に)できるはず。
S. この 28 章の三つのパターンの共通な性質は
「既存のクラス階層構造に手を入れずに、機能を追加する」
こと。
Q. 御利益が理解りにくい
S. 既存のクラス構造が変っていない
S. visitor パターンだと SRP 違反なので p.519 図 28-7 の Extension Object パターンが利用される
Q. 図 28-7 ってエッセンス ?
必須メソッドがみえない ( パターンを作るのに.. )
S. インターフェースに依存するので、そちらで、必須メソッドを定義することになる
(インターフェースは..)やりたいことを記述する部分なので自由にしておよい
Q. 部品のことしか考えなくてもよいクラスが作れる
extension の方は、やりたいことは(パターンとは)別々なので..
S. 図 28-7 は、SRP を実現している
S. 本当にここまでやる必要はないかも..
Q. よいことかもしれないけど、土台が大変
S. visitor は使える
組み込み系で、テストケースを作るのに、対象に触らずに、(テストケースが)実装できた。
S. 「既存の物に手を加えずに、なんとかしろ」の場合に便利
Q. exntesion は、文字列を渡して、メソッドオブジェクトを取ってきている
リフレクションに近付いている
Q. オブジェクト指向と関係ある ?
Q. Aspect との比較は ?
# (Aspect に関連する..) JSR の内容がまだ、中身がない
A. 目的は一緒かも
Q. Aspect で class 継承もあるってこと ?
Q. コンパイル 時 ?
A. 実行時もある
実装により違う
Source/class/Byte Code
Aspct/J は、Class の変更
Seaser は Class Load 時
A. Aspect の利用例の資料がある
cf. AOP@Work: AOP Tools comparison, Part
( IBM developerWorks )
パターンを Aspec で実装するという話
==
29. State パターン
Q. 「変更の手段もなければ、保存の手段もない」って .. ?
S. 変更する必要がない場合は、保存してもしょうがない ?
Q. 引用の場合(の翻訳)は ?
S. 基本は自分で訳すが..
S. 詩などは、過去のを探して、それを使う (原則)
あんまり意味がわからないと結局、訳す
Q. この一行でとっても時間がかかっているのですね..
S. Yes
29.1 有限状態オートマトンの概要
Q. 「丸の部分」の「丸」って..
A. 「楕円」の部分でしょう ?
Q. 英語では ?
S. Circle でした
Q. 表って ?
S. 現在の状態とイベントによって、次の状態が決る
Q. マイナー状態
S. 設計者が見落しそうな状態のこと
S. プログラマは、正しく動く場合しか考えない
A. if 文のカスケードで条件を書くと、稀な場合を見逃すとか ..
遷移図を書くと真剣に考えるかも
状態遷移図では、もれがなくなる !!
S. これ(図 29-2 の誤り)は、最初に笑えないと思った。
S. 何度、お金を入れて Thnak you というだけ
Q. あっていけないこと ?
A. それは、設計の問題なので..
A. 追及してもしょうがない ( cf. Hollo World )
Q. 「(笑)」は、「:-)」だったの ?
S. 本当に文字で ( "smile" と ? ) 書いてあった。
Q. 初期状態って ?
S. Locked から始めている
Q. ◎から始めるのが正しいのでは .. ?
S. Yes
(この著者の)方針として、状態遷移の話の説明に関しては、(その機能が)必要になった時点で、必要な記法を導入する形 ( 正確な説明は p.629 付録 B )
29.2 有限状態マシンの実装テクニック
29.2.1 入れ子の switch/case 文を使った実装
List 29.1
Q. (この switch/case 文の実装は..) 第一感、うざい
A. 最初だからまあ、しょうがない..
Q. 何故、(インスタンス変数 state が..) private でない ?
S. この後に記述
遷移毎にテスト関数がある
State 変数が private だと Test から、アクセスできない
# Object 指向のドグマの一つ「calss instance は private にする」
Q. instance 変数は全て private ?
A. protect は許されるのでは ?
Q. なぜ getter/setter はだめ
A. Test のためだけに使うメソッドを実現する意味がない ?
A. 賛否両論
(テストの時にだけ利用する場合とそうでない場合を) 区別する仕組が欲しい
アノテーションが使えるかも
Q. java に friend があれば..
A. java 1.7 が入るのかも..
Compiler レベル
VM レベル
の変更
A. 無名クラスって、ほぼ firend だよね.. ?
Q. 状態遷移を持つプログラムはデバッグが大変
A. assertion を使うのかなぁ..
[switch/case の問題]
状態が複雑になると、大変
状態と実行部分の分離ができていない
Q. これ(p.535 の下から 3 行目から、そのページの最後まで..) ってほんと ?
S. かれらはコンサルをやっているので、その経験(コンサルを担当した会社で作られていた多くのコードを観た)を述べている
29.2.2 遷移テーブルを使った実装
Q. このような書き方(List 29-4 の 「unlock()」)はできるの ?
A. C++ ならできるけど java ではできない ?
「unlock オブジェクトを返すメトッド」という仕組
S. p.549 の上の方を参照
A. 関数へのポインタやメソッドへのポンタがないから..
下手に java を知っていると混乱する
# switch/case より table の方が簡単
[table の利点]
記述が容易で、
table の内容を実行時に変更可能
複数の Table をもてる。
[table の欠点]
効率
table の検索
Q. Hash を使えば、もっと速いはず
A. 多重配列にすれば早くなる ( 実装の問題 )
table 操作のための細々したコードが増える
==
[休憩]
A. (state pattern を..) 初めて使った時には、目から鱗
S. 状態が抜けると大変なので、組み込みではよく使う。
A. MS の tool は「1G の限界」があるらしい..
それ以上のデータを扱うと止る..
==
29.3 State パターン
Q. 点線が途中から実線になったが .. ?
S. 点線が二つ重なったので.. ( たまたま実線のように見える.. )
どうしようか悩んだが、「原書通り」ってことで..
## Q. State パターンと継承の関係は ?
Q. Interface に public が抜けている ?
S. ( State パターンは ) Method だけなので Instance が不要
# Strategy との比較
コンテキストを上位で保持し、状況は派生クラスで担う
S. State パターンは、実は、Strategy パターン
Q. Strategy は生成パターン / State は動作パターン という違いがあるのでは ?
Q. 区別の仕方は色々あるから..
S. テンプレートでも Strategy でも同じことができる
Strategy はテンプレートよりクラスが多いので柔軟性が高い
この二つの目的は、共に、継承クラスの再利用を目的とする。
S. 同じ図式 (UML) は同じような性質を持つ
意味的な区別ではなく形式的な区別
# Cost と Merit
=> State (論理) と Action (動作) が分割できる
効率がよい。
table の柔軟性と、switch/case の効率
[Cost]
table を作成することが大変
論理が複数の state に分散してしまう
A. State の数だけ Class ができてしまう
A. State が 150 位のシステムは作った経験がある ( もちろん生成 tool も作った )
# 空港の制御なので、許可がでないと次の state にならない
Q. 仕様は ?
A. 図 ( visio ) で..
Q. ありえないケースがあれば状態は減る
Q. 漏れが出たら ?
A. 表だから、漏れが出にくい
A. コロコロ仕様が変ったら困る
状態遷移コンパイラが欲しい
29.3.1 状態マシンコンパイラ (SMC)
状態遷移 table の実装を効率化
S. コンパイラを走らせると、状態遷移パターンのパーツが作られる
生成されたコードは ( binary と同じくらい.. ) 触らなくてもよい
S. これを使うときに入力されるものと生成されたものが List up されている。
SMC は、他の全てのパターンの利点を全て得ている
デメリットは tool の使い方を学ぶこと..
S. 本気で使うつもりなら便利
Q. state が少ければ.. 使わない
量が多ければ使いたくなる。
S. ( Table 作成は..)手動だと退屈
Q. プロジェクト毎に似たようなツールが.. ?
使える時には便利だが、使わないと全然..
Q. (Tool の)カスタマイズが必要 ?
Q. Compiler Compiler のように使える状況が結構ありそう..
29.4 状態マシンはどのようなところで利用されるのか ?
29.4.1 GUI の上位レベルのアプリケーション方針
UI の目標は状態をもたせないこと
=> ユーザは状態を把握できないから、UI で状態をもってはいけない
=> 状態を持たない Code は状態に依存する ( 状態により、振舞いを変えなければならないから.. )
Q. 「(p.544 下から 3 行目) 状態コンパイラを使ってる」って ? SMC のこと ?
S. menter (http://www.objectmentor.com/home) には C 版 (前任者) もあるので、これのことかも
Q. 「前任者を作ったエンジンを使っている」とも、読めるが..
S. そう読めるかも ( Matrix のイメージがあって.. )
Q. (List 29-11 は..) どのカラムがどの意味をもつか良く解らない
A. state, event, action
A. 引数に、名前と値に対を与える言語があるけど、そちらの方が理解りやすい
# 上位レベルの方針が一箇所に入っている。
29.4.2 GUI との対話コントローラ
User との対話状態と表示も、状態遷移で表現できる。
Q. 図 29-6 の event が解らない
A. Quit なので、WaitForDown では ?
A. Canvas の状態が記述されている。
user からの event 入力で状態が変っている。
29.4.3 分散処理
Protocol の実装にも State が使える
29.5 結論
29.6 List
# 手動で書いたものやジェネレータで書かれたものが載っている
# ジェネレータ用のテストコードは、他のテストコードとほぼ同じ
Q. (list 29-16) 拡張子に SMC が付くのが気持ちが悪い
A. 自動生成する Class 名では ? 前のはファイル名でなくパッケージ名
Q. パッケージ名が SMC でよい ?
A. まだ rule 前だから ? ( 大文字だったり.. )
A. JDK 1.1 対応 :-)
Q. 自動生成されたファイルを配るとすると、この package 名は辛い..
Q. jar にいれる場合、manifest に情報を入れて欲しいかも..
Q. (より一般的に..) freeware を使うのはよいけど実行可能 jar を作るのが大変
A. (利用する jar を class ファイルに..) 一回展開して、もう一度、まとめる
実行するだけならこれだが、version up が大変
Q. package 管理の機能がもっと欲しいよね..
A. どの version を使っているとかの Document も欲しい
29.7 参考文献
Q. 推薦図書と同じじゃない ?
A. java じゃなかったような ? 改訂版 ?
==
30 章 ETS のフレームワーク
# 再利用可能なフレームワークの設計経験
[誤殖] 「下図」を減らすには => 「数」を減らすには
S. (ワープロ変換ミス)第三版では直します。
A. これでも意味がとおりそうなのが楽しい
[誤殖] (p.560 の 30.1.2 のタイトル) 「1933 年〜」 => 「1993 年〜」
S. 直っていない
[誤殖] (P.560 page の真中当り) EST => ETS
30.1.3 フレームワーク
Q. ETS のエンジニアも作り始めた
S. ETS のエンジニアが OMI のフレームワークで作ろとしたら駄目
部分的に作る
Q. 最初の 5 問は、ETS の人が作り、フレームワークも作った
# 失敗の要因 : 他の問題を無視していた
# フレームワークそのものが難しい
Q. 難しいというのは簡単だが..
A. 汎用な物は、(分析等を行って.) 作る必要があるから..
Q. copy & past ? ( emacs な人は cut & past )
Q. プレッシャーがあると、ついつい、フレームワークに手を入れてしまう
Q. OO 方法論は「フレームワークありき」で始まっているが、そのフレームワークはどうやって作るの ?
A. (一般的な良い ?) 方法はなさそう..
フレームワークの上には(問題領域)アプリケーションがあるので、それを扱わないと..
フレームワークのフレームワークはだめ ?
S. フレームワークを作るには、問題領域の深く広い経験を持つ必要がある。
Q. 現場を知らない駄目 ?
A. それより重要な点がある
Q. フレームワークの問題領域って ?
A. サンフラシスコ フレームワークは.. ?
アメリカでは、電力会社では成功した (買収が多いでの共通項目が多い.. )
日本では、独自仕様があるのでだめ。
Q. そもそも何のフレームワーク ?
# 6 万行のフレームワークは捨てた
フレームワークを先に完成させるのはだめ
実際に動く(フレームで動く)ものを作りながらフレームワークのコードを作る
# 最低、三つのアプリケーション
32.2.4 結論
# 古い版は、すべて捨てることになった。
Q. フレームワークは二回作った ? ( 違いは ? )
A. 二回目は、他の場合も想定して作った
# 最初の部分は、せまい Domain しか考えていなかったから..
対象として、バリエーションのあるものを選ぶ
A. アプリケーションと、フレームワークを同時に作った
==
Q. (図 30-1 は.. ) なんの絵かよくわからないが... 色々な分野があるってこと ?
S. A とか U は理解りにくいかもしれませんが、前のページに定義がある..
Q. 表が虫食いなのは ?
S. その組み合わせはありえないので..
S. ちゃんとおっかけると、意味が解るはず
最初に自分で読んでも解らなかったので、原作者に例を増やしてもらい、その結果を反映してある。
Matrix を変更することによって、(重み付けが代わり..) どのような心理分析したいかを選択できる。
非常にたくみな仕組 (この仕組そのものを考えることが難しい)
Q. Test(試験結果の分析) のプロがいる ? ( プログラマの発想じゃないよね.. )
S. YES. ETS にいるプロによるもの
S. 「vignet」は「小問」と訳した
A. vignet (ビニエット:フランス語から)
S. 基本的には、点線の先のクラスを作成するだけで、後はフレームワークでやってくれる
他に、Matrix も必要だが、これを作るためのツールもあり、それは、用意されている Dictional から、拾ってきて、作りましょうという話。
Q. この話は一旦ここで、終るの ?
S. もう少し続くんだけど、微妙..
==
次回は 08/27 (LWL とぶつかるかも !! )
-- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< --
[ 戻る ]