Assertion with Aspect 石尾 隆†,神谷 年洋‡, 楠本 真二† ,井上 克郎† †大阪大学 大学院情報科学研究科 ‡ 科学技術振興機構 さきがけ {t-isio, kamiya, kusumoto, inoue}@ist.osaka-u.ac.jp Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 論文の出典 Software-engineering Properties of Languages for Aspect-Technologies (SPLAT) AOSD2004併設. Lancaster, UK, March 2004. ワークショップのテーマ: ソフトウェアの品質とアスペクト指向技術の関係 アスペクト指向技術の導入で 何が良くなり,何が悪くなるのか Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2 議論する品質 Comprehensibility 設計,プログラムの目的(要求との対応など)の理解 Predictability プログラムがどのように振舞うかの理解 Evolvability 将来の変更に対して適切に対応できるか Semantic Interactions 導入しようとしている技術が,既存の技術とどのように相 互作用するか Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 3 論文の概要 表明(アサーション)をアスペクトとして記述したらどうなるか 論文は言語要素の提案を含むが,本発表では省略 表明がもたらす効果 プログラム理解のための情報提供 安全性の向上 表明をアスペクトとして記述する効果 既存の表明で記述しにくい性質の記述が可能となる 追加・削除・変更が容易となる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 4 発表の流れ 論文の出典 表明とは 「普通の表明」の品質への影響 表明をアスペクトとして記述する アスペクト化による品質への影響 関連研究の紹介 Moxa,表明記述言語JMLへのアスペクトの導入 まとめ Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5 表明 (assertion) とは 特定の言語要素が「何をするのか」 関数,メソッド,プログラム文などに対して記述 その言語要素が実行される直前(または実行直後)に 成立していなくてはならない条件 実現方法とは無関係 例: 「sort 関数の終了時,配列の中身は昇順で整列」 「この関数は quick sort を使う」とは書かない 対応する実行時点ごとに異なる呼び名 メソッド実行の前後: 事前条件,事後条件 すべてのメソッドの実行前後: クラス不変条件 ループ文実行中: ループ不変条件 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 6 表明の用途 早期の故障検出 表明の違反=プログラムが想定外の状態である 障害が他の場所に波及する前に検出する 障害範囲の切り分けによる原因の早期解明 責任の分担 ある一定範囲を表明で区切って責任を分担 各時点でどこまで処理が進んでいるべきか明確化 曖昧さのない分担が可能 契約による設計 手続きの事前条件を満たすのは利用側の責任 手続きの事後条件を満たすのは手続き側の責任 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7 利用可能な記述手段 表明文 (assert 文) 条件検査を行うプログラム文 assert(条件式); 条件式 = true なら何もしない, false ならプログラム停止 Java や C++ など,一般的な言語で利用可能 事前条件,事後条件,クラス不変条件 Eiffel では言語としてサポート Java,C++ では JML, Larch などの支援ツール Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 8 表明の品質への影響 Predictability の向上 その言語要素が何をしているかを理解する手がかり 記述した性質に抵触するようなプログラムの誤りを検出 Evolvability は悪化する可能性もあり 詳細すぎる表明が,コンポーネントの再利用を阻害する 設計変更に対して,表明の修正が必要な場合が出てくる リファクタリング時のバグ混入の防止には役立つ Comprehensibility, Semantic Interactions には特に影 響しない 仕組みとして単純で,問題となるような動作を起こすことはない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 9 アスペクトとして書くべき表明とは (1) コンテキストに依存した表明 コンテキスト = コンポーネント(クラスなど)が利用される場面 コンポーネントの利用者側に依存した条件 例: 長さ1以上の文字列しか格納しない List オブジェクト 特定のテストケースに対する強い制約の記述 (2) 複数のモジュールに分散してしまう表明 「関連」に対する制約 例: Observer パターンの特殊形 「Observer と Subject とは,1対1対応しなければならない (1つの Subject に複数の Observer があってはならず, 1つの Observer に複数の Subject があってはならない) 」 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10 (1) コンテキストに依存した表明 コンポーネント利用者に合わせた表明のカスタマイズ A(持っているもの): List of Object B(使いたいもの): List of 長さ1以上の String A と B を継承関係で作成するのは設計上問題 A と B は Subtype 関係にない 型の指定だけなら,総称型(Generics)で対応する問題 A を内部的に使う B を実装するのは手間 A に適用できる操作が B には適用できなくなる 表明で,“少し安全に” A を使う Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 11 AspectJ での表明記述の一部 適用対象 = UserClass.stringList フィールド UserClass からの stringList.add の呼び出しで, 文字列かどうか,その長さもチェック UserClass 以外からアクセスされた場合への対応は別途必要 before (UserClass user, List list, Object added): call(* List.add(..)) && this(user) && target(list) && if(list == user.stringList) && args(added) { assert (added instanceof String) && (((String)added).length() > 0); } Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 12 アスペクトを用いる利点 コンテキストごとに表明を整理できる 分離しておいたほうが変更が容易 手軽に表明の導入が可能 コンテキストごとに専用のクラスが増加することを避け られる 「安全性を向上するためのクラス」が増えすぎるのは設計 上うれしくない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 13 (2) 複数のモジュールに分散した表明 Observer パターンの特殊形の例 Observer パターンとは Observer + update(); attach, detach Subject update + attach(observer); + detach(observer); 1. observer は subject に自分を登録する 2. subject は,自身が変化したとき, observer に通知する 3. observer は,不要になった時点で登録解除する Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 14 Observer パターンへの制約付加 付加する制約: Observer と Subject を1対1対応させる observer1 observer2 接続済 subject1 subject2 新たな接続を禁止 Subject は接続している Observer を知っている 別の Observer が接続してきても,容易に確認できる Observer の,他の Subject への接続をどう防止するか? Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 15 従来の解決方法 Observer がどの Subject へ接続しているかという情報を Subject からアクセス可能にする必要あり Subject は 「誰とも接続していない」 Observer だけ受け入れる Subject は,接続してきた Observer の内部状態をチェックし,接 続したら Observer の内部状態を変更する 表明の検査のために実装が影響されてしまっている 制約に関する表明,実装が Observer/Subject に分散 Observer の状態に関する表明が分散 何のための表明であるかが明確でなくなる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 16 アスペクトでの解決 AspectJ を用いた記述例 Observer がどの Subject に接続したかの状態の保存・チェックをアスペクトに取り込む Subject Observer.connected = null; before(Observer observer): execution(Subject.attach(Observer)) && args(observer) { assert (observer.connected == null); } after(Observer observer, Subject subject): execution(Subject.attach(Observer)) && this(subject) && args(observer) { observer.connected = subject; } Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 17 アスペクトを用いた解決の利点 複数のオブジェクトを横断した表明のモジュール化 複数モジュールに分散させるより,見通しが良い 他の制約と「混ざらない」ため,変更や除去が容易 コンテキストに依存した表明のときと同様 表明記述用の特殊な実装を明示的に記述しておける 先の例では Observer が接続した Subject の参照管理 表明検査「専用」インタフェースを,他のモジュールに使わせない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 18 アスペクトの導入による品質への影響 Predictability を強化 従来は書きにくかった表明への対応 コンテキストに応じた性質の書き分け 複数のモジュールを横断した性質を書ける Evolvability もサポート コンポーネント外部からの柔軟な表明の追加・削除 デバッグ用の一時的な表明の追加 汎用的なコンポーネントの安全性向上 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 19 関連研究: Moxa 契約による設計を支援するアスペクト指向的振舞イ ンターフェース記述言語Moxa. 山田聖(JAIST),渡部卓雄(東工大) 出典: 情報処理学会第 52 回プログラミング研究会 (SIGPRO) Java 用の表明記述言語 JML に,「表明アスペクト」 モ ジュールを追加 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20 Moxa のアプローチ メソッドごとに表明を書くのではなく,表明ごとにメソッ ドをリストする 従来 Method 1 表明A 表明B Moxa 表明A 表明A Method 2 Method 3 表明B Method 1 Method 2 表明B 表明A 表明C Method 3 表明C Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 21 Moxa のモジュール機構の特徴 クラスと独立して表明を記述できる 主目的は,クラス内の表明の整理 表明が主体となった記述 同じ性質を持っているメソッドを一覧する場合に便利 初期化用メソッド,初期化が終了したら使えるメソッド,終了処 理用メソッド… のようにメソッドを分類するなど Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 22 まとめ 表明が元々持っていた影響 表明は Predictability を向上させる コードが何をしているかを説明する 誤った振る舞いをしていれば,検出する 表明は Evolvability を悪化させることがある 詳細すぎる表明は,再利用性などにも悪影響 アスペクトが,表明の能力を強化する Predictability を強化 コンテキストに応じた性質を書き分けておける 複数のモジュールを横断した性質を書ける Evolvability もサポート 追加や削除が容易で,再利用性への悪影響も防ぎやすい Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 23 補足資料 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 24 表明の悪影響は? 表明の記述をアスペクトに分離することで,定義が分散して かえって理解しにくくなる? コンテキスト依存の表明は,コンポーネント本来の表明 + 「そのコン テキスト依存の表明」 だけ見つけられれば良い 利用場面に対応するクラスなどと一緒に配置することで管理が可能 複数オブジェクトを横断した表明は,元々,書きにくいものも存在 副作用のある表明 表明自体が何らかの作用を持つと,混乱を招く プログラミング言語/コンパイラによる保護の活用 C++ における const キーワードなど Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 25 Moxa の特徴 クラス内の表明を整理する 表明の数が減少する 同じ性質を持ったメソッドを一覧できる 初期化用メソッド,初期化が終了したら使えるメソッド,終了処 理用メソッド… のようにメソッドを分類するなど クラス間の関係も(たぶん)書ける 表明の記述に特化している利点 副作用の問題などが発生しにくい 表明記述用の便利な関数・演算子が使える Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 26 提案していた言語機構 assert(expr) の,expr の部分の関数の実装をアスペクトに 追い出す // FileIsOpen の実装は誰かアスペクトが提供してくれる // 複数提供された場合は全部の AND をとる assert(FileIsOpen()); cflow 述語を使う // この文は,Foo.foo から呼ばれたときだけ通過できる assert ( cflow ( Foo.foo() ) ); AspectJ + Annotation などで実現可能な領域に近い Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 27 安全性と再利用性 表明は安全性を高める 安全のためには書きたい 条件を書きすぎてしまうと再利用しにくい コンポーネントの2種類の制約 コンポーネント本来の制約 例: このList には「任意の null でないオブジェクトを格納する」 一般的なオブジェクトに適用できるので,再利用が容易 アプリケーションが必要とする「最小限の」機能 例: このListには「長さ1以上の文字列を格納する」 誤ったオブジェクトを格納する可能性はなくなる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 28 「安全な再利用」のための制限 Behavioral Subtyping あるオブジェクトが,別のオブジェクトの代替となる条件 Strong (拡張ではない) Original Component require (事前条件) Weak Specialized Implementation Simple Implementation Weak Extension Behavioral Subtyping Generalization ensure (事後条件) Strong Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 29
© Copyright 2024 ExpyDoc