WPF/Silverlight/WindowsPhoneから WinRTまで見据えた リッチクライアントModel設計

Slides:



Advertisements
Similar presentations
プラグイン作成講座 Control System Studio 3.0 Takashi Nakamoto
Advertisements

位置情報と私 木村岳文 / 位置情報と私 / はじめに GPS 付き携帯、ハンディ GPS などを使っ て、お手軽に自分が地球上のどこにいる かを調べられるようになってきました。 このデータをつかって何かおもしろいこ とができそうな予感。 具体的にどうしたらおもしろいかはよく.
API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
Genius Framework について 吉津 卓保( S2 ファクトリー株式会社). 自己紹介.
ソフトウェア工学 理工学部 情報システム工学科 新田直也. 演習問題 1 の解答例  入庫処理の DFD 酒屋の在庫問題の DFD( 入庫処理 ) 更新情報 在庫ファイル 更新処理 倉庫係 在庫不足リスト 在庫ファイル 出庫指示書 新規出庫 判定 出庫指示書 作成処理 出庫依頼 積荷票.
2012/8/4 わんくま同盟 大阪勉強会 #50 尾上雅則. 本セッションの目的と動機付け  尾上 雅則 (おのうえ まさのり)  昭和58年生 フリーランス  C#/MVVM WindowsForms/ASPNET/XAML系全般など  Blog – the sea of fertility.
本プレゼンテーション ( 以下、本書 ) で提供されている情報は、本書が 発表された時点における Microsoft の見解を述べたものです。市場 ニーズの変化に対応する必要があるため、本書は記載された内容の実 現に関する Microsoft の確約とはみなされないものとします。また本 書に記載された情報の正確さについて、保証するものではありません。
1 なんとなく Ajax ~新しくて古い XMLHttp 川合孝典 (Kansai.pm) 2005/5/22.
1 会社名: 氏名: 日付: 会社名: 氏名: 日付:. 2 内容 企業のセキュリティ対策状況 ユーザー管理の重要性 ユーザー管理製品 市場状況 Active Directory とは Active Directory 利用に最低限必要な準備 ユーザー管理のご提案内容 最初の取り組み:ユーザー情報の統合管理.
Curlの特徴.
Visual Studio 2010 の新機能 Coded UI Test
Windows HPC Server を使ってみる
知能機械工学科 担当:長谷川晶一 TA:新・後藤・ナンバ
MVVMパターンで学ぶ GUIアーキテクチャ・パターン
2004年度 サマースクール in 稚内 JSFによるWebアプリケーション開発
エンタープライズアプリケーション II 第10回 / 2006年7月23日
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
Lightweight Language Weekend ls-lRシェル
インターネットにおける オーケストラ演奏同期機構の 設計と実装
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
ユースケース図 FM12012 比嘉久登.
ASP.NET開発標準化を考えてみよう! わんくま同盟 東京勉強会# /03/15 mxb & 片桐継.
ASP.NET開発標準化を考えてみよう! わんくま同盟 東京勉強会# /03/15 mxb & 片桐継.
JavaServlet&JSP入門 01K0018 中村太一.
ソースコード品質概論 なぜソースの品質を追求するのか
稚内北星学園大学 情報メディア学部 助教授 安藤 友晴
RAD Studio 14/09/27 TEffectを使った綺麗なForm
CHAPTER1 UMLとオブジェクト指向の基本概念(2)
WPF/Silverlightの特徴と一般的な設計原則から導出する MVVM(Model/View/ViewModel)パターン
さとりすと Satori Ghost Editor 里々ゴーストの統合開発環境を作ったよ page: 1/25
プロトタイプ PoC プロジェクト概要 6 weeks ソリューションの検討 ビジネスの理解 プロトタイプの範囲 本稼動 システム検討
ユースケース図2-4~ FM11012 中島拓也.
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
サイボウズスタートアップス株式会社
サーバー立ち上げ記 2009/5/23
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
モバイルP2Pを用いた携帯電話 動画配信手法の提案 第3回
(ご参考)各種SNSをSHIFTに連携させる方法 「facebook」「YouTube」「Instagram」「Twitter」
2004年度 サマースクール in 稚内 JavaによるWebアプリケーション入門
2003年度 データベース論 安藤 友晴.
チーム FSEL 立命館大学情報理工学部 ソフトウェア基礎技術研究室
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
その他の図 Chapter 7.
図書館職員のための アプリケーション開発講習会
暗黙的に型付けされる構造体の Java言語への導入
Active Directory & SAP ユーザー管理統合ソリューション
WPF、MVVMパターン構成.
表紙.
.NET Framework 3.0 概要 (旧称 : WinFX)
TIME SIGNAL: 集合知を利用した赤信号点灯時間の取得手法
ゲーム開発モデルの基礎.
ミドルウェア”TSUNAGI”を 用いたWEBアプリケーションの構築
Skypeさんに遊びに来たので 暴れてみる
7-0.SWORD Client for WEKO インストールマニュアル Version 2.2
中国の日系企業に最適のシステム 御社の業務に最適な3つの理由 初期投資なしで すぐに始められる ITに詳しい 担当者不要 何度でも 変更可能.
岩澤全規 理化学研究所 計算科学研究機構 粒子系シミュレータ研究チーム 2015年7月22日 AICS/FOCUS共催 FDPS講習会
資料2-2 平成26年度 第2回技術委員会資料 次年度検討テーマ案
手書き文字の自動認識アプリケーション 15K1013 坂本 倖輝
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
卒業研究 JCSPを用いたプログラム開発  池部理奈.
Androidアプリの作成 07A1069 松永大樹.
稚内北星学園大学 情報メディア学部 専任講師 安藤 友晴
ゲームのタスクシステム 導入編 レベル2くまー By keychan.
異種セグメント端末による 分散型仮想LAN構築機構の設計と実装
How To WPF アプリケーション Part4 By 中博俊.
ソフトウェア工学 知能情報学部 新田直也.
より分かりやすい ユースケースモデルを作る
Microsoft Office Project Server 2007
How To WPF アプリケーション Part3 By 中博俊.
Presentation transcript:

WPF/Silverlight/WindowsPhoneから WinRTまで見据えた リッチクライアントModel設計 RIAアーキテクチャ研究会 第2回セミナー 尾上 雅則

アジェンダ 自己紹介・デモアプリ紹介 リッチクライアントのModel 古き良き設計 WinRTとAsync CTP/ReactiveExtensions リポジトリ非同期ステートフルModel まとめ

1.自己紹介・デモアプリ紹介 3プラットフォームで 実装された Twitterクライアント

1-1.自己紹介 尾上 雅則(おのうえ まさのり) 28歳 C#er / MVVMer Blog Twitter WPF/Silverlight/WindowsPhone/WindowsForms/AS P.NET/SQL Server/ReactiveExtensions勉強中 Blog The sea of fertility – http://ugaya40.net Twitter @ugaya40

1-2.デモアプリ 3Platform(WPF/Silverlight/WindowsPhone) Twitterクライアント WPF4 7.1

1-2.デモアプリ 設計(全プラットフォーム共通) なぜTwitterクライアントなのか Full MVVM リポジトリ非同期ステートフルModel なぜTwitterクライアントなのか DBアクセスは定型的に過ぎ、またオブジェクトの変化が少な くそもそも適切な粒度でリッチクライアントらしくまとめる には無理があると判断。 サンプルで使用するDBアクセスの方法を標準と思われがちな のが心外。DBアクセスは機能・非機能要件によって使い分け ましょう!

1-2.デモアプリ 使用ライブラリ MVVM Light Toolkit ReactiveOauth Reactive Extensions 軽量であるが故に、もっとも万能である。 http://mvvmlight.codeplex.com/ ReactiveOauth OAuthでの通信をReactive Extensionsを利用して使用して行える。 作者 : @neueccさん http://reactiveoauth.codeplex.com/ Reactive Extensions コールバック・イベントハンドラのネストの撲滅 イベント合成 詳細は http://neue.cc の各記事参照

2.リッチクライアントのModel 「リッチクライアント」のって 言わなきゃいけないのは何故?

2.リッチクライアントのModel MVVMパターンでのModelの位置づけは? 外観 呼出 画面 画面を レンダリングする ための情報 ビジネス ドメイン (アプリの機能) Data Binding イベント

2.リッチクライアントのModel MVVMパターンでのModelの位置づけは? 呼出 画面 View レンダリング情報 ViewModel ビジネス ドメイン Model Data Binding イベント

2.リッチクライアントのModel Modelとは? アプリの外観・見た目・小手先 の操作性に関わる部分以外 UI想定前のアプリのイメージ ちょっと高度なバッチ処理を書 くようにModelを書く アプリの外観・見た目・小手先 の操作性以外の事をViewModel に混ぜないように書く ビジネスドメイン Model

2.リッチクライアントのModel Modelとは? いわゆる業務的なインプットは 例えばユースケース定義の粒度。 ユースケース定義には アプリを使用するユーザー・外部シ ステムのアクション アプリが外部に及ぼす影響 などが定義されている。 入力仕掛りなどユースケース定義にはない。 ビジネスドメイン Model

2.リッチクライアントのModel Modelとは? 操作情報 データ送信 Model クラス群 システム 外部システム(DBなども) データ受信 ユーザー 操作指標となる情報 (進捗・オブジェクトの生滅など) アウトプット 視認できる情報 (表示・帳票)

2.リッチクライアントのModel Modelとは? クラス群 IN OUT システムが受ける入力・すべき出力、 それらをユースケース定義の様な粒度で過不足なく 満たす、 それがModelの仕様であると理解しています。

2.リッチクライアントのModel デモアプリに見るモデル(ユースケース1) ユーザーがアプリを起動する 認証されている場合 認証情報をストレージから復元する 認証されていない場合 認証する 次回のために認証情報を保存する 認証済になった場合 ユーザーの基本情報を表示する ユーザーのリストのタイムラインをTwitterから取得し、基本タ イムラインと合わせて表示する IN OUT

2.リッチクライアントのModel デモアプリに見るモデル(ユースケース2) ユーザーがポストする ユーザーが投稿をTwitterにポストする IN OUT

2.リッチクライアントのModel デモアプリに見るモデル(ユースケース3) ユーザーが更新したいタイムラインを更新操作する 指定されたタイムラインの新しいツイートをTwitterから取 得し、新しいツイートを追加表示する。 IN OUT

2.リッチクライアントのModel デモアプリに見るモデル 起動時 各種ストレージ IN ⑥認証情報 を保存 OUT ①認証情報の復元 を求める ②あれば返す ③なかったら通知 アプリケーション コンテキスト TwitterSampleApplication ④認証 認証サービス AuthorizeUrlBuilder,Authorizer ⑤認証情報 をセット

2.リッチクライアントのModel デモアプリに見るモデル アプリケーションコンテキスト TwitterSampleApplication IN OUT 認証済アカウントコンテキスト AccountContext タイムライン TimeLine 自ユーザー情報 Tweet Tweet Tweet Tweet

2.リッチクライアントのModel Model設計の注意点 多くの場合当然ただのデータの入れ物じゃだめ。プ ロパティ(状態)を持ち、メソッド(操作)を持ちます。 ここまでの内容を踏まえれば自明のことです。 ドメインモデル貧血症じゃだめな事が多い Modelをただのデータの入れ物にすると、ViewModelが データを詰めるんですか?。ViewModel/Viewの役割は? また、サーバと通信するアプリであっても、クライ アント側にも当然Modelはあります。これもここま での内容を踏まえれば自明のことです。 IN OUT

2.リッチクライアントのModel Model基本まとめ ビジネスドメイン ステートフル(状態を持つ) ドメインモデル貧血症ではない(状態だけではない) Modelの粒度はユースケース定義を想像して! 悩んだときは、「ではこの処理をModelでしなかっ た場合ViewModelがするのが適切なのか?」 なんでも設計の基本は、対象のINとOUTを明確に。 IN OUT

3.古き良き実装 WPF/MVVMなオールドスタイル

2.古き良きWPF/MVVMの実装 UIをブロックしないための非同期 Modelで時間をかかる処理を行った場合(ネットワー クアクセスなど)に、GUIをブロックして操作不能に してしまうようでは話にならない フリーズって言われちゃいますよね? IN OUT

2.古き良きWPF/MVVMの実装 UIをブロックしないための非同期 ソリューションは非同期呼び出ししかありません。 本質的な問題は、それがView/ViewModelの責務(外 観や小手先の操作性)に属するのか、Modelの責務(ビ ジネスドメイン)に属するのかです。 IN OUT

2.古き良きWPF/MVVMの実装 UIをブロックしないための非同期 多くの人が直観と実装しやすさから、 Modelはすべて同期的に実装する ViewModelが非同期でModelを呼び出す 事を選択しました。 IN OUT しかし・・・

2.古き良きWPF/MVVMの実装 問題点 ・非同期前提のプラットフォーム Silverlight(WindowsPhone)を含むプラットフォーム は、Webアクセスなどが非同期APIでしか提供されて いません。 もしこのWPF/MVVMのベーシックスタイルで実装す ると。。。 あれ?非同期は小手先の操作性と判断して ViewModelに寄せたんじゃなかったの? ViewModelとModel両方非同期って問題を複雑化さ せているだけじゃ・・・。 IN OUT

2.古き良きWPF/MVVMの実装 問題点 ・イベントの連鎖 ステートフルModelは、ViewModelへの通知にイベン トを使用します。イベントハンドラのネストが発生し やすいんですね。。。 IN OUT このプロパティの変更通知来たら・・・ フィルタリングして・・・ その時にこっちのプロパティの変更通知きたら・・・

2.古き良きWPF/MVVMの実装 問題点 ・イベントの連鎖 どう解決するのか? いくつかアプローチはあります。 しかしはずれのアプローチは当然引きたくないわけ で・・・ ちょっと先を見てみることにします。 IN OUT

4.WinRTと Async CTP/Reactive Extensions 未来と未来へのソリューション

4.WinRT/Async CTP/ReactiveExtensions WinRTとは? Windows 8から搭載される新たなネイティブの基盤 (Win32後継?) .NETから見ると普通に.NETに見えるらしい。 C++erはネイティブアプリをXAMLで書くようにな るらしい。 OSレベルで処理が50ミリ秒以上かかる可能性のある ものはすべて非同期APIしか提供されなくなる。 .NETだけやるにはあまり関係ない?いいえ。 Silverlight/WindowsPhoneも考慮すればMSの姿勢 は明らか。 IN OUT

4.WinRT/Async CTP/ReactiveExtensions WinRTとは? WindowsPhoneを含むSilverlight環境に加えて、ついに Windows本体にも非同期が! 非同期を克服しなきゃいけない! そもそも非同期の何が嫌か 単純に書くのが面倒くさい ブロックのネストが増える。 異常系まで絡むとわけわかめ。 しかもリトライとかしなきゃいけないネットワークアクセス が非同期とか・・・ とにかくネストが醜い。 では、非同期処理へのソリューションは?? IN OUT

4.WinRT/Async CTP/ReactiveExtensions Async CTPとは? OUT こんなに簡単に! 詳しくはhttp://ufcpp.netで!

4.WinRT/Async CTP/ReactiveExtensions Reactive Extensionsとは? LINQ to Events by @neuecc イベント・非同期などのネストをフラットに、イベ ントや非同期を時間を超えて合成・フィルタリング など。 LINQ to Objectがループブロックのネストを殺害し たように、本当に非同期やイベントのネストが消え てなくなります! 多少はデモアプリの実装として紹介しますが、詳し くはhttp://neue.ccにて。 IN OUT

5.リポジトリ非同期ステートフルModel 提案

5.リポジトリ非同期ステートフルModel リポジトリって? リポジトリとは? 外部システムとの通信 ファイルアクセス DBアクセス など、システムにとって厄介な異常系を引き起こしか ねない呼び出しを、リポジトリの呼び出しと今回は定 義しています。 語源はリポジトリパターンからです。 IN OUT

5.リポジトリ非同期ステートフルModel リポジトリがソースコードに与える影響? リポジトリは、ソースコードにとって テストが容易でない 非同期のネストを生む(Silverlight/今後) リトライなど厄介な要件が多い などの問題を引き起こす要因です。 逆に言えば、これらリポジトリを除いたソースコード は比較的可読性に優れ、テストも比較的容易です。 IN OUT

5.リポジトリ非同期ステートフルModel リポジトリ非同期ステートフルModel リポジトリ非同期ステートフルModelとは、 リポジトリへのアクセスをすべてReactiveExtensions の返す継続(?)に置き換えたModelです。 このModelでは、リポジトリにアクセスするメソッド はすべてIObservable<T>を返します。 なんの事かわからないでしょうし、 実際どういったメリットがあるのかわかりにくいと思 いますので、デモアプリのソースコードから説明しま す。 IN OUT

5.リポジトリ非同期ステートフルModel リポジトリ非同期ステートフルModel リポジトリ非同期ステートフルModelとは、 リポジトリへのアクセスをすべてReactiveExtensions の返す継続(?)に置き換えたModelです。 このModelでは、リポジトリにアクセスするメソッド はすべてIOservable<T>を返します。 なんの事かわからないでしょうし、 実際どういったメリットがあるのかわかりにくいと思 いますので、デモアプリのソースコードから説明しま す。 IN OUT

5.リポジトリ非同期ステートフルModel Web APIへのリトライ処理 不調な事で有名なTwitter API。気分よく使うにはリト ライ処理が必須です。 IN OUT Twitterに特定のユーザーの情報を問い合わせています。 この例では異常時に2回まで1.5秒ごとにリトライをかけています。 (TwitterApiクラス)

5.リポジトリ非同期ステートフルModel 多段Webアクセス 大きすぎるので、ソースコードで確認してください。 最低でも3段の連鎖WebAPIアクセスがネストすることなく順番に実行されます。 (AccountContextクラス) IN

5.リポジトリ非同期ステートフルModel 多段Webアクセスーカーソル処理 IN OUT フォロワー数を5000件づつカーソルとともに返してくれるAPIを叩いています。 カーソルが0になるまでアクセスを繰り返して、結果を集計して一つにして返してくれます。 もちろん各アクセスごとにリトライ1.5秒ごと2回までしてます。

5.リポジトリ非同期ステートフルModel リポジトリをすべて非同期にしたので 非同期の責務はすべてModel側に集中することになり ました。 異常系がきちんと考慮されているにもかかわらず、異 常系コードがほとんど出てこないModelコードになり ました。 LINQ的な機能が使えるので、イベント・非同期の結果 のフィルタリングもでき、ifのネストすら減りました。 IN OUT

6.まとめ

6.まとめ Modelについての基本 継続や非同期やらの扱いに関係なく、Modelが満たす べき要件は同じです。 ViewModelとModelの責務の違いをしっかりと意識し て開発すれば、ModelはUIの影響を受けないため、非 常に教科書的な、クラス構造が仕様を表すようなOOP の実装に近くなってきます。 Modelをより強く意識していただけるようになる一助 となっていれば幸いです。 IN OUT

6.まとめ リポジトリ非同期ステートフルModel IN OUT

6.まとめ デモアプリについての言い訳 まずModelですが、僕がRxスキルが未熟なためまだ汚 いです。 そしてViewModelも、MVVM Lightの上に即興で構築 した適当なインフラを急遽あつらえたものなので汚い です。 しかしこの資料とソースは公開します。今後もリファ クタしていくたたき台にしようとも思っているので、 ぜひ積極的に参加していただいたり、ご意見をいただ けるとありがたいと思っております。 IN OUT

ご清聴 ありがとうございました