読書会(アジャイルソフトウェア開発の奥義)第5回議事録

[ 戻る ]


「アジャイルソフトウェア開発の奥義」 を読む会 第5回 議事録
日時:3月26日(土) 10:00〜17:00
場所:川崎市産業振興会館 第2研修室
出席者(敬称略):高橋(智)、高橋(徹)、吉本、岩室、岩永、塚原、長谷川、村上、
   村山、遠藤、小棚木、吉村
書記:吉村

(凡例:■は本文の章節名、★は宿題)
■16 SingiletonパターンとMonostateパターン
■16.1 Singletonパターン
・getConstrcutorsで取得できるコンストラクタはパブリックのみ。アクセス可能なものは含まれない。
 ・リフレクションを使うのは、DynamicAction、フレームワーク、ベンダ依存クラスの呼び出し。

・Singleton実装方法でnullチェックを利用するものは、効率・同期を考慮する必要がある
 (参考 Effective Java)。
・ドキュメントでマルチスレッド未対応と書けばよい。
 ・アノテーションでマルチスレッド未対応エラーが出すようにするとか。

・P.231、P.236 文中の「クロスプラットフォーム」の意味がわからない。
 ・MonostateでもRMI呼び出しを利用できそうだが。

・Sigletonでモードを持つと複雑になる(参考 Refactoring to Patterns)
 ・SigletonのつもりがいつのまにかSingletonとして利用していないことが多い。

・クラスが生成されるのはそのクラスが最初にアクセスされた時。
 ・空呼び以外にクラスを生成する方法はあるか
  ・ブートストラップクラスローダに読み込む。
   ・Javaのオプションでブートストラップクラスローダに読み込むものを指定できる。
  ・Servletだとweb.xmlに書いて実現できる。JSPはできない?
   ・Servletは1インスタンスのスレッドだけでなく、複数インスタンスも生成できる。
  ・クラスが生成される処理はロックがかかる(スレッドセーフ処理となる)(Doug Lee本、Effective Java)
   ・初期化に時間をかけるのはよくない。
  ・GOF本はリスト16.2の実装だが、JavaでなくC++を前提としている。

 ・ユーザ定義クラスローダがアンロードされると消える(?)
  ★最近のJava実装で、クラスをアンロードする実装は?
  ★クラスがアンロードされたタイミングを検地する方法とは?
   ・Javaのオプション-verbosegcで見れる。
    ・alphaworksでGCCollectorで-verbosegcのログをグラフ表示できる。
          http://www.alphaworks.ibm.com/tech/gcdiag
   ・デバッガーイベントで見れる。

■16.2 Monostateパターン
・リスト16.6はマルチスレッドに向いた設計か。
 ・getXとsetXとの2つのメソッド間を一貫させる必要でなければ同期は必要はない。
 ・static変数があるのでアプリ内で共有しようという話と思うのだが同期を考慮した設計になっている
  わけでもない。

・図16-1 Alarmが鳴っているかどうかは表現されていない。
 ・Lockedステートの中にAlarmステートの遷移を書く。
  ・UMLの記法としてステートの中にステートを書くことができる。

・Monostateの例として改札はわかりにくい。

・ステートチャートからクラス生成をするツールがある。

■17 NullObjectパターン

★「throwで閉じなければならない」とはどういう意味か?原文確認。

・NullEmployeeインスタンスは複数存在してはいけないのか。正しい実装は?
 ・結城さんのスレッドデザインパターン本にも掲載されている。
  ・設計より実装のパターンが掲載されているのでは。

・equalsはデフォルト実装だと==と一緒になる。(参考 Effective Java)
・NullObjectパターンを利用しないとC++だとコアダンプするのでうれしいかも。
・NullObjectパターンは、例外に対しても正常系コードと同じコードである時に有効では。特に参照系の
 場合。

・Employee.NULLでNULLだけだとnullと間違えるのでは。
 ・java.sql.Types.NULLがある。
 ・static importを利用すればよい。
  ・static importはあまり使わない方がよい。

■18 給与システムのケーススタディ:最初のイテレーション
・この節は議論になるのでは。特にDOAを好む方には。
 ・データベースを先にがちがちにすると、ロジック側で無理なコードを書く必要がある、という状況を
  避けようという意図では。
 ・MDAでは設計の良し悪しは第3正規形になっているかどうかだという話がある。
 ・データモデリングは必要では。インデックスなど設計の詳細は後で行うという意味では。

■18.2 ユースケースを使った分析
・図18-3 (UMLの)黒菱形の意味は?
 ・コンポジションと呼ぶ。
 ・寿命が親子で同じで、かつ子は親以外から参照されていない。

・ホワイトボードの絵をPCに取り込めると便利では。
 ・ペンに機能がついていて、記述するとリアルタイミングにPCに取り込める製品がある。

■19 給与システムのケーススタディ:実装
■19.1 従業員を追加するトランザクション
・テストファーストをやったことがある人はいるか。
 ・テストファーストを新人教育に利用したことがある。おもしろかったのは、呼び出す先のクラスがない
  と動かないので必然的にインタフェースを作るようになった。インタフェースを利用してスタブと実態
  を同じパッケージ・クラス名で作成するとEclipse上でエラーが出た。
  ・テストファーストでない場合voidのファットメソッドを作ることが多い。
   ・テストのしやすさを考えると必然的に分割された戻りのあるメソッドを作成するようになる。
  ・テストのことを考えるとステートレスにするなどの設計に効果がある。
・引数の変数の値にnullが実際には入らないのにテストする意味があるか。
・テストをコンパイルエラーで始めることに意味があるのか。
 ・受け売りの話になるが、間違っているのにOKを返すテストを作成してしまうと1番怖いので、それを避け
  る意味がある。

・XXXUnitは実際に使っているのか。
 ・雑誌の記事を見てCactus(HttpUnit)をやったことがある。
 ・野村総研のオブジェクトワークスのWebで公開中のマニュアルを利用した。CVSインストール等がある。
  http://works.nri.co.jp/solution/index4-2.html
 ・JUnitはJUnitでテストしているのか。UMLツールはUMLで記述して作成されているのか。

・SunのJavaやOSのライセンスには原子力、航空交通制御などには使わないで下さい、と書いてある。
 ・使ってはダメとかでなく、リスクは自分で負って下さいね、というSunのリスク回避。
  ・制御機器では専用のプロセスコントローラで作成されている。
   ・放射線が当たるとbitが反転するのを回避している。
  ・メモリの容量が多くなると誤動作する可能性があるのでECCで保障する。
   ・データ転送の電圧が最近小さくなっているので、少しノイズが入ると狂うかもしれない。
   ・メインフレームは計算を2重に行って結果が同じかどうかでチェックして保障している。

★リスト19-2 assert("Bob" == e->GetName())の動きは? C++のstringの==演算子のオーバライドをヘッダ
 でどう書いているか

・リスト19-2 dynamic_cast(pc)は、Javaならinstanceof、もしくは
 CastExceptionをcatchするように記述する。

・OODBは利用されているのか
 ・生産管理の分野で使われているという話を児玉さんがされていた。
  ・製品はObjectStore、Objectivity。
   ・XMLDBはCache。
  ・OODBの定義はPostgresでテーブルを継承できる。どれをOODBと呼ぶのか。
   ・JDOが近い。
   ・OODBと切り離す操作ができる。切り離すと値を変更してもOODBに反映されない。
   ・マイグレーションをRDBだとがちがちだが、OODBだと簡単。
  ・検索はできるのか。
   ・パフォーマンスがでないので、配列やHashMapを利用する。

・ORMappingツールを利用したことがあるか。SQLが便利そうだが。
 ・iBatisはSQLも使える。結果をオブジェクトで返してくれる。

・Java言語が向かない場合は?
 ・起動に時間がかかる。
  ・1つのVMで複数個のプロセスを扱う技術が研究されている。
  ・VMを起動しておいて別のVMに投げるというプログラムを以前作成した。
   ・rt.jarは共有されてしまう。
  ・2回目以降の起動はOSのファイルキャッシュに残るので早くなる。
  ・HelloWorldのSwingを起動すると2000クラスくらいロードされる。
   ・ファイルキャッシュだけでなく、クラスロードの問題でもある。

■19.2 従業員を削除するトランザクション
・Javaは{}で括ると変数のスコープが分かれる。

・GPayrollDatabaseはコネクションのようなもので状態は持っていないのでは(リスト19-9参考)

■19.3 タイムカード、売上げレシート、サービス料
・C++だとuncaught exceptionをcatchする仕組みが仕様としてある。
 ・Javaも1.5から導入されている。

・リスト19-14 ~TimeCardTransactionはデストラクタで、deleteが呼び出された時点で呼ばれる。
 ・コンストラクタとデストラクタでログをはぐコードを書くRAIIパターンがある。

★「未満」の逆の意味の日本語表現は?

・リスト(本文中のプログラム)によってなぜ*(アスタリスク)ある・なしと異なっているものがあるのか。

・テンプレートはどれも同じような実装になりやすいので理解しにくいが、機械的に実装作業を進められる。
 ・継承が深くなるとわかりにくい。IDEで暗い色をつけて知らせる機能を設けるとか。

・次回は19.5.3 時間給の従業員の給与(P.300)から。

以上


[ 戻る ]