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をアスペクトで作ってみる
敵を動かしてみよう
敵に弾を出させよう
敵に弾を避けさせよう
もっと頭を良くしてみよう
まとめ:アスペクト指向
おわり