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

Slides:



Advertisements
Similar presentations
匠の伝承 マルチな時代の設計と開発.
Advertisements

システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
記 憶 管 理(1) オペレーティングシステム 第9回.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
匠の伝承w マルチな時代の設計と開発 パート3.
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
PF(Project Facilitation) プロジェクト・ファシリテーション
アルゴリズムとプログラミング (Algorithms and Programming)
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
C言語 配列 2016年 吉田研究室.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
第13回 プログラミングⅡ 第13回
PF(Project Facilitation) プロジェクト・ファシリテーション
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
第20章 Flyweight ~同じものを共有して無駄をなくす~
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Flyingware : バイトコード変換による 安全なエージェントの実行
第2回 Microsoft Visual Studio C++ を使ってみよう
マルチな時代の設計と開発 駆け足で PART(3,4),5,6
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
プログラミング論 ファイル入出力
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
匠の伝承w マルチな時代の設計と開発 パート7.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
iioLoadFile()とiioMallocImageBuffer()の補足
第6回 2007年6月1日 応用Java (Java/XML).
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
プログラミング演習I 2003年6月25日(第10回) 木村巌.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
プログラミング論 ファイル入出力
アルゴリズムとデータ構造1 2005年7月5日
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第4回 ファイル入出力方法.
匠の伝承w マルチな時代の設計と開発 パート6.
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第1章 いよいよプログラミング!! ~文章の表示 printf~
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
プログラミング演習I 2003年7月2日(第11回) 木村巌.
匠の伝承w マルチな時代の設計と開発 パート4.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
アルゴリズムとデータ構造1 2006年6月23日
匠の伝承w マルチな時代の設計と開発 パート7.
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
匠の伝承w マルチな時代の設計と開発 パート4.
モジュール分割.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
プログラミング演習I 2003年6月11日(第9回) 木村巌.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
コンピュータープログラミング (C言語)(10) 1.ファイル入出力
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
Josh : バイトコードレベルでのJava用 Aspect Weaver
プログラミング 2 静的変数.
Presentation transcript:

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

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

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

デスマーチプロジェクトばっかりやってきた。                 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\                 /                      \               /                         \              /      ―――            ―――  \                     /          _                _    \     カ           /          /´ ,..::::::::::.ヽ ヽ         /´ ,..:::::::::::.ヽ ヽ \         タ         /        ,‘  ,;::::::::::::::::::’, ‘,     ,’  ,;:::::::::::::::::::‘, ’, \        /          {  {:::::::::::::::::::::} }     {  {::::::::::::::::::::::} }    \   カ      /           ‘、 ヽ::::::::::::::/ /      ’、 ヽ::::::::::::::/ /        \       |            (;;;;;;;;;;)) ̄ /       |     \   ̄             |     タ      |            /‘       /         ∧       ’,              |      |          {{        {         / ヽ      }                |      |           ヽ       ヽ___/ __ \___ノ               | . _______      \          人        ヽ   ´    `  ‘              /  ││        \           ( し.)                                  /   ││         \       `¨                           /    ..││          /                                     \      ││         /                                          \    ││ デスマーチプロジェクトばっかりやってきた。       ____      /⌒  ⌒\    /( >)  (<)\   /::::::⌒(__人__)⌒::::: \  しごとください。   |     /| | | | |     |   \  (、`ー―'´,    /

そーじゃなくて。

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

USBメモリの検査 要件 1.USBメモリの製造工程で製品検査 2.転送速度が規定値の範囲内かを検査 3.検査が完了したら抜き差しで次の製品       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  |   /      ∩ノ ⊃  /    (  \ / _ノ |  |    .\ “  /__|  |      \ /___ /  

イベントトレースと状態の関係 検査システム メモリの挿入検出 検査完了 メモリの取り外し検出 取り外し 待ち 挿入待ち 検査中 挿入待ち      /⌒  ⌒\          /( ●)  (●) \   いっぽん!?   /::::::⌒(__人__)⌒::::: \      |     |r┬-|      |     \      `ー'´     /

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

本日のテーマ

同期処理から非同期処理へ ____ / \ / _ノ ヽ、_ \ / o゚((●)) ((●))゚o \ え?ステートパターンじゃないの?        ____      /       \    /  _ノ  ヽ、_ \   / o゚((●)) ((●))゚o \  え?ステートパターンじゃないの?   |    (__人__)‘    |   \     `⌒´     /

ファイル転送部分の考察 ファイルのオープン ファイルの新規作成 転送 ファイルを読み込む ファイルを書き込む EOF 継続 書き込み部分だけ経過時間を測定 ファイルのクローズ ファイルのクローズ        ____      /ノ   ヽ、_\     /( ○)}liil{(○)\    (やるおのスペースがないお)   /    (__人__)   \   |   ヽ |!!il|!|!l| /   |      \    |ェェェェ|     /   /              \ ※ファイルの転送では厳密な転送速度を測定できませんが、この業務ではある程度の性能があることがわかれば、OKとのことでした。

ファイルを転送し、書き込みの時間を測定する ファイルの準備 読み込み用のファイル1をオープンする 書き込み用のファイル2をオープンする ファイルの転送 ファイル1を読み込む ファイル2に書き込む(ここで時間測定) ファイルを閉じる ファイル2を閉じる ファイル1を閉じる       / ̄ ̄ ̄\     / ─    ─ \    /  <○>  <○>  \. 脳内メーカー?    |    (__人__)    |    \    ` ⌒´    /

ファイルの準備 static const int BUF_SIZE = 32768; bool FileCopy( const char *src_, const char *dst_, DWORD *msec_ ) { HANDLE src = CreateFile( src_, OPEN_EXIST, ... ); if( src オープンできない ) return false; } HANDLE dst = CreateFile( dst_, CREATE_ALWAYS, ... ); if( dst オープンできない ) CloseHandle( src ); rerturn false;          __________        /      \     宇宙言がかいてあるお?       /  ─    ─\        /    (●)  (●) \        |       (__人__)    | ________      \      ` ⌒´   ,/  .| | C       |     ノ           \  | | Windows   |   /´                | | WIN32    |

ファイルの転送 bool rc = true; DWORD total_msec = 0; try { DWORD result; while( ( rc == true ) && ( ReadFile( src, buffer, BUF_SIZE, &result ) == TRUE ) && ( 0 < result ) ) DWORD stt = GetTickCount(); DWORD write_result; rc = WriteFile( dst, buffer, result, &write_result ); total_msec += ( GetTickCount() - stt ); }       ____      /⌒  ⌒\    /( >)  (<)\   /::::::⌒(__人__)⌒:::::\  GetTickCount() だと、   |     /| | | | |     | ホントはうまくいかないお   \  (、`ー―'´,    /

ファイルを閉じる if( rc == true ) { *msec_ = total_msec; } CloseHandle( dst ); CloseHandle( src ); return rc;          ____        )   簡単だお         /⌒   ⌒\      )  バッファの確保と解放は、カットしちゃったお       /( ●)  (●) \    )/⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y丶      /::::::⌒(__人__)⌒:::::\     |      |r┬-|      |      \       `ー‘´     /      カ       ノ             \       タ    /´               ヽ                 カ   |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ   ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ   タ    ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))  タ   タ       ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐    ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄ ̄

注目 bool FileCopy( const char *src_, const char *dst_, DWORD *msec_ ) 書き込み時間を格納する 書き込むファイル名          ____        /      \           /  _ノ  ヽ、_  \   なんかおかしいお     / o゚((●)) ((●))゚o \     |     (__人__)    |     \     ` ⌒´     /    /´           `\   /  /          l  l   .___ __l  l_¶______/_/__/     ヽ   \, ´-'ヽ  ̄| ̄ ̄ ̄ ̄|   l二二二二l     ヾ_ノ   | '''' '   |   l二二二二l    | 9=ε-8. | '''..--  |   l二二二二l:::..    |   ..''  |  ''-.  ,| 読み込むファイル名

違和感あるよね? そもそも別々のことなのに、 一度にしようとしている件。 / ̄ ̄ ̄ \ ホジホジ / ― ― \ ファイルを転送する 書き込み時間を計測する        / ̄ ̄ ̄ \  ホジホジ      / ―   ― \     /   (●)  (●)  \    ん?また脳内?     |     (__人__)      |      \   mj |⌒´     /    出番が少ないお。        〈__ノ       ノ   ノ そもそも別々のことなのに、 一度にしようとしている件。

追加要件 / ̄ ̄\ / _ノ \ | -◎-◎) | (__人__) (あらさがし、あらさがし・・・)            / ̄ ̄\           /   _ノ  \           |     -◎-◎)              |     (__人__)   (あらさがし、あらさがし・・・)              |     ` ⌒´ノ   不良品のUSBメモリをさすと、ダンマリになりますね。                |         }    中止ボタンを出して               ヽ        }    いつでも中止できるようにしてください。             ヽ、.,__ __ノ        _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、   /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_  丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::          ,, -──- 、._         .-"´         \.         :/   _ノ    ヽ、_ ヽ.:         :/   o゚((●)) ((●))゚oヽ:       :|       (__人__)    |:  プギャー!!!       :l        )  (      l:  聞いてねぇよ!       :` 、       `ー'     /:        :, -‐ (_).        /        :l_j_j_j と)丶─‐┬.''´           :ヽ   :i |:              :/  :⊂ノ|:

パラメータ増やして対応・・・ bool FileCopy( const char *src_, const char *dst_, DWORD *msec_ , bool& canceled_ ) コピー中にこの変数が変化したときは、中断を意味しますよ、とか。          __________        /      \     C言語のはずだったのに?       /  ─    ─\        /    (●)  (●) \   参照?     |       (__人__)    | ________      \      ` ⌒´   ,/  .| |          |     ノ           \  | |    |   /´                | |      |

追加要件 ____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ 想定の範囲内だお。 | |r┬-| |             / ̄ ̄\           /   _ノ  \           |     -◎-◎)              |     (__人__)    (がたがた言ってると、もう仕事 流さねぇぞ!)              |     ` ⌒´ノ   動いてんのか、死んでんのかわかりませんね。                |         }    プログレスバーを出すように               ヽ        }    してください。             ヽ、.,__ __ノ        _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、   /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_  丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::          ____        / \  /\ キリッ .     / (ー)  (ー)\         /   ⌒(__人__)⌒ \   想定の範囲内だお。     |      |r┬-|    |      \     `ー'´   /     ノ            \   /´               ヽ  |    l              \  ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.   ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) あ。納期2日ね。

パラメータ増やして対応・・・ bool FileCopy( const char *src_, const char *dst_, DWORD *msec_ , bool& canceled_ , CALLBACK _FUNC*on_progress_) コピーの経過中に、この関数、呼び出してね。          __________        /      \     なんか、ややこしくなったお。       /  ─    ─\        /    (●)  (●) \        |       (__人__)    | ________      \      ` ⌒´   ,/  .| |          |     ノ           \  | |    |   /´                | |      |

再利用できる? ,.-' 、ヽ `ヽ、 / __ヽ! ヽ / ´ _`ヽ´ ヽ i ,.r'´ ` ,.-、 i         ,.-' 、ヽ        `ヽ、        /   __ヽ!           ヽ      /    ´ _`ヽ´          ヽ      i    ,.r'´ `  ,.-、            i     l   ´      ,、r 、 ヽ、       l         l         ,ィ/   ヾト、 ヽ       |     l     ,.ィ / i{     i} ヽ ト、     !     別の仕事でファイルのコピーが必要なの。       jr.シ   /l !/l.! {!       }! } i,ハ    ,!    l.イ/ _{. i!|!_|!__!_      } __!l_!__|!ヽ、l リ バッチのコマンドラインだからUIいらないわよ    |! !/i´ハ´-‐tr;j-     rノ ‐t!リ-,!`トヽ!ノ    ! lハ ゝ!         iヽ       リ/ たしか、作ってたわよね。 5秒でちょうだい。     | ヽ、.l         ! ノ      !ノ         !ハ       丶       / リ        ノ゙l ト、    ー ;;;ッ'   ィ!、ト、           ,ゝ|.ヽ、       /| ,ゝ         f く!  ` ー   ´   !く         ヽ ` ヽ、        ! ヽ、      __,. -'´i    ヽ、    l _ノ 〉  `´  ̄      `ヽ、    ` ー-'´  /`ヽ、        ____      /ノ   ヽ、_\     /( ○)}liil{(○)\       /    (__人__)   \  コピペで同じようなのつくるお。   |   ヽ |!!il|!|!l| /   |      \     |ェェェェ|     /   /              \

何かが間違ってるはず・・・ わたしの場所とるなYO ファイルを転送する 書き込み時間を計測する 処理を中断する プログレスバーで経過表示する アニメーションを表示する・・・とか わたしの場所とるなYO

  ∧,,∧    ∧,,∧   ∧,,▲   (,,・∀・)   ミ,,・∀・ミ   (;;・∀・)   ・・・・・・・ ~(_u,uノ @ミ_u,,uミ @(;;;;uuノ

『モノ』と『動き』の関係を考えよう 測定結果表示 USBメモリ 検査システム 検査結果表示 オペレータ 読込ファイル 書込ファイル プログレスバー       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  | ふむ。  /      ∩ノ ⊃  /    (  \ / _ノ |  |    .\ “  /__|  |      \ /___ /   中止ボタン 一度にファイルを読み書きしてしまうと、途中での中断ができないので、分割して読み書きを繰り返す方法を選択します。

ファイル処理部分がループなので、イベントトレースで表現できない イベントトレースで考えてみる オペレータ USBメモリ 検査システム 読込ファイル 書込ファイル 挿入されたよ 検査開始 オープン オープン ファイル処理部分がループなので、イベントトレースで表現できない 読み込み 書き込み 転送 プログレス表示したい 中止したい。 クローズ クローズ       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  |   /      ∩ノ ⊃  /    (  \ / _ノ |  |  フローチャート? .\ “  /__|  |      \ /___ /   検査完了 抜かれたよ

ループをぶったぎる! ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ ぶったぎるお           ____         /_ノ  ヽ、_\  ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ     ぶったぎるお /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒) | / / /      |r┬-|    | (⌒)/ / / //   ループなんかぶったぎるお | :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/ |     ノ     | |  |   \  /  )  /     マルチなしごとだお ヽ    /      `ー'´      ヽ /    /       |    |   l||l 从人 l||l      l||l 从人 l||l   バ     ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、 ン   ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) バ                                    ン ループをぶったぎる!

ファイルクラスとオブジェクトの状態 ファイル オープンの依頼 読み込みの依頼 オープン中 書き込みの依頼 アイドル オープンの依頼 「読み込み」の経過 オープン中 読み込みの依頼 「書き込み」の経過 (プログレス経過) 書き込みの依頼 一般に同期的に処理される部分には、「○○中」の状態は作らなくてもよい。 クローズの依頼 アイドル 「中止」できる状態 本来ファイル入出力は非同期の方が望ましいけど、簡略化します

イベントトレースを書いたら? ____ /⌒ ⌒\ /( >) (<)\ /::::::⌒(__人__)⌒::::: \ 出番が少ないお | /| | | | | | \ (、`ー―'´, /

状態遷移表書きましょ。 状態 イベント アイドル (0) オープン中 (1) オープン依頼 ファイルを開く成功→(1) 失敗→(0) ログ記録 →(1) クローズ依頼 →(0) ファイルを閉じる 読み込み依頼 ログを記録 読み込み処理 書き込み依頼 書き込み処理 中止依頼

ファイルのクラス。 #include <windows.h> namespace NUsbChecker { class File { HANDLE Handle; public: File(); ~File(); bool Open( const char *filename_,…); bool Close(); bool Read( char *buffer, DWORD readbytes, DWORD *result ); bool Write( char *buffer, DWORD readbytes, DWORD *result );     bool Cancel(); }; } // endof namespace NUsbChecker こんなかんじ。 (検証してませんw)

イベントトレースで考えてみる 検査終了の判断? オペレータ USBメモリ 検査システム 読込ファイル 書込ファイル _ _ / \ メモリを差し込む オープン処理 挿入されたよ 検査開始 読み込み依頼 読み込み完了 中止したいよ。 書き込み依頼 検査終了の判断? 書き込み完了 クローズ       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  |   /      ∩ノ ⊃  /    (  \ / _ノ |  |  フローチャートが .\ “  /__|  |   消えたな。    \ /___ /   抜いてもOK メモリを抜き取る 抜かれたよ

検査システムの部分。 検査中状態に注目! 検査フォーム 検査ロジック ファイル×2 ファイル×2 メモリ挿入検出 ファイルオープン 中止 ファイル読み込み ファイル書き込み プログレス通知 検査完了判定 ファイルクローズ メモリ抜出検出

イベントトレースを書いたら? ____ /⌒ ⌒\ /( >) (<)\ /::::::⌒(__人__)⌒::::: \ 状態遷移表でしょ? | /| | | | | | また書くの? \ (、`ー―'´, /

めんどくさいので、飛ばしましょう。 ____ /⌒三 ⌒\ /( ○)三(○)\ ; え? /::::::⌒(__人__)⌒:::::\        ____          /⌒三 ⌒\      /( ○)三(○)\ ;   え?   /::::::⌒(__人__)⌒:::::\   |     |r┬-|    ; |   \      `ー‘´    / 

検査ロジックのクラスを考える。 class UsbCheckerLogic { ; public: UsbCheckerLogic(); bool OnConnectUSB(); bool OnDisconnectUSB(); bool OnReadFile(); bool OnWriteFile();   bool OnCancel(); }; こんなかんじ?

もうちょっと考察 bool USBCheckerLogic::OnConnectUSB() { // ここで、検査を開始する・・・ } bool USBCheckerLogic::OnReadFile() // ここで、読み込み処理を実施する? bool USBCheckerLogic::OnWriteFile() // ここで、書込処理を実施し、プログレス経過を通知する? どのように受け取って来る? 誰に対して?フォームはどこ?

検査中状態に注目。 分断したループはどこへ・・・??? ファイルを読み込んだ・・・ ファイルを書き込んだ・・・ 中断しているか? プログレス経過表示 まだ続きを読み込む必要があるのか?       _ _    /      \   /  ─    ─ \    /    (●)  (●) \   |       (__人__)  |   /      ∩ノ ⊃  /    (  \ / _ノ |  |   .\ “  /__|  |      \ /___ /  

状態遷移の実装方法 ステートパターンをつかう。 ____ /_ノ ヽ、_\           ____         /_ノ  ヽ、_\  ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ     やっときたお /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒) | / / /      |r┬-|    | (⌒)/ / / //   やっときたお | :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/ |     ノ     | |  |   \  /  )  /     ステートパターンだお ヽ    /      `ー'´      ヽ /    /       |    |   l||l 从人 l||l      l||l 从人 l||l   バ     ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、 ン   ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) バ                                    ン

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

状態遷移表を確認しておきましょう 状態 イベント メモリ挿入待ち (0) 検査中 (1) 取り外し待ち (2) メモリ挿入検出 ファイルオープン 状態を検査中に     →(1)読込通知 エラー表示 検査中断 →(2) ログ記録 →(1) ファイル読込 →(0) 書込通知→(1) ファイル書込 経過通知 完了なら完了通知 未完なら読込通知 検査完了 検査結果を表示 ファイルクローズ メモリ取り外し検出 検査中断→(0) 次の検査準備 中断 ファイルクローズ→(2)

コードの例 ____ / \ / _ノ ヽ、_ \ / o゚⌒ ⌒゚o \ うれしいお。いただきますお。 | (__人__) |        ____      /      \    /  _ノ  ヽ、_  \   /  o゚⌒   ⌒゚o  \  うれしいお。いただきますお。   |     (__人__)    |   \     ` ⌒´     /

状態遷移用の基底クラス class USBCheckerStateMachine; class USBCheckerState { const class USBCheckerStateMachine *StateMachine; public: USBCheckerState(USBCheckerStateMachine *state_machine_ ) : StateMachine( state_machine_ ) { } virtual ~USBCheckerState (){} virtual void OnConnectUSB(); //メモリ挿入検出時の処理 virtual void OnDisconnectUSB(); //メモリ抜出検出時の処理 virtual void OnReadFile(); //ファイル読み込み完了時の処理 virtual void OnWriteFile(); //ファイル書込完了時の処理 virtual void OnCheckCOmplete(); //検査官了検出時の処理 virtual void OnCancel(); //中断されたときの処理 };

メモリ挿入待ち状態 #include “USBCheckerState.h” class USBWaitingState : public USBCheckerState { // コンストラクタ、デストラクタ、および仮想関数の一覧 }; void USBWaitingState::OnConnectUSB() if( OpenFiles() == true ) // ファイルをオープンする // ステートマシンに検査中状態に変化するように指示 StateMachine->ChangeState( STATUS_CHECKING ); // 変化した状態に対して、ファイルの読み込みを通知 } else //略

検査中状態 #include “USBCheckerState.h” class USBCheckingState : public USBCheckerState { // コンストラクタ、デストラクタ、および仮想関数の一覧 }; void USBCheckingState ::OnReadFile() if( ReadFile() == true ) // ファイルを読み込む // ステートマシンにファイルの書込要求を通知 } else //エラー処理

void USBCheckingState ::OnWriteFile() { if( WriteFile() == true ) // ファイルを書き込む if( IsEndOfFile() == false ) // ステートマシンに次のブロックを読み込むよう要求通知 } else // ステートマシンに完了を通知 //エラー処理

以下、略。 ____ /⌒三 ⌒\ /( ○)三(○)\ ; え? /::::::⌒(__人__)⌒:::::\ | |r┬-| ; |        ____          /⌒三 ⌒\      /( ○)三(○)\ ;   え?   /::::::⌒(__人__)⌒:::::\   |     |r┬-|    ; |   \      `ー‘´    / 

現在の状態のインスタンスにイベントを通知 ステートマシン側のコード概略 class USBWaitingState; class USBCheckingState; class USBReleaseWaitingState; class USBCheckerStateMachine { static USBWaitingState *WaitingState; static USBCheckingState *CheckingState; static USBReleaseWaitingState *ReleaseWaitingState; USBCheckerState *Status; void OnConnectUSB() Status->OnConnectUSB(); 以下略 状態別のインスタンスをひとつずつ持つ 現在の状態のインスタンス (上記のいずれかになる) 現在の状態のインスタンスにイベントを通知

検査ロジックは、だいたいこうなる。 class UsbCheckerLogic { USBCheckerStateMachine *StateMachine; File *Source, *Dest; 以下略(略すぎだっつうの(笑) こんなかんじ

と、いうことで。 検査システムのクラスは、 USBCheckerStateMachine のインスタンスを持つことで、状態遷移を管理できるようになります。          ____           / ―  ―\ .     / (―)  (―)\    ・・・ふぅ・・・           /   ⌒(__人__)⌒ \     |      ` ―     |   わかったようでわからないお。      \           /     ノ            \   なんかごまかされてる気がするお。   /´               ヽ                |    l              \  ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.       ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

ところで。 時間軸に対するイベントによって状態を変化させるオブジェクトには、通知の受け口が必要になります。 次のファイル読み込みとか、書き込み、検査の完了あるいはキャンセルの要求って、どのようにして通知したり受け取ったりすればいいのでしょうか? 時間軸に対するイベントによって状態を変化させるオブジェクトには、通知の受け口が必要になります。

イベントで状態遷移するクラスには 他のオブジェクトに通知するなら オブザーバを置く オブザーバコレクションを置く ____ /ノ ヽ、_\        ____      /ノ   ヽ、_\     /( ○)}liil{(○)\       /    (__人__)   \  え!?。   |   ヽ |!!il|!|!l| /   |   まだなにかあるの?   \     |ェェェェ|     /   /              \ オブザーバ・パターン

オブザーバ・パターン ____ /⌒ ⌒\ /( >) (<)\ /::::::⌒(__人__)⌒::::: \ いやな予感がしてきたお。 | /| | | | | | \ (、`ー―'´, /

____ / \ / ─ ─\ / ,(●) (●)、\ | (__人__) | 残念ながら、時間が来たようです。 \ ` ⌒´ / ,, ____ / \ / ─ ─\ / ,(●) (●)、\ | (__人__) | 残念ながら、時間が来たようです。 \ ` ⌒´ / ,,.....イ.ヽヽ、___ ーーノ゙-、. 次回、再利用可能なクラスの作成と状態遷移の : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | 実装の全貌をご覧に入れましょう。 > ヽ. ハ | ||       ____      /⌒  ⌒\    /( >)  (<)\   /::::::⌒(__人__)⌒:::::\  ひええぇぇぇ   |     /| | | | |     |   \  (、`ー―'´,    /

ご静聴ありがとうございました。 m(_._)m                                  ,.へ   ___                             ム  i  「 ヒ_i〉                            ゝ 〈  ト ノ                           iニ(()  i  {              ____           |  ヽ  i  i           /__,  , ‐-\           i   }  |   i         /(●)   ( ● )\       {、  λ  ト-┤.      /    (__人__)    \    ,ノ  ̄ ,!  i   ゝ、_     |     ´ ̄`       | ,. '´ハ   ,! . ヽ、    `` 、,__\              /" \  ヽ/    \ノ ノ   ハ ̄r/:::r―--―/::7   ノ    /        ヽ.      ヽ::〈; . '::. :' |::/   /   ,. "         `ー 、    \ヽ::. ;:::|/     r'"      / ̄二二二二二二二二二二二二二二二二ヽ      | |       お し ま い         │|      \_二二二二二二二二二二二二二二二二ノ        ____      /      \    /  _ノ  ヽ、_  \   /  o゚⌒   ⌒゚o  \  また今度だお    |     (__人__)    |   \     ` ⌒´     / 単体のコピーはどうなったのかについて(w Special thanks for Yaruo charactors