More Related Content
Similar to Riaアーキテクチャー研究会 第3回 セッション3 (20)
Riaアーキテクチャー研究会 第3回 セッション3
- 5. 1
2nd FACTORY CO.,Ltd. CONFIDENTIAL 4
- 12. 例えば
2nd FACTORY CO.,Ltd. CONFIDENTIAL 11
- 13. 例えば
2nd FACTORY CO.,Ltd. CONFIDENTIAL 12
- 14. 例えば
2nd FACTORY CO.,Ltd. CONFIDENTIAL 13
- 17. クラウド市場動向
2nd FACTORY CO.,Ltd. CONFIDENTIAL 16
- 26. 余計な思考
赤は1、青は2、黄色は3を押してください。
1 2 3
赤
「何色の●が一番多い?」
UI 操作の為の思考ストレスを排除、
本来の目的に意識を集中。
2nd FACTORY CO.,Ltd. CONFIDENTIAL 25
- 28. ゲームが参考になる日も近い
• • •
• • •
• • •
• • •
• •
• •
• • •
• • •
• • •
• •
• •
• •
•
2nd FACTORY CO.,Ltd. CONFIDENTIAL 27
- 29.
2nd FACTORY CO.,Ltd. CONFIDENTIAL 28
- 31. 2
2nd FACTORY CO.,Ltd. CONFIDENTIAL 30
- 33. 東海
高尾 東海
XA XD
東海
AA ID IA
AD VD
高尾
2nd FACTORY CO.,Ltd. CONFIDENTIAL 32
- 34. XD IA
XA VD
ID AD
AA
2nd FACTORY CO.,Ltd. CONFIDENTIAL 33
- 35. XA XD
AA ID IA
AD VD
2nd FACTORY CO.,Ltd. CONFIDENTIAL 34
- 36. •
•
–
2nd FACTORY CO.,Ltd. CONFIDENTIAL 35
- 38.
2nd FACTORY CO.,Ltd. CONFIDENTIAL 37
- 47.
2nd FACTORY CO.,Ltd. CONFIDENTIAL 46
- 53. 3 クラウドサービスApp特有のUX的解
2nd FACTORY CO.,Ltd. CONFIDENTIAL 52
- 55.
–
–
–
–
2nd FACTORY CO.,Ltd. CONFIDENTIAL 54
- 56.
–
•
•
–
–
–
2nd FACTORY CO.,Ltd. CONFIDENTIAL 55
- 57.
–
… JSON、ATOM等
… モデルが同じ
… … … ・Data Access LayerとViewModelを分離しや …
クラウド すい(ファサードを設置しやすい) …
Azure/オンプレミス ・同期が簡単 … … …
…
…
…
… …
Accessor
…
…
…
インメモリ上のモデルと
今後、サーバー側にナ …
が 全く同じモデルを永続化
レッジとなるインフォ …
メーションプールを構築 メ
JSON、ATOM等 … … … モ
していくことになる。 リ
このデータの組合せ(業 ViewModel と …
務モデル)こそがイン ス …
フォメーションであり、 ト
クライアント側に業務モ ア … … …
を
デルを組立するステップ 読
Android、iPhone等 を持たないことが み
kabu.comの売りとなる。 分 分離ストレージ、Shared Object、
け HTML 5 local storage等
る
2nd FACTORY CO.,Ltd. CONFIDENTIAL 56
- 58. KabucomData
KabucomData.StockTile.Base.FinancialPrice
プログラマーの方々が、KabucomData
からのドットシンタックスで、すべての
エレメントにアクセスできることを意識
した設計をしました。
KabucomData.Users[0].ApplicationSetting.SkinType
2nd FACTORY CO.,Ltd. CONFIDENTIAL 57
- 59. 凡例 音声 文字 画像
銘柄 News … News読上げ 銘柄、為替 市場チャート
為替読上げ ニュース 為替チャート
分離ストレージ
… … 銘柄チャート
オンプレミス
分離ストレージ サービスAPI
…
Azure
… …
… … … … …
Invoke
Webサービス StorageManager …
ComunicationUtil
Callback
(ストレージアクセス)Sync Map
(API呼び出し)
…
… …
ComunicationUtil CompleteEvent StorageManager
…
…
… …
Accessor … … …
Extend
自動更新 …
Extend
…
タイマー …
…
… … ViewModel …
…
… …
App.xaml …
Locator Locator
…
DataContext DataContext
ReLoad 画面 画面
画面の表示順などデータサービスされないステート情報はViewModelで拡張される
2nd FACTORY CO.,Ltd. CONFIDENTIAL 58
- 60. public delegate void CommunicationUtilCompleteEventHandler(object sender, CommunicationUtilCompleteEventArgs e);
public event CommunicationUtilCompleteEventHandler CallVoiceAPICompleted;
Dispatcher dispatcher = App.Current.RootVisual.Dispatcher;
public class CommunicationUtilCompleteEventArgs : EventArgs
{
public object Result { get; set; }
public Type ResponceType { get; set; }
} KabucomData.NetworkState.FaultModel.KannaError
if (this.CallVoiceAPICompleted != null)
{
dispatcher.BeginInvoke(delegate() { this.RequestMakeUserCompleted(this, sendArgs); });
}
分離ストレージ サービスAPI
StorageManager Callback ComunicationUtil
Invoke
(ストレージアクセス) … (API呼び出し) …
… …
… … … Accessor … … …
プログラマーの方々が、完了イベント引数の
ViewModel 状態による分岐制御を意識しないよう値と値
のタイプをモデルで返すよう設計しました。
画面 画面
CallVoiceAPICompleted += new CommunicationUtil.CommunicationUtilCompleteEventHandler(callVoiceAPICompleted);
static void callVoiceAPICompleted (object sender, CommunicationUtilCompleteEventArgs e)
{
if (e.ResponceType == typeof(KannaError));//エラー処理
}
2nd FACTORY CO.,Ltd. CONFIDENTIAL 59
- 61. •
–
クラウド
Azure/オンプレミス
ID/Pass
認証済みトークン/エラー
認証済みトークン
認証済みトークン
認証済みトークン 分離ストレージ
認証が必要なデータ
2nd FACTORY CO.,Ltd. CONFIDENTIAL 60
- 62. •
–
データアクセスレ
ファサード(今回
App.xaml XAML コードビハインド ViewModel イヤー(通信と サービス
はAccessor)
ローカル)
データテンプレート、 ローカルデータアク
タイマー制御 ページ初期化 コマンド実装 オンライン判定 認証サービス
データコンテキスト セス
トランシジョン、アニ
イベント、イベントハ インジケーターの制 サーバーAPI呼び出
メーションコンポー データアクセス データサービス
ンドラ 御 し
ネント設置
各種設定(ロケー
ター、リソース、コマ
システムトレイ コールバック チャート画像
ンド、コンバーター、
ビヘイビア)
アプリケーション
完了イベント 音声サービス
バー
デストラクタ
ナビゲーション制御
2nd FACTORY CO.,Ltd. CONFIDENTIAL 61
- 63. • HttpWebRequest.Headers[“Authorization”]
• HttpWebRequest.Headers[“X-SessionID”]
• HttpWebRequest.Method
• ex “GET“,“PUT“,“POST“,”DELETE“
• HttpWebRequest.ContentType
• ex "application/x-www-form-urlencoded"
• HttpWebRequest.Accept
• ex "application/json“,”application/atom+xml”
public HttpWebRequest GetCurrentUserRequest(string serviceName, WebRequestType webRequestType, out string postBody)
{
string serverAddress = “http://サーバーアドレス/”;
HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(serverAddress + serviceName));
webReq.Accept = "application/json";
switch (webRequestType)
{
case WebRequestType.ChartImage://WebRequestTypeは自作した列挙値
webReq.Method = "GET";
webReq.Headers[“Authorization”] = “Basic ” + KabuComDataAccessor.KabuComData.Users[0].Base64String;//キー
webReq.Headers[“X-SessionID”] = KabuComDataAccessor.NetworkState.SessionID;//トークン
break; //postBodyを必要とするリクエストの場合はこちらで作成してやる。そうでない場合は「postBody = "";」
}
return webReq;
}
2nd FACTORY CO.,Ltd. CONFIDENTIAL 62
- 64. JSONクライアントの作成
System.Json DataContractJsonSerializer
(Silverlight SDK) (System.Runtime.Serialization.Json)
参照設定System.Json 参照設定System.ServiceModel.Web
• ストリームからオブジェクトへ • シリアライザーを生成
• JsonObject jsonObject = • DataContractJsonSerializer jsonSerializer = new
(JsonObject)JsonObject.Load(responseStream); DataContractJsonSerializer(StockData);
• 配列の場合キーをパース • ストリームからオブジェクトへ
• foreach (string key in jsonObject.Keys) {if (key == • StockData data =
“Name”) stockData.Name = jsonObject[key];} jsonSerializer.ReadObject(responseStream);
サーバーのモデルとクライアントのモデルが合致していない場合はSystem.Jsonを使って
クライアントのモデルにキーをマップ。
合致している場合は、DataContractJsonSerializerを使ってデシリアライズすることで1行で
マップが終了する。
2nd FACTORY CO.,Ltd. CONFIDENTIAL 63
- 65. 設計の段階からWindows 8への展開を想定していた本案件の場合、Metro UIの採用に
よってタッチインタラクションの実装が楽になりました。
プログラムより先にユーザーの操作についてデザインされていたことがポイントです。
操作からのアプローチ プログラムからのアプローチ
• ユーザーは片手で操作し、親指での • Manipulationクラスを使えるからタッ
操作が中心 プ、フリック、ピンチというユーザーの
• →タップやフリックで操作する画面 ジェスチャーに対する正確なイベント
が必要 を拾える
• →タッチ操作を想定したUIを採 • →タップやフリックで操作する画面
用する(Manipulationクラスが用 を作る
意されていることは画面の設計 • →Whyが置き去りになる(なぜそ
には関係ない) の画面や機能が必要なのか?)
2nd FACTORY CO.,Ltd. CONFIDENTIAL 64