アスペクト指向とは?

Download Report

Transcript アスペクト指向とは?

ACE KG発表
発表者: *
プログラミングスタイル
~オブジェクト指向からアスペクト指向まで~
http://www.ht.sfc.keio.ac.jp/ace/...
Outline

はじめに



背景
シナリオ
オブジェクト指向


概要
シナリオ上のオブジェクト指向説明

オブジェクト、デザインパターン用語を使わないで説明する



なぜこのモデルが必要なのかを激しく説得する?
デザインパターン
アスペクト指向

(7分)
オブジェクト、デザインパターン用語を使わないで説明する


なぜこのモデルが必要なのかを激しく説得する?
オブジェクト指向説明 (8分)
シナリオ上のデザインパターン適応説明


(7分)
カオス
(8分)
(40-50分)
背景
 システム開発で苦労する事例
 事例1
 事例2
 写真や図を入れる
本発表の進め方
 シナリオを基に説明
 ひとつのゲームプログラム使って話を展開
シナリオの問題解決
技法の説明
シナリオの説明
 ロボットアクションゲーム(フィールド型)
 敵キャラを撃って倒すゲーム
シナリオの分析
 要求事項
 ゲーム世界の管理
 自キャラ・敵キャラ
 障害物
 自キャラ・敵キャラの操作
 画面描画
問題発見
 分析・設計
 どのように分けるのか?
 プログラム上の最小単位など
 どこが共通なの?
 うまく連携させには?
 モジュール間の連携
 オブジェクト間の分離性を高める
オブジェクト指向
オブジェクト指向とは?
 プログラムでの意味
 モジュール化するためのパラダイム
 対象の事象1つ1つをモジュール化してシステムに落
とし込む
 システム分析/設計での意味
 仕組みや原理を理解し、説明するための方法
 1つの物として区別できる単位を最小単位とする
基本的な概念
何がオブジェクトなのか?
 1つの実体として頭に描くことのできる概念
例:人間、車、乗り物、会議、戦争
オブジェクトの性質
 属性と操作(インタフェース)を持つ
外部からはインタフェースだけを利用
 メッセージを互いに発信、受信して動く
テレビを使った例
 テレビオブジェクト
 チャンネル
 チェンネルを変更する
 テレビチャンネルを変え
る
 リモコンでメッセージを
飛ばす
 オブジェクト
 属性
 操作
チャンネル変更
メッセージ
シナリオで実践してみる!
 ロボットアクションゲーム(フィールド型)
 敵キャラを撃って倒すゲーム
オブジェクトの発見
 ゲーム世界のオブジェクトを発見
自分
弾 敵
ロボット
ゲームの世界
物
オブジェクト間の関係
 ゲーム世界のオブジェクトを発見
ゲーム中の物
(Object)
オブジェクト間の関係
 World Objectの役割とは?
 共通な性質を持つ親
 物体の座標
 物体の大きさ など
 なぜ親が必要なのか?
 再利用が可能になる
これもオブジェクト!




ゲームの世界
画面描画
キャラ操作
敵キャラのAI
オブジェクト間の相互作用
 ゲームの世界へゲームオブジェクトが通知
ゲームオブジェクト
 弾が(x、y)に移動した
自分
弾 敵
ゲームの世界
オブジェクト指向の考え方
 要素のすべてがオブジェクト
 どれが要素なのか決めるのは人それぞれ
 オブジェクト間の相互作用で全ては動く
 メッセージを送って協調作業をする
基本的な疑問
 なぜオブジェクト指向なの?
 可読性の向上
 直感的なプログラミング
 複雑さの低減
 実装部分を隠蔽化できる
 再利用しやすい
 実装やインタフェースをうまく再利用できる
クラスとインスタンスについて
 クラス
 概念
 プログラム上で表現
されたもの
 インスタンス
 具体物
 実際に動作している
もの
クラス
インスタンス
継承
既存のクラスをベースとして、新しいクラスを定
義すること
 基本クラス
クラスライブラリ
自作のクラス
 派生クラス
派生クラスは基本クラスから全てのメンバを受
け継ぐ(継承)
 基本クラスを再利用しながら新しい機能を実装
目的
基本クラスが持つ本質的性質は同じだが、より
特殊で多機能なクラスを作成する
 容易なクラスの拡張
オーバーロードとは
 同一の関数やメソッドにおける多重定義
 引数
 個数
 データ型
 並び順
基本動作が同じなら、
一つのオブジェクト
基本動作は同じだが、引数が異なる
例:印刷プレビュー
 表示データの型はさまざま
 PrintString, PrintInteger, PrintFloat など
 オーバーロードなし
 複数のメソッドを 別々に定義
 オーバーロードあり
 一つのメソッドを定義
表示データの型が変更しても、
プログラムの変更は最小限
ポリモフィズムについて
 poly=多様の
 morphism=形態を持っている状態
↓
 多態性
 多形性
 多様性
 よく生物学で使われる
 例えば、コウモリと鳥。
 2億~3億年くらい昔のこと、爬虫類から「哺乳類」と「鳥類」に分かれて、次第
に現在の「哺乳類=コウモリ」と「鳥類=鳥」に進化していきた。
 両者は異なる系統の生物であり、骨格が違うが、「翼状の体の一部を使って空
を飛ぶ」という性質は同じです。
 系統が全く異なるにもかかわらず、極めて似た性質を持つ
2.具体的に見ると
テレビがつく
・スイッチを入れる
・音量を設定する
・局を選ぶ
ラジオがつく
3.オブジェクト指向で言うと
 対象
 「テレビ」
 「ラジオ」
という内部構造の違ったものに対して、
 操作
 「スイッチを入れて」
 「放送局を選んで」
 「音量を調節する」
といったように同じインターフェースが使えるようになってい
る
 共通のインターフェースの背後で実行される手続きを隠して
しまう状態を「ポリフェノイズム」という。
4.何のためにあるか
あまり詳しい知識が無くても、最低限のレベル
さえあれば利用できる環境を作る。
オブジェクト指向における「ポリフェノイズム」の
意味です。
問題の確認 その2
 うまく連携させには?
ゲームの世界
画面描画
キャラ操作
連携の発見
 ゲームの世界と画面描画
 ゲームキャラとユーザ入力
 ゲームオブジェクトとゲームの世界
ゲームの世界と画面描画の場合
デザインパターン概要
デザインパターンの適用
 Observerパターン
オブジェクト指向による設計
ここまでのまとめ
 オブジェクト指向
オブジェクト指向の問題点
 抽象化の仕方の多様性
 システムの捕らえ方は人によってまちまち
 拡張や変更の予測は難しい
 後で何を変更したくなるのかは予測しずらい
 継承と合成の選択
 合成したほうが再利用性が高まるかも
 直感的な記述と再利用性の相反
 実世界の概念を素直に記述してもだめ
アスペクト指向
現在の問題点
 各モジュールを完全に分離できない
モジュール化の原則
 関心事ごとにモジュールを分ける
関心事とは
モデルを関心事で分けると
ビュー
入力
世界
AI,プレイヤー
今回のモデルの問題点
 「世界」を記述するときに、オブザーバの存在
を意識する必要性
 本来、「世界」は独立したモジュールのはず
オブザーバパターンにおける関心事
 オブザーバパターンに関連した関心事
 「世界」を表現したい
 Worldクラス
 「世界」を描画したい
 WorldPanelクラス
 「世界」が変化したら「世界」を描画したい
 WorldクラスとWorldPanelクラス
モジュールを
またがってる!
横断的関心事
 他の関心事に強く依存してしまう関心事を「横
断的関心事」という
 オブジェクト指向では扱いきれない
アスペクト指向の導入
 アスペクト指向による解決
 オブジェクト指向では扱えない問題が解決できる
アスペクト指向とは?
その他の問題点
 例えば・・・
 ユーザ操作
 「キー入力に基づいてロボットを操作したい」は横断
的関心事
 AI
 「AIの表現」と「世界の表現」は別の関心事
アスペクト指向導入の利点
 横断的関心事がモジュール化できる
 オブジェクト指向では実現できない
 仕様変更に強い
 オブジェクト指向は静的な構造を記述する
 構造変化に弱い
アスペクト指向の欠点
 コード量の増大
 一般的にモジュール化を進めるとコード量が増え
る
 コードの見通しが悪くなる可能性
 あるコードに関連するコードが、全く別の場所に書
かれているかも・・・
デモ
 アスペクト指向を使ったプログラミングの実演
アスペクト指向を体験してみたい方
 AspectJの動作に必要なもの
 Java SDK
 Eclipse
 AspectJプラグイン
敵のAIをアスペクトで作ってみる




敵を動かしてみよう
敵に弾を出させよう
敵に弾を避けさせよう
もっと頭を良くしてみよう
まとめ:アスペクト指向
おわり