netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2004-08-05 古い日記からの変換データ [長年日記] ▲
_ [論文]DbCを条件付で無視するキャスト ▲
Robert Bruce Findler, Matthew Flatt, Matthias Felleisen:Semantic Casts: Contracts and Structural Subtyping in a Nominal World. Proceedings of 18th European Conference onObject-Oriented Programming, pp.364-388, Oslo, Norway, June 14-18, 2004.
ほんのわずかに事前条件や事後条件が異なるだけでコンポーネントが再利用できなくなる場合がある.特定のコンテキストで利用するために少なくともその場面では制約に従っていることがある.
たとえば,正の整数しか格納しないキューが要求されている場面で,手元に任意の整数を格納できるキューが存在していて,それをそのまま使いたい,という要求が生じる.
そこで,Semantic Castとして「今回はこのコンポーネントが責任を持つから事前条件・事後条件の一部を見逃してくれ」という感じの宣言をしてキャストを行う.実際にエラーが起きた場合は,Semantic Castを行ったときに「責任を持つ」と宣言したコンポーネントが悪いというエラーが出されることになる.
基本的には,クラス階層として継承関係になくてもBehavioral Subtyping を保っている場合などは安全にキャストできるので,場合によっては便利でないこともない.そのわりには仕掛けがおおげさかもしれないが.
_ [AspectJ]ドキュメント整理 ▲
アスペクト指向技術セミナーに出かけたりする準備をしつつ,AspectJ のドキュメント量がいい加減増えてきた感があるのでそろそろ整理しようと思い立ったりする.wiki にしておくのが,レイアウト面の手抜きができて楽そう?なので,wiki 各種について調査開始.
_ [論文]テスト実行結果からのマルコフモデル構築 ▲
James F. Bowring, James M. Rehg, Mary Jean Harrold:Active Learning for Automatic Classification of Software Behavior.Proceedings of ISSTA 2004, pp.195-205,Boston, Massachusetts, USA, July 2004.
あるプログラムにテストケースを与えて出てきた実行履歴のうち,各分岐で True/False のどちらにどう進んだか情報を抽出する.この True/False での分岐回数を次の分岐点への遷移確率と考え,マルコフモデルを構築する.
テストデータの自動生成ツール等を使ってデータを生成し,プログラムを1回実行して分岐をどう通ったか列が出るので,それを作成済みのマルコフモデル上である程度の確率で起こる動作なのかをテストし,確率的に起こりにくい=未知の振る舞いとして新しいマルコフモデルを追加するというactive learning を行ってテストケースを増やしていけば,有用なテストケースだけが抽出されていくという話.
ケーススタディで Batch Learning と比較しているが,学習データが増えてきたときの学習効率が若干違っていて,Batch のほうはデータの増加量に対して結果があまりよくならない場合があるみたい.
350個のデータで13000近いデータを分類したときで,未知の振る舞いが検出される確率が,active learning 側は batch に比べて10分の1程度まで下がっている.これは,未知の振る舞いが検出されにくい=テストケースがそれなりにそろっていて,未知の環境(実働環境)に置かれても大丈夫だろう,と確信できるということになってくる,らしい.
batch learning に対する active learning のテストデータの分類における有用性を示してはいると思うのだが,この手法を用いて作ったテスト計画が(たとえば未知の振る舞いが検出される確率が 0.001 になるまで,といったテスト計画が)どのくらい意味を持つのか,というのはいまいち分からず.けっこう面白い研究ではあると思うのだが.
_ [論文]外部状態のアサーション ▲
Robert DeLine, Manuel Fähndrich: Typestates for Objects. Proceedings of 18th European Conference onObject-Oriented Programming (ECOOP 2004), pp.465-490,Oslo, Norway, June 14-18, 2004.
クラスの型以外に,オブジェクトの取りうる(外部から見える)状態も宣言できるようにして,各メソッドの事前条件や事後条件として状態遷移を記述できるようにする手法の提案.
たとえば,[ TypeState("Open", "Closed") ] class WebPageFetcher {...} と記述することで,そのインスタンスが Open か Closed の2状態を取るようにする.
各メソッドの先頭に[ Pre("Closed"), Post("Open") ] void Open() { ... }というようにヘッダをつけることで状態遷移を宣言する.また,[ Post("Closed") WhenReturnValue=true ] といった記述でメソッドが返した値に状態遷移を関連付けるといったことを考慮している点はけっこう面白い.インタフェースを書く人間は状態を考慮して記述するが,実装者はその状態を考慮せずともコードが記述できる(もちろん戻り値の値はきちんと設定する必要はあるが).
あるクラスの事前の状態・事後の状態からフィールド値がどのような条件であればその状態である,というのがわかるが,子クラスでメソッドが書き換えられるとその条件は変わってくる.そのため,クラスフレームという単位で状態管理を行う.1つのオブジェクトに,そのオブジェクトが属するクラス階層の各クラスについてそれぞれ1フレームが準備され,状態を格納する.
WebFetcher を継承して CacheFetcher を作ったとすると,普通に WebFetcher.Open を使っている場合は,[WebFetcher@Open][CacheFetcher@Closed]といった状態になる.これでは子クラスを使う場合に不便なこともあるので,virtual なメソッドに対してはきちんと子クラスの状態も変わって,変えたくない場合は Post("Closed", Type=Subclasses) などと明示的に宣言できるようにするみたい.
基本的には Liskov Substitution Principle とかに従っていてメソッドごとの状態の "副作用" が明示されるので使い方によってはかなり便利.インタフェースで外部状態だけ書いて実装クラスで内部状態まで書くといった使い方をすれば仕様と実装も区切られるし,面白いかも.
_ [論文]Composite パターンの拡張問題 ▲
Mads Torgersen: The Expression Problem Revisited. Proceedings of 18th European Conference on Object-Oriented Programming (ECOOP 2004), pp.123-143,Oslo, Norway, June 14-18, 2004.
"Expression Problem" と呼んでいるのは,Composite パターンを使ってツリー構造を作ってその上で再帰呼び出しや Visitor を使って処理を行うとき(たとえば Expression クラスを継承したAdd クラスと Literal クラスで加算式を表現するとき),Composite ツリーに新しいクラスや処理を追加しようとすると既存のクラスのコードを変更しなければならない場合がある,という問題.
で,この人は,Java Generics が導入されそうな時期だからかGenerics を使って問題を解決できるんですよーという提案.Visitor パターンによる実装を operation-centered,クラス階層による再帰構造を data-centered approach としてそれぞれの場合で,別個に解法を提案して,さらに hybrid approach というのを提案している.
基本的には,ある古いコードで生成されたオブジェクトが他の新しい演算などが追加されたコード上でも稼動することが目標らしい.
アプローチとしては Visitor パターンを使って accept(T node) のように型パラメータでaccept を一般化しておいて,ノード側も受け取る Visitor を型パラメータで一般化しておいて,既存のコードを使っている部分を変更せずに新しいクラスなどを追加できるようにしましょう,と言っている.
立場としてはコードの書き方,実装のための技術という感じ.