class ; • Μπορεί να αποθηκευτεί σε μεταβλητές • Μπορεί να περάσει ως παράμετρος • Επιστρέφει ως αποτέλεσμα • Δημιουργείται at runtime • http://en.wikipedia.org/wiki/First-class_ob
ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) ; T Cur r ent { get ; } voi d Reset ( ) ; } Τα Properties είναι μέθοδοι
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) ; T G et Cur r ent ( ) ; voi d Reset ( ) ; } Ιστορικούς Λόγους
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) ; T G et Cur r ent ( ) ; } Όχι checked exceptions στο .NET / C#
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) t hr ow s Except i on; T G et Cur r ent ( ) ; }
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) t hr ow s Except i on; T G et Cur r ent ( ) ; } Μία ακόμα πληροφορία εξόδου!
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( bool | Except i on) M oveNext ( ) ; T G et Cur r ent ( ) ; } Άρα πόσες τιμές; Υποθετικό syntax (“or”)
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( t rue | f al se | Except i on) M oveNext ( ) ; T G et Cur r ent ( ) ; } Αν λάβουμε true, τι σημαίνει;
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( T | f al se | Except i on) M oveNext ( ) ; } Αν λαμβάναμε false;
erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( T | voi d | Except i on) M oveNext ( ) ; } Κάθε enumerator είναι disposable
erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> { ( T | voi d | Except i on) M oveNext ( ) ; } Υποθετικό syntax (“and”)
erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> { ( T | voi d | Except i on) M oveNext ( ) ; } void Ανάστροφο Variance! Ας το μετονομάσουμε!
erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat orD ual < i n T> { voi d O nNext ( T | voi d | Except i on) ; } Έχουμε κάτι που παίρνει τρεις παραμέτρους και πρέπει να κληθεί σε τρεις περιπτώσεις.
erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat orD ual < i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; }
erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I O bserver< i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; } Πρέπει να αλλαχτεί και αυτό Ας το αφήσουμε ως έχει Πηγή δεδομένων
erabl eD ual < out T> { I D i sposabl e SetO bserver( I O bserver< T> observer) ; } i nt erf ace I O bserver< i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; }
bservabl e< out T> { I D i sposabl e Subscri be( I O bserver< T> observer) ; } i nt erf ace I O bserver< i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; }
Factory Methods • Extension Methods • Scheduling and Concurrency • GoF fan boys • Language geeks • Concurrency και Multithreading nerds • Testing maniacs
ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
on< i nt > E; st at i c voi d M ai n( ) { var p = new Pr ogram ( ) ; p. E + = x = > Consol e. W ri t eLi ne( x) ; p. E( 1) ; p. E( 2) ; p. E( 3) ; } } cl ass Pr ogram { I Subj ect < i nt > S = new Subj ect< i nt > ( ) ; st at i c voi d M ai n( ) { var p = new Pr ogram ( ) ; p. S. Subscri be( x = > Consol e. W ri t eLi ne( x) ) ; p. S. O nN ext ( 1) ; p. S. O nN ext ( 2) ; p. S. O nN ext ( 3) ; } }
ri ng> t ext Changed = … ; / / ω ς παράμετρος voi d Pr ocessRequest s( I O bservabl e< st ri ng> i nput ) {… } / / ω ς επι στρεφόμενη τι μή I O bservabl e< i nt > Q ueryServer( ) {… }
ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers
σε observabl e Enum erabl e. Range( 0, 3) . ToO bservabl e( ) ; 0 1 2 / / M ετατροπή observabl e σε enum erabl e O bservabl e. Range( 0, 3) . ToEnum erabl e( ) ;
ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
D at eTi m eO f f set Now { get ; } I D i sposabl e Schedul e( Act i on w ork) ; I D i sposabl e Schedul e( Ti m eSpan dueTi m e, Act i on w ork) ; I D i sposabl e Schedul e( D at eTi m eO f f set dueTi m e, Act i on w ork) ; }
e< i nt > ( 1, 10, Schedul er. Thr eadPool ) ; var q = new Sel ect O bservabl e< i nt > ( new W her eO bservabl e< i nt > ( xs, x = > x % 2 = = 0) , x = > - x) ; q. Subscri be( new Lam bdaO bserver< i nt > ( Consol e. W ri t eLi ne) ) ;
0; Act i on< obj ect > w ork = nul l ; w ork = _ = > { i f ( n < 10) { i f ( ( n + 1) % 2 = = 0) Consol e. W ri t eLi ne( - ( n + 1) ) ; n+ + ; Thr eadPool . Q ueueUserW orkI t em (nul l , w ork) ; } }; Thr eadPool . Q ueueUserW orkI t em (nul l , w ork) ;
Pool ASAP Machine Time Dispatcher UI Thread Priority FIFO Machine Time EventLoop Dedicated Thread FIFO Machine Time Immediate Current Thread Immediate Machine Time Remote Another Process FIFO Remote Machine Time
Thread Pool ASAP Machine Time Dispatcher UI Thread Priority FIFO Machine Time EventLoop Dedicated Thread FIFO Machine Time Immediate Current Thread Immediate Machine Time Remote Another Process FIFO Remote Machine Time Test Current Thread FIFO Virtual Time
onary< i nt, i nt> num bersExpected = new D i cti onary< i nt, i nt> (); D i cti onary< i nt, bool > num bersFrom B l oom = new D i cti onary< i nt, bool > (); var generator = O bservabl e. G enerate< Tupl e< R andom , i nt> , i nt> (… , schedul er). D o(val ue = > { i nt count; i f (num bers. TryG etVal ue(val ue, out count)) num bers[val ue]+ + ; el se num bers. A dd(val ue, 0); }). B l oom (100); generator . Subscri be(val ue = > num bersFrom B l oom [val ue. I tem 1]= val ue. I tem 2); schedul er . Start(); foreach (i nt num i n num bers. Val ues) { A ssert. I sTrue(num bersFrom B l oom [num ]= = (num bers[num ]> 0)); } Testing an operator with virtual clock
ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers
cks gr oup t i ck by t i ck. Sym bol i nt o sym bol St r eam f r om w i ndow i n sym bol St r eam . Buf f er( 2, 1) l et i ncr ease = Pri ceI ncr ease( w i ndow ) w her e i ncr ease > . 1 sel ect new { sym bol = sym bol St r eam . Key, i ncr ease }; LINQ: Event Processing source group aggregate apply filter reduce
ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers