Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Xamarin.Forms とコンソールアプリでモデル層を共通化してみた
Search
Yu_ka1984
March 11, 2017
Technology
2.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Xamarin.Forms とコンソールアプリでモデル層を共通化してみた
Yu_ka1984
March 11, 2017
More Decks by Yu_ka1984
See All by Yu_ka1984
EventGridTopicで手軽にイベントドリブンを手に入れる
yukaabuno
5
1.8k
Durable Functionsを"公式ドキュメントとは違う形で"話して見る
yukaabuno
3
890
Durable Functionsの特徴をふわっと理解してみる
yukaabuno
2
180
Xamarin.Forms 使うべき?
yukaabuno
3
1.2k
Other Decks in Technology
See All in Technology
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
2
3.4k
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
3.1k
CIで使うClaude
iwatatomoya
0
250
AI時代のエンジニアキャリアについて今一度考える
sakamoto_582
2
1.5k
型は壁、Rustでもバグを直すな、表現できなくせよ
nwiizo
13
2k
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
2
200
ZOZOTOWNの進化と信頼性を両立する負荷試験
zozotech
PRO
2
160
タスクの複雑さでモデルを選ぶ ── Thompson Samplingで動かす“トークン/コスト最適化
satohy0323
0
330
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
0
160
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.4k
誤解だらけの開発生産性 / Myths and Misconceptions about Developer Productivity
i35_267
1
240
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
180
Featured
See All Featured
The Invisible Side of Design
smashingmag
301
52k
Marketing to machines
jonoalderson
1
5.6k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
370
Code Reviewing Like a Champion
maltzj
528
40k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
エンジニアに許された特別な時間の終わり
watany
107
250k
Music & Morning Musume
bryan
47
7.3k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Writing Fast Ruby
sferik
630
63k
Transcript
Xamarin.Forms とコンソールアプリでモデル層 を共通化してみた まどすた #2 2017/03/11 Yuka Abuno
@yu_ka1984 Yuka Abuno http://tamafuyou.hatenablog.com/ シグマコンサルティング株式会社 アーキテクト になることが目標
初めてXamarin.Formsを使ったスマホアプリプロジェクトは WPFアプリをスマホで使えるようにするプロジェクトでした。 ほとんどコード共通化できなかった(´・ω・`)
.NET Frameworkで書けるクライアントアプリ 2010年当時 現在 ▪ コンソールアプリ ▪ Windows Forms (まだまだ現役!(^^)!)
▪ WPF ▪ UWP ▪ Xamarin Mac ▪ Xamarin Android ▪ Xamarin iOS ▪ Unity ▪ erc ▪ コンソールアプリ ▪ Windows Forms(当時も現役!(^^)!) ▪ WPF ▪ Mono Gtk# ▪ SilverLight
Xamarin開発だけでも Xamarin.Formsを使ってクロスプラットフォーム開発 UIも共通コードで爆速\(^o^)/ Xamarin Nativeで各プラットフォーム毎に Nativeと同じ実装方法で 最適なUIを目指して開発 一つのプロダクトでXFとXNの2タイプの開発を行うこともあり得る。
これからの.NETアプリ開発は マルチプラットフォーム開発を通り越して マルチタイプ開発が前提になる かもしれない・・・
C#のGUIアプリは Model – View – Whatever M V C P
VM M V M V
VM fat VM M V Model層にある関数をコールして 戻り値を受け取ってVMに反映 VMでロジックが書かれている VM fat
マルチタイプ what ever M V クライアントGUIタイプ コマンド CLIタイプ タイプが違っても共通化で きるのるはモデル層
• バックエンド • ハードウェアデバイス • インフラ
モデル層は入出力をつなげたら動く タイプに依存しないアプリケーションそのもの
アプリケーションそのものなモデル層は コンソールアプリでも使えるはず
簡単なチャットアプリを作ってみました。 http://websocketscaletest1.azurewebsites.net/ ASP.NET Core の WebSocketとスケールアウトを検証する ために作ったブラウザサンプルアプリ。 バックエンド -> •
Azure WebApps • ASP.NET Core • ASP.NET WebSocet Server • Azure ServiceBus フロントエンド-> • Vue.js (JavaScript MVVM フレームワーク) フロントエンドを コンソールアプリ Xamarin.Forms(Android/iOS) で作成 Xamarin.Forms とコンソールアプリでモデル層を共通化して
Visual Studio 2017 RC ChatSample クラスライブラリ(.NET Standard) App1 Xamarin.Forms (
Shared ) ConsoleApp1 コンソールアプリ(.NET Core) https://github.com/yuka1984/ChatXFSample
ChatServiceクラス 入力 非同期メソッド • LoadRoomsAsync • JoinRoomAasync • ExitRoomAsync •
SendMessageAsync 出力 • INotifyPropertyChanged(BindableBase) • INotifyCollectionChanged (ReadOnlyObservableCollection) • ErrorEventHandler 入力 状態変更通知
インスタンス管理 アプリケーションを構成するためのモデル層のインスタンスを提供する事はモ デル層の責務 コンテナーを使ってアプリに必要なモデル層のインスタンスをモデル層で構築 して引き出せるようにする。 Repositoryクラスやプラットフォーム依存となるようなクラスはInterfaceを 作成して差し替えられるようにする
Xamarin.Formsの場合 ▪ MVVM ▪ ViewModelクラスとViewクラスは基本的に1対1の関係(例外あり) ▪ ViewModelクラスとServiceクラスはN対Nの関係 ▪ ReactivePropertyを使用することでサービスクラスの変更通知に対する ViewModelのプロパティへの反映を行う
V M V M V M V V V S S S
ReactiveProperty モデル側の プロパティ VM側のプ ロパティ Rx public RoomModel SelectedRoom{ get
{ return selectedRoom; } private set { this.SetProperty(ref this.selectedRoom, value); } } public string UserName { get { return username; } private set { this.SetProperty(ref this.username, value); } } ReadOnlyReactiveProperty<string> Title = service.ObserveProperty(x => x.SelectedRoom).Select(x => x?.Name) .CombineLatest( service.ObserveProperty(x => x.UserName), (roomname, username) => $"{username} - {roomname}" ) .ToReadOnlyReactiveProperty();
コンソールアプリの場合 ▪ ごりごり実装してみました ▪ サービスクラスの変更通知はイベントで受信してコンソール出力へ反映
まとめ ▪ これからの.NETクライアント開発はマルチプラットフォームに加えてマルチタイプ開発を 意識すると良いかもしれない ▪ モデル層はアプリケーションそのもの ▪ .NETプログラマにマルチプラットフォーム/マルチタイプ開発な環境を用意してくれて、 様々なプラットフォーム開発の知識やデザインパターンの勉強をさせてくれる凄い人た ちに
感謝っ・・・・! 圧倒的感謝っ・・・・!
ご清聴ありがとうございました。