netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2005-05-31 ▲
_ [AspectJ] Java の "-ea" オプション ▲
Eclipse3.1M6 + AJDT で assert 文を書いていて気づいたのだが,アスペクト内部に書いた assert は "-ea" オプションがなくても検査される.アスペクトの結合対象になっている Java クラス内に書かれた assert 文は,"-ea" を付けない限り検査されない.コンパイラのバグっぽい症状.AspectJのサイトで調べないといけないか.
_ [論文]差分デバッグでのエラー波及の分析 ▲
Holger Cleve, Andreas Zeller: Locating Causes of Program Failures.
Proceedings of International Conference on Software Engineering 2005, pp.342-351, May 2005.
バグのあるプログラムでは,その実行中に,ある時点で変数の値がおかしくなって,その値が他の変数の値に波及していって,最終的に出力文などで開発者から見えるものとなる.
間違った変数の値が他の変数に波及するタイミング(正しいテストケースとそうでないテストケースで,値が異なる変数の集合が変わったとき)を Cause Transition と呼んで,それを発見することがバグの原因を見つけることに役立つ(開発者が調べるべきプログラムの範囲が減少する)ことを,他の手法と比較実験して確認した論文.
Cause Transition の概念自体は悪くないような気がする.スライシングが「出力に影響を与えた文の集合」を求めるのに対して,入力された値の違いと,出力された値の違いの間に,どれだけ Cause Transition があったかを求める(実行履歴の中に区切りを入れると言ってよい?).
成功するテストケースと失敗するテストケースが与えられる必要があるので,まったく動かないプログラムのデバッグには使えなかったりするけれど.
2007-05-31 ▲
_ [Java][論文] コンストラクタは引数なしが使いやすい ▲
Jeffrey Stylos, Steven Clarke: Usability Implications of Requiring Parameters in Objects' Constructors. Proceedings of ICSE 2007, pp. 529-539 [IEEE site]
Brian Ellis, Jeffrey Stylos, Brad Myers: The Factory Pattern in API Design: A Usability Evaluation. Proceedings of ICSE 2007, pp.302-312 [IEEE site]
いわゆるクラスライブラリ,API の使いやすさを評価しようという人々による論文2本です.
前者のほうは,何らかの引数が必要なコンストラクタを使うコードと,そうでないコード(引数なしで new した後に setFoo などとしてパラメータを与えるもの)とでどちらが使いやすいのか(短時間で使えるか),という比較を行っていて,後者のほうは,Abstract Factory って本当に分かりやすいのか,というのを調べています.
開発者は,コードを書くときに,とりあえずデフォルトコンストラクタの存在を仮定して new しようとし,コンパイルエラーが起きたのを見てから色々調べ始める,というパターンが多かったようです.なので,パラメータが必須なコンストラクタしかないクラスを使うのには,デフォルトで動くクラスを使う場合よりも時間がかかっています.
パラメータが必須ではない(デフォルト値つき)コンストラクタの場合は,与えるべきパラメータの組み合わせを理解することができ,それなりに便利なようです.
インタビューの結果によれば,実験対象となった開発者たちは,new してから setter を呼び出すほうが初期化の柔軟性が高くてうれしい,また,プロパティの値をセットしていく途中で適切なエラーコードを返せる(コンストラクタだと例外を投げるしかない)ことも良い,と答えていたようです.
Abstract Factory の場合は,コンストラクタを呼ぼうとする → コンストラクタが protected だからエラー発生 → 「サブクラスのために protected で用意してるよ」という決まり文句のコメントを見てサブクラスを探索 → でも見つからない → ようやくファクトリメソッドの存在に気づく というようなパターンにはまって時間を消費する場合があるようです.普通のコンストラクタで対応できるときはそうすべきだ(意味なく Abstract Factory パターンを導入すべきではない),と指摘しています.