Slide 1

Slide 1 text

.NET Conf Learn. Imagine. Build. .NET Conf 響應式程式開發之 .NET Core 應用 (Reactive Programming with .NET Core) Blackie Tsai

Slide 2

Slide 2 text

.NET Conf 這場不會深入的討論如何把 Code 寫好寫滿

Slide 3

Slide 3 text

.NET Conf 主要是介紹 Reactive Programming

Slide 4

Slide 4 text

.NET Conf 並透過實際展示,認識 Reactive Programming

Slide 5

Slide 5 text

.NET Conf Reactive Programming 是一種編碼風格

Slide 6

Slide 6 text

.NET Conf 讓我們用一種更合適的方式 撰寫某些情境的程式

Slide 7

Slide 7 text

.NET Conf

Slide 8

Slide 8 text

.NET Conf

Slide 9

Slide 9 text

.NET Conf

Slide 10

Slide 10 text

.NET Conf

Slide 11

Slide 11 text

.NET Conf 介紹 Reactive Programming 展示 更多 Reactive 上手 Rx.NET 介紹 Reactive Extensions

Slide 12

Slide 12 text

.NET Conf https://goo.gl/5Ds44R https://goo.gl/57By8J

Slide 13

Slide 13 text

.NET Conf (https://blackie1019.github.io/) .NET JAVASCRIPT

Slide 14

Slide 14 text

.NET Conf 什麼是 Reactive Programming?

Slide 15

Slide 15 text

.NET Conf

Slide 16

Slide 16 text

.NET Conf

Slide 17

Slide 17 text

.NET Conf

Slide 18

Slide 18 text

.NET Conf

Slide 19

Slide 19 text

.NET Conf int a = 2; int b = 3; int c = a + b; Console. WriteLine("before: the value of c is {0}",c); a=2; b=7; Console. WriteLine("after: the value of c is {0}",c); 以下程式結果為何?

Slide 20

Slide 20 text

.NET Conf before: the value of c is 5 after: the value of c is 5 正常來說…

Slide 21

Slide 21 text

.NET Conf before: the value of c is 5 after: the value of c is 9 但有時候我們期望能出現以下結果

Slide 22

Slide 22 text

.NET Conf

Slide 23

Slide 23 text

.NET Conf

Slide 24

Slide 24 text

.NET Conf

Slide 25

Slide 25 text

.NET Conf Reactive Programming 是 學習如何與周遭事件進行非 同步開發

Slide 26

Slide 26 text

.NET Conf Reactive Programming 是 學習將事件當作資料流 (Stream)進行操作

Slide 27

Slide 27 text

.NET Conf

Slide 28

Slide 28 text

.NET Conf

Slide 29

Slide 29 text

.NET Conf 當到此資料流結束 發生一個錯誤 某一個click event 時間

Slide 30

Slide 30 text

.NET Conf Again, 什麼是 Reactive Programming?

Slide 31

Slide 31 text

.NET Conf Console.Write("Press input A:"); var a = Convert.ToInt32(Console.ReadLine()); Console.Write("Press input B:"); var b = Convert.ToInt32(Console.ReadLine()); var c = a+b; Console.WriteLine("before: the value of c is {0}",c); Console.Write("Press input B again:"); b = Convert.ToInt32(Console.ReadLine()); c = a+b; Console.WriteLine("after: the value of c is {0}",c); Imperative programming

Slide 32

Slide 32 text

.NET Conf while (true) { Console.Write("Press input A:"); var a = Convert.ToInt32(Console.ReadLine()); Console.Write("Press input B:"); var subscription = Observable .FromAsync(() => Console.In.ReadLineAsync()) .Subscribe(b => Console.WriteLine("the value of c is {0}",a+Convert.ToInt32(b))); Console.Write("enter symbol (or x to exit): "); … } Reactive programming

Slide 33

Slide 33 text

.NET Conf 為什麼要考慮使用Reactive Programming?

Slide 34

Slide 34 text

.NET Conf

Slide 35

Slide 35 text

.NET Conf https://www.reactivemanifesto.org/ Message Driven 透過非同步訊息溝通達到模組隔離 與委託處理 Responsive 系統在任何情況下,都能及時響應 Resilient 系統在異常時,具有容錯性 Elastic 系統能依據需求彈性拓展

Slide 36

Slide 36 text

.NET Conf 再繼續講主題前,讓我們離 題一下認識 Functional Programming

Slide 37

Slide 37 text

.NET Conf

Slide 38

Slide 38 text

.NET Conf

Slide 39

Slide 39 text

.NET Conf C# 範例 Building building = SomeQueryThatShouldReturnBuilding(); var phoneNumber = null; // Object-Oriented Programming if(building != null){ if(building.Manager.ContactInfo != null){ if(building.Manager.ContactInfo.PhoneNumber != null){ phoneNumber = building.Manager.ContactInfo.PhoneNumber; } } } // Functional Programming phoneNumber = SomeQueryThatShouldReturnBuilding() .With(b=>b.Manager) .With(m=>m.ContactInfo) .With(c=>c.PhoneNumber);

Slide 40

Slide 40 text

.NET Conf [1, 4, 9].map(Math.sqrt).map( function(x){ return x + 1 } ); => [2, 3, 4] JavaScript 範例

Slide 41

Slide 41 text

.NET Conf Object-Oriented Programming Functional Programming 程式開發抽象的核心 資料結構 函式 資料與操作的關係 緊耦合 鬆耦合 溝通方式 物件(Objects) 透過介面 函式(Functions)透過協定 是否有狀態 有狀態(Stateful) 無狀態(Stateless) 回應值是否透明、可預測 回應值由輸入與狀態確定 回應值總是由輸入確定 核心活動 通過向其添加新方法來組合新的物件對象和 擴展現有物件對象 撰寫更多新函式

Slide 42

Slide 42 text

.NET Conf

Slide 43

Slide 43 text

.NET Conf • 我已經在使用aync與await做開發了,沒有必要採 用其他框架來達到異部處理的需求了 • 因為牽涉到開發架構與框架,一旦採用了就沒有回 頭路了 • 因為牽涉到開發架構與框架,一旦採用了就沒有回 頭路了

Slide 44

Slide 44 text

.NET Conf 介紹 Reactive Extensions

Slide 45

Slide 45 text

.NET Conf http://reactivex.io/

Slide 46

Slide 46 text

.NET Conf Rx 是結合 觀察器模式, 迭代器模式與函 數編程的函式庫、框架與開 發方式。 觀察器模式, 迭代器模式與函 數編程

Slide 47

Slide 47 text

.NET Conf

Slide 48

Slide 48 text

.NET Conf

Slide 49

Slide 49 text

.NET Conf

Slide 50

Slide 50 text

.NET Conf RxJava RxJS Rx.NET UniRx RxScala RxClojure RxCpp RxLua Rx.rb RxPY RxGo RxGroovy RxJRuby RxKotlin RxSwift RxPHP reaxive RxDart RX for Xamarin(Rx.NET) RxAndroid RxCocoa RxNetty

Slide 51

Slide 51 text

.NET Conf

Slide 52

Slide 52 text

.NET Conf https://github.com/Reactive-Extensions/Rx.NET PM> Install-Package System.Reactive 或 > dotnet add package System.Reactive --version 4.0.0-preview00001

Slide 53

Slide 53 text

.NET Conf Lab_00 - Reactive Programming Example Talk is cheap. Show me the code !

Slide 54

Slide 54 text

.NET Conf Rx 是結合 觀察器模式, 迭代器模式與函 數編程的函式庫、框架與開 發方式。 Rx = Observables + LINQ + Schedulers

Slide 55

Slide 55 text

.NET Conf 大话设计模式之观察者模式

Slide 56

Slide 56 text

.NET Conf

Slide 57

Slide 57 text

.NET Conf

Slide 58

Slide 58 text

.NET Conf

Slide 59

Slide 59 text

.NET Conf

Slide 60

Slide 60 text

.NET Conf

Slide 61

Slide 61 text

.NET Conf 大话设计模式 - 迭代器模式之看芒果台還是央视nie?

Slide 62

Slide 62 text

.NET Conf L IN Q

Slide 63

Slide 63 text

.NET Conf

Slide 64

Slide 64 text

.NET Conf

Slide 65

Slide 65 text

.NET Conf Lab_01 – HelloWorld on Rx.NET Talk is cheap. Show me the code!

Slide 66

Slide 66 text

.NET Conf Rx.NET 核心觀念

Slide 67

Slide 67 text

.NET Conf 拉取(PULL)

Slide 68

Slide 68 text

.NET Conf 推播(PUSH)

Slide 69

Slide 69 text

.NET Conf

Slide 70

Slide 70 text

.NET Conf

Slide 71

Slide 71 text

.NET Conf Rx.NET 主要資料結構

Slide 72

Slide 72 text

.NET Conf

Slide 73

Slide 73 text

.NET Conf IObservable subject = new [] { "Jordan", "Kobe", "James"}.ToObservable(); IObservable subject = Observable.FromAsync (() => Console.In.ReadLineAsync ()); IObservable subject = Observable.Range(5, 8); IObservable subject = from i in Observable.Range(1, 100) from j in Observable.Range(1, 100) from k in Observable.Range(1, 100) where k * k == i * i + j * j select new { a = i, b = j, c = k }; IObservable subject = Observable.Timer(TimeSpan.FromSeconds(3)); Subject

Slide 74

Slide 74 text

.NET Conf // System.Runtime.dll public interface IObservable { IDisposable Subscribe(IObserver observer); } IObservable

Slide 75

Slide 75 text

.NET Conf // System.Runtime.dll public interface IObserver { void OnNext(T value); void OnCompleted(); void OnError(Exception exception); } IObserver

Slide 76

Slide 76 text

.NET Conf // System.Runtime.dll public interface IDisposable { void Dispose(); } IDisposable

Slide 77

Slide 77 text

.NET Conf // System.Reactive.Interfaces.dll public interface IScheduler { DateTimeOffset Now { get; } IDisposable Schedule(TState state, Func action); IDisposable Schedule(TState state, TimeSpan dueTime, Func action); IDisposable Schedule(TState state, DateTimeOffset dueTime, Func action); } ISchedule

Slide 78

Slide 78 text

.NET Conf Lab_02 - IObservable and IObserver with Rx.NET Talk is cheap. Show me the code !

Slide 79

Slide 79 text

.NET Conf Rx Asynchronous programming model Events Delegates Tasks IEnumerable

Slide 80

Slide 80 text

.NET Conf Rx.NET 方法

Slide 81

Slide 81 text

.NET Conf

Slide 82

Slide 82 text

.NET Conf

Slide 83

Slide 83 text

.NET Conf

Slide 84

Slide 84 text

.NET Conf Rx.NET 常見操作子

Slide 85

Slide 85 text

.NET Conf

Slide 86

Slide 86 text

.NET Conf

Slide 87

Slide 87 text

.NET Conf

Slide 88

Slide 88 text

.NET Conf

Slide 89

Slide 89 text

.NET Conf

Slide 90

Slide 90 text

.NET Conf

Slide 91

Slide 91 text

.NET Conf

Slide 92

Slide 92 text

.NET Conf http://rxmarbles.com/

Slide 93

Slide 93 text

.NET Conf http://rxwiki.wikidot.com/101samples

Slide 94

Slide 94 text

.NET Conf • Lab_03 - Advance with Rx.NET Talk is cheap. Show me the code !

Slide 95

Slide 95 text

.NET Conf

Slide 96

Slide 96 text

.NET Conf

Slide 97

Slide 97 text

.NET Conf

Slide 98

Slide 98 text

.NET Conf Lab_04 - Stock Monitoring with Rx.NET Lab_05 - MQTT with Rx.NET Lab_06 - Xamarin with Rx.NET Showcases

Slide 99

Slide 99 text

.NET Conf https://reactiveui.net/

Slide 100

Slide 100 text

.NET Conf https://github.com/Reactive-Extensions/RxJS Draggable UI Auto Completed 出處 :2017 iT 邦幫忙鐵人賽 : 30 天精通 RxJS

Slide 101

Slide 101 text

.NET Conf “Do not forget nor dwell on the past, but do forgive it. Be aware of the future but do no fear or worry about it. Focus on the present moment, and that moment alone.”

Slide 102

Slide 102 text

.NET Conf 常見疑問

Slide 103

Slide 103 text

.NET Conf 或是 必 定 函数式反应型编程(FRP) —— 实 时互动应用开发的新思路

Slide 104

Slide 104 text

.NET Conf

Slide 105

Slide 105 text

.NET Conf

Slide 106

Slide 106 text

.NET Conf Intro to Rx Cloud-Scale Event Processing with the Reactive Extensions (Rx) - Bart De Smet The introduction to Reactive Programming you've been missing A Playful Introduction to Rx by Erik Meijer [YouTube] Playlist - Reactive Extensions for .NET (Rx.NET)

Slide 107

Slide 107 text

.NET Conf Rx.NET in Action: With examples in C# .NET Design Patterns Introduction to Rx: A step by step guide to the Reactive Extensions to .NET

Slide 108

Slide 108 text

.NET Conf fb.com/Study4.tw fb.com/groups/216312591822635 Study4.TW

Slide 109

Slide 109 text

.NET Conf

Slide 110

Slide 110 text

.NET Conf 商業思維 出差意願 (非必備) 多語溝通 (非必備) 領導/溝通 能力 高流量網商 HA/雲架構 網站、資料庫 效能校調 Infra 知識 系統分析 系統設計 DevOps 經驗

Slide 111

Slide 111 text

.NET Conf