匠の伝承w マルチな時代の設計と開発 パート3.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

わんくま同盟 東京勉強会 #10 オブジェクト指向 #1 Windows メッセージを使いこな す -Windows 流オブジェクト指向 - とっちゃん 高萩 俊行 Microsoft MVP for Windows SDK 2005/ /09.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
シーケンス図の生成のための実行履歴圧縮手法
イベント イベント: マウスの操作、キーボードの操作、ファイル操作など システムやユーザーからの入力・出力のこと
匠の伝承 マルチな時代の設計と開発.
Win32APIとMFC H107102 古田雅基 H107048 佐藤一樹 H107126 山下洋平.
アルゴリズムとデータ構造1 2007年6月12日
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
匠の伝承w マルチな時代の設計と開発 パート2.
AspectScope によるアスペクトとクラスのつながりの視覚化
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Flyingware : バイトコード変換による 安全なエージェントの実行
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
マルチな時代の設計と開発 駆け足で PART(3,4),5,6
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
Cプログラミング演習 中間まとめ2.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
匠の伝承w マルチな時代の設計と開発 パート7.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
第3回 2007年4月27日 応用Java (Java/XML).
第6回 2007年6月1日 応用Java (Java/XML).
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Collection, Generics, Iterator
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
Jakarta Struts (2) ソフトウェア特論 第11回.
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
匠の伝承w マルチな時代の設計と開発 パート6.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
匠の伝承w マルチな時代の設計と開発 パート4.
Windowsアプリケーション プログラミング
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
サブゼミ第7回 実装編① オブジェクト型とキャスト.
アルゴリズムとデータ構造1 2006年6月23日
匠の伝承w マルチな時代の設計と開発 パート7.
アルゴリズムとデータ構造1 2009年6月15日
ゲームのタスクシステム 導入編 レベル2くまー By keychan.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
匠の伝承w マルチな時代の設計と開発 パート4.
How To WPF アプリケーション Part4 By 中博俊.
モジュール分割.
アルゴリズムとデータ構造 2010年6月17日
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
Josh : バイトコードレベルでのJava用 Aspect Weaver
How To WPF アプリケーション Part3 By 中博俊.
プログラミング 2 静的変数.
Presentation transcript:

匠の伝承w マルチな時代の設計と開発 パート3

スピーカー自己紹介 / \ / ─ ─\ ゆーちです。 / ,(●) (●)、\ ハンドル名です。 | (__人__) |     /      \    /  ─    ─\    ゆーちです。  /    ,(●) (●)、\   ハンドル名です。  |       (__人__)    |     \     ` ⌒´   /    本名は、内山康広といいます。 ,,.....イ.ヽヽ、___ ーーノ゙-、.   48歳です。 :   |  ‘; \_____ ノ.| ヽ I おっさんです。_| ̄|○     |  \/゙(__)\,|  i |      >   ヽ. ハ  |   ||  株式会社シーソフト代表取締役です。                  現役のエンジニアです。プログラム書いてます。 メールソフト Becky! 用の BkReplyer という作品が微妙に有名らしす。 2ちゃんねらーではありません。 Special thanks for 2ch.

前回までのおさらい /⌒ ⌒\ /( ●) (●)\ /::::::⌒(__人__)⌒:::::\ | |r┬-| | がんばったお。      /⌒  ⌒\          /( ●)  (●)\   /::::::⌒(__人__)⌒:::::\   |     |r┬-|     | がんばったお。    \      `ー'´     /

『モノ』に対する時間軸のイベントを列挙。 時間軸へのイベントが『状態』を作る。 開発は『状態』別に分けて考える。          ____           / ―  ―\ .     / (―)  (―)\    ・・・ちゃんとまじめな話をしたんだお。           /   ⌒(__人__)⌒ \     |      ` ―     |         \           /     ノ            \      /´               ヽ                |    l              \  ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.       ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) PART 1 開発者はプロセス指向にとらえがち。 オブジェクト指向は『モノ』をとらえる。 『モノ』に対する時間軸のイベントを列挙。 時間軸へのイベントが『状態』を作る。 開発は『状態』別に分けて考える。

非同期の事象はループを分断して考える。 イベントトレース図→状態遷移表。 ステートパターンの実装。 PART 2 ____ /⌒ ⌒\       ____      /⌒  ⌒\    /( >)  (<)\   /::::::⌒(__人__)⌒::::: \  ぐだぐだだったお。   |     /| | | | |     |   \  (、`ー―'´,    / 非同期の事象はループを分断して考える。 イベントトレース図→状態遷移表。 ステートパターンの実装。

時間軸に対するイベントがオブジェクトの状態を作る。 イベントトレースと状態の関係 検査システム 挿入待ち メモリの挿入検出 検査中 時間軸に対するイベントがオブジェクトの状態を作る。 検査完了 取り外し 待ち メモリの取り外し検出 挿入待ち      /⌒  ⌒\          /( ●)  (●) \   あったあったw   /::::::⌒(__人__)⌒::::: \      |     |r┬-|      |     \      `ー'´     /

状態遷移表 状態 イベント メモリ挿入待ち (0) 検査中 (1) 取り外し待ち (2) メモリ挿入検出 検査を開始 状態を検査中に→(1) エラー表示 検査中断 →(2) ログ記録 →(1) 検査完了通知 →(0) 検査結果を表示 メモリ取り外し検出 ログを記録 次の検査準備 マトリクスを必ず埋める 状態別にイベント発生時の処理を書く

ステートパターンの構成要素 ステートマシン ステータス (状態) 状態(0) 状態(1) イベントA入口 イベントA処理 イベントA処理 唯一の状態を保持(スイッチング)する ステートマシン ステータス (状態) 状態(0) 状態(1) イベントA入口 イベントA処理 イベントA処理 イベントB入口 イベントB処理 イベントB処理 イベントC入口 イベントC処理 イベントC処理 状態遷移表と同じ構成

本日のテーマ 時間軸に対するイベントによって状態を変化させるオブジェクトには、通知の受け口が必要。 オブジェクトに対してイベントをどのように通知すればよいのか?       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  | ふむ。  /      ∩ノ ⊃  /    (  \ / _ノ |  |    .\ “  /__|  |      \ /___ /  

クラスの考え方 社員コード 氏名 生年月日 ファイル名 ファイルハンドル バッファ バッファの大きさ class Staff { long Id; string Name; DateTime Birthday; public: Staff(); : }; class File { string Name; HANDLE Handle; void *Buffer; size_t BufferSize; public: bool Open( string name ); : };          __________        /      \     普通、こう書きますが、なにか?       /  ─    ─\        /    (●)  (●) \        |       (__人__)    | ________      \      ` ⌒´   ,/  .| | Class     |     ノ           \  | | Event   |   /´                | |      |

時間軸!? クラスの要素は? メンバ(データ) メソッド(処理) ____ ) /⌒ ⌒\ ) 簡単だお          ____        )            /⌒   ⌒\      )  簡単だお       /( ●)  (●) \    )/⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y丶      /::::::⌒(__人__)⌒:::::\     |      |r┬-|      |      \       `ー‘´     /      カ       ノ             \       タ    /´               ヽ                 カ   |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ   ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ   タ    ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))  タ   タ       ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐    ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄ ̄ メンバ(データ) メソッド(処理) 時間軸!?

言語仕様としてクラスには時間の概念は含まれていません。 クラスに「時間」の概念を追加する 検査フォーム 検査ロジック ファイル×2 ファイル×2 メモリ挿入検出 ファイルオープン 中止 ファイル読み込み          ____        /      \           /  _ノ  ヽ、_  \        / o゚((●)) ((●))゚o\ 書き方、しらないお。     |     (__人__)    |        \     ` ⌒´     /    /´           `\   /  /          l  l   .___ __l  l_¶______/_/__/     ヽ   \, ´-'ヽ  ̄| ̄ ̄ ̄ ̄|   l二二二二l     ヾ_ノ   | '''' '   |   l二二二二l    | 9=ε-8. | '''..--  |   l二二二二l:::..    |   ..''  |  ''-.  ,| ファイル書き込み プログレス通知 検査完了判定 ファイルクローズ 言語仕様としてクラスには時間の概念は含まれていません。 メモリ抜出検出

イベントの発行と受け口の考察 クラスA クラスB 事象発生 事象の受取り 通知 共通化できない? 処理(メソッド) _ _ / \       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  |  仕様によってちがうんじゃない? /      ∩ノ ⊃  /    (  \ / _ノ |  |   .\ “  /__|  |      \ /___ /  

事象(イベント)って? 関数呼び出し ウィンドウメッセージ シグナル 割り込み ミューテックス キュー セマフォ : 設計仕様にあわせて 通知する内容 通知する方法 通知すべき相手 設計仕様にあわせて 個別に実装される 受け取る方法

要素の考察 通知側のクラス (通知者) 受取側のクラス (観察者) 通知情報 通知方法 受取方法 通知先 /⌒ ⌒\      /⌒  ⌒\          /( ●)  (●) \   けっこう単純?   /::::::⌒(__人__)⌒::::: \      |     |r┬-|      |     \      `ー'´     /

オブザーバ(観察者) パターン 通知側のクラス 受取側のクラス (観察者) Observable (通知情報) Notify() (通知方法) OnNotify() (受取方法)       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  | 宇宙語  /      ∩ノ ⊃  / ・・・・?   (  \ / _ノ |  |    .\ “  /__|  |      \ /___ /   Observers (通知先)

通知情報の基底クラス Observable.h クラス間の通信情報は、仕様ごとに異なる。 基底クラスでは、実体を持たないクラスとして定義。 class Observable { public: Observable(){ } virtual ~Observable(){} }; Observable.h クラス間の通信情報は、仕様ごとに異なる。 基底クラスでは、実体を持たないクラスとして定義。      /⌒  ⌒\          /( ●)  (●) \   からっぽ!?   /::::::⌒(__人__)⌒::::: \      |     |r┬-|      |     \      `ー'´     /

観察者の基底クラス Observer.h 通知情報の型 受取方法 #include "Observable.h" class Observer { public: Observer(){} virtual ~Observer(){} // 受け取ったときの振る舞いを処理する仮想メソッド virtual void OnNotify( Observable * data ) = 0; }; 通知情報の型 受取方法

情報配信者の基底クラス ObserverSubject.h 通知情報の型 観察者のリスト 観察者の追加と削除 通知 #include <vector> #include "Observable.h“ class Observer; class ObserverSubject { protected: std::vector<Observer *> Observers; public: ObserverSubject(); virtual ~ObserverSubject(); void Add( Observer *obvserver ); void Remove( Observer *observer); virtual void Notify( Observable * data ); }; ObserverSubject.h 通知情報の型 観察者のリスト 観察者の追加と削除 通知

ObserverにOnNotify()があることを知っている ObserverSubject.cpp #include <algorithm> #include "observer.h" #include "ObserverSubject.h“ ObserverSubject::ObserverSubject(){} ObserverSubject::~ObserverSubject(){} void ObserverSubject::Add(Observer *observer ){ Observers.push_back(observer); } void ObserverSubject::Remove(Observer *observer){ std::vector<Observer *>::iterator it; it = std::find( Observers.begin(), Observers.end(), observer ); if( it != Observers.end() ){ Observers.erase( it ); } void ObserverSubject::Notify( Observable * data ){ for( it = Observers.begin(); it != Observers.end(); ++it ){ (*it)->OnNotify( data ); 観察者の追加 観察者の削除 (リストから observer を見つけて削除) 通知処理 ObserverにOnNotify()があることを知っている

プログレスバーを動かしてみよう LinearPosition.h 大きさの通知 現在位置の通知 プロパティ使いたい(^◇^; #include "Observable.h" class SizeInformation : public Observable{ protected: int TotalSize; // 全体の大きさ public: SizeInformation( int totalSize ){ TotalSize = totalSize; } int GetTotalSize(){ return TotalSize; } }; class LinearPosition: public Observable{ int Position; // 現在位置 LinearPosition( int position ) { Position = position; } int GetPosition(){ return Position; } 大きさの通知      /⌒  ⌒\          /( ●)  (●) \   だんだん具体的   /::::::⌒(__人__)⌒::::: \ になってきたお    |     |r┬-|      |     \      `ー'´     / 現在位置の通知 プロパティ使いたい(^◇^;

観察者(受取側) LinearPositionObserver.h 変更するプログレスバー コンストラクタでプログレスバーを受け取り #include "Observer.h“ class CProgressCtrl; class LinearPositionObserver : public Observer{ private: CProgressCtrl *Progress; public: LinearPositionObserver( CProgressCtrl *progress ){ Progress = progress; } protected: virtual void OnNotify( Observable* data ); }; 変更するプログレスバー コンストラクタでプログレスバーを受け取り

受取側の処理 LinearPositionObserver.cpp プログレスバーの範囲を設定する プログレスバーのポジションを変更し描画 #include "LinearPosition.h" #include "LinearPositionObserver.h" void LinearPositionObserver::OnNotify( Observable* data ){ SizeInformation *sizeInformation = dynamic_cast<SizeInformation *>( data ); if( sizeInformation != NULL ){ Progress->SetRange( 0, sizeInformation->GetTotalSize(); ); return; } LinearPosition *linearPosition = dynamic_cast<LinearPosition *>( data ); if( linearPosition != NULL ){ Progress->SetPos(linearPosition->GetPosition() ); Progress->UpdateData( FALSE ); プログレスバーの範囲を設定する プログレスバーのポジションを変更し描画

メッセージ配信側 観察者の追加と削除、情報の配信 方法は基底クラスで実装済み つまり、このクラスはとりあえずいらないってこと! #include “ObserverSubject.h” class LinearPositionObserverSubject : public ObserverSubject { public: LinearPositionObserverSubject(); virtual ~LinearPositionObserverSubject(); }; 観察者の追加と削除、情報の配信 方法は基底クラスで実装済み つまり、このクラスはとりあえずいらないってこと! LinearPositionObserverSubject.h

DEMO 1 実際に動かしてみよう。 ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ やっときたお           ____         /_ノ  ヽ、_\  ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ     やっときたお /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒) | / / /      |r┬-|    | (⌒)/ / / //   やっときたお | :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/ |     ノ     | |  |   \  /  )  /     DEMOだお ヽ    /      `ー'´      ヽ /    /       |    |   l||l 从人 l||l      l||l 从人 l||l   バ     ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、 ン   ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) バ                                    ン

DEMO1の大まかな構造 通知側のクラス (CopyFileLogic) 受取側のクラス (demo1Dlg) LinearPosition (通知情報) Execute() の内部でNotify() LinearPositionObserver:: OnNotify()でプログレスバーを変化       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  |  /      ∩ノ ⊃  / ・・・・   (  \ / _ノ |  |    .\ “  /__|  |      \ /___ /   Observers (通知先)

Windowsメッセージでの通知 WindowObservable.h ずるw。 プロパティ使いたくなる今日この頃(笑) #include <windows.h> #include "Observable.h" class WindowObserver; class WindowObservable : public Observable{ friend class WindowObserver; protected: UINT Message; WPARAM WParam; LPARAM LParam; public: WindowObservable( UINT message, WPARAM wParam, LPARAM lParam ) { Message = message; WParam = wParam; LParam = lParam; } }; ずるw。 プロパティ使いたくなる今日この頃(笑)      /⌒  ⌒\          /( ●)  (●) \   本格的だお   /::::::⌒(__人__)⌒::::: \      |     |r┬-|      |     \      `ー'´     /

Windowsメッセージ観察者クラス WindowObserver.h 観察者のウィンドウハンドル friend で直接アクセスw #include <windows.h> #include "Observer.h“ #include "WindowObservable.h“ class WindowObserver : public Observer{ protected: HWND Handle; public: WindowObserver( HWND handle ){ Handle = handle; } virtual void OnNotify( Observable * data ) { WindowObservable *msg = dynamic_cast<WindowObservable *>( data ); if( msg != NULL ){ ::SendMessage( Handle, msg->Message, msg->WParam, msg->LParam ); } }; 観察者のウィンドウハンドル friend で直接アクセスw 実際にはここでの受け取りではないわけでw Windows が独自の受け口を用意するので、そこを利用します。

通知情報を変更しましょう LinearPosition.h メッセージの定義 サイズの通知 位置の通知 #include <windef.h> #include "WindowObservable.h“ static const UINT MSG_PROGRESSTOTALSIZE = ( WM_APP + 10 ); static const UINT MSG_PROGRESSPOSITION = ( WM_APP + 11 ); class SizeInformation : public WindowObservable{ public: SizeInformation( int totalSize ) : WindowObservable( MSG_PROGRESSTOTALSIZE, 0, totalSize ){ } }; class LinearPosition: public WindowObservable{ LinearPosition( int position ) : WindowObservable( MSG_PROGRESSPOSITION, 0, position ){} メッセージの定義 サイズの通知 位置の通知

コードの変更部分 demo2Dlg.cpp メッセージマップを配置 サイズ変更 ポジション変更 BEGIN_MESSAGE_MAP(Cdemo2Dlg, CDialog) : ON_MESSAGE( MSG_PROGRESSTOTALSIZE, OnProgressTotalSize ) ON_MESSAGE( MSG_PROGRESSPOSITION, OnProgressPosition ) END_MESSAGE_MAP() LRESULT Cdemo2Dlg::OnProgressTotalSize( WPARAM wParam, LPARAM lParam ) { Progress.SetRange( 0, (int)lParam ); UpdateWindow(); return 0; } LRESULT Cdemo2Dlg::OnProgressPosition( WPARAM wParam, LPARAM lParam ) Progress.SetPos( (int)lParam ); メッセージマップを配置 サイズ変更 ポジション変更

Windowsメッセージを使った事象通知 DEMO 2 Windowsメッセージを使った事象通知      /⌒  ⌒\          /( ●)  (●) \   DEMOが2つもあるお   /::::::⌒(__人__)⌒::::: \      |     |r┬-|      |  時間大丈夫かお?   \      `ー'´     /

DEMO2の大まかな構造 通知側のクラス (CopyFileLogic) 受取側のクラス (demo2Dlg) LinearPosition (メッセージと値の定義) OnNotify()ではPostMessage()だけ Execute() の内部でNotify() OnMsgXXXXで自分自身のコントロール(プログレスバー)を変化 Observers (通知先)       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  |  /      ∩ノ ⊃  / 独立性が高くなったお   (  \ / _ノ |  |    .\ “  /__|  |      \ /___ /  

まとめ オブザーバパターン:オブジェクト間の事象通知 Observable:発信側と受取側の共通情報を抽象化 Observer:事象の受け取り方を抽象化 ObserverSubject:複数の観察者に通知          ____           / ―  ―\ .     / (―)  (―)\    ・・・ふぅ・・・           /   ⌒(__人__)⌒ \     |      ` ―     |   そろそろおわりかな?      \           /     ノ            \      /´               ヽ                |    l              \  ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.       ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

オブザーバの説明は、ステートパターンの説明からはじまっているのにww ステートパターンはどうなった!? オブザーバの説明は、ステートパターンの説明からはじまっているのにww        ____      /ノ   ヽ、_\     /( ○)}liil{(○)\       /    (__人__)   \   あ!?。   |   ヽ |!!il|!|!l| /   |   そういえば。   \     |ェェェェ|     /   /              \

ファイルコピーの状態遷移表 状態 イベント アイドル (0) オープン中 (1) 書き込み待ち (2) オープン依頼 ファイルを開く成功→(1) 失敗→(0) ログ記録 →(1) ログ出力 ファイルを閉じ、削除する→(0) クローズ依頼 →(0) ファイルを閉じる ファイルを閉じ、削除する 読み込み依頼 ログを記録 読み込み処理 継続→書き込み依頼(2) 終了→クローズ依頼(1) 書き込み依頼 書き込み処理 読み込み依頼→(1) 中止依頼

ファイルコピーのステートマシン化 CopyFileState.h class CopyFileLogic; class CopyFileStateMachine; class CopyFileState{ protected: CopyFileLogic *Logic; CopyFileStateMachine *StateMachine; public: CopyFileState( CopyFileLogic *logic, CopyFileStateMachine * stateMachine ) { Logic = logic; StateMachine = stateMachine; } virtual ~CopyFileState(){} virtual void OnOpen() = 0; virtual void OnClose() = 0; virtual void OnReadNext() = 0; virtual void OnWriteNext() = 0; virtual void OnCancel() = 0; }; CopyFileState.h

それぞれの状態別クラスを派生 CopyFileIdleState.h #include "CopyFileState.h"; class CopyFileIdleState : public CopyFileState { public: virtual void OnOpen(); virtual void OnClose(); virtual void OnReadNext(); virtual void OnWriteNext(); virtual void OnCancel(); }; CopyFileIdleState.h

CopyFileIdleStateMachine.h ステートマシンを実装 #include "CopyFileIdleState.h"; #include "CopyFileOpenState.h"; #include "CopyFileWriteState.h"; class CopyFileIdleStateMachine { protected: CopyFileIdleState *IdleState; CopyFileOpenState *OpenState; CopyFileWriteState *WriteState; CopyFileState *Status; public: virtual void OnOpen(); virtual void OnClose(); virtual void OnReadNext(); virtual void OnWriteNext(); virtual void OnCancel(); }; CopyFileIdleStateMachine.h

DEMO3 説明もややこしいので、さっそく・・・ /⌒ ⌒\ /( ●) (●) \ /::::::⌒(__人__)⌒::::: \      /⌒  ⌒\          /( ●)  (●) \      /::::::⌒(__人__)⌒::::: \      |     |r┬-|      |  ほんとに時間大丈夫かお?   \      `ー'´     /

____ /⌒ ⌒\ /( >) (<)\ 発表時間どころか /::::::⌒(__人__)⌒::::: \ いそがしくて、 | /| | | | | | サンプル間に合いません \ (、`ー―‘´, / でした。 ごめんなさい。

____ / \ / ─ ─\ まあ、ふいんき(へんかんできないお)は、十分に / ,(●) (●)、\ 伝わったことにしておきましょう。 | (__人__) | \ ` ⌒´ / ,,.....イ.ヽヽ、___ ーーノ゙-、. 次回は、依存性をなくそうという試みをまじえて : | ‘; \_____ ノ.| ヽ I 本シリーズは次のステップに進む予定です。 | \/゙(__)\,| i | より進化した斬新なアプローチへと展開か!? > ヽ. ハ | ||

ご静聴ありがとうございました。 m(_._)m        ____      /      \    /  _ノ  ヽ、_  \   /  o゚⌒   ⌒゚o  \  あんまり期待しないでね    |     (__人__)    |   \     ` ⌒´     /                                  ,.へ   ___                             ム  i  「 ヒ_i〉                            ゝ 〈  ト ノ                           iニ(()  i  {              ____           |  ヽ  i  i           /__,  , ‐-\           i   }  |   i         /(●)   ( ● )\       {、  λ  ト-┤.      /    (__人__)    \    ,ノ  ̄ ,!  i   ゝ、_     |     ´ ̄`       | ,. '´ハ   ,! . ヽ、    `` 、,__\              /" \  ヽ/    \ノ ノ   ハ ̄r/:::r―--―/::7   ノ    /        ヽ.      ヽ::〈; . '::. :' |::/   /   ,. "         `ー 、    \ヽ::. ;:::|/     r'"      / ̄二二二二二二二二二二二二二二二二ヽ      | |       お し ま い         │|      \_二二二二二二二二二二二二二二二二ノ Special thanks for Yaruo charactors