Functional Reactive Programming dengan ReactiveCocoa

34
PEMROGRAMAN REAKTIF FUNGSIONAL MENGGUNAKAN REACTIVECOCOA

description

This is my talks on last iOS meetup in Jogja Digital Valley. Slide written both in English and Bahasa indonesia.

Transcript of Functional Reactive Programming dengan ReactiveCocoa

PEMROGRAMAN REAKTIFFUNGSIONAL

MENGGUNAKAN REACTIVECOCOA

TENTANG SAYACoding sudah 8 tahun.

6 tahun terakhir memimpin tim.

Co-founder OneBit, 5x bikin startup 2 yg berhasil

Pernah kerja di BlackBerry

REACTIVECOCOAAdalah kerangka kerja untuk pemrograman reaktif fungsionalMenyediakan APA (Antarmuka Pemrograman Aplikasi) untukmengkomposisi dan mentransformasi aliran dari suatu nilai

SAPARATOZ!

REACTIVECOCOAA framework for Functional Reactive Programming. Providing

API for composing and transforming stream of values

WAIT, WHAT?

PEMROGRAMAN IMPERATIFint x = 5; int y = 3; int z = 2; z = x + y; // z = ?

y = 2;

NSLog("%@", z); // ?

PEMROGRAMAN IMPERATIFint x = 5; int y = 3; int z = 2; z = x + y; // z = ?

y = 2;

NSLog("%@", z); // ?

PEMROGRAMAN DEKLARATIFPengembang menyatakan masalah secara deklaratifFokusnya BUKAN di StateData Flow and Propagation of Change

PEMROGRAMAN FUNGSIONAL SALAH SATU CARA MEMROGRAM SECARA DEKLARATIF

Ciri-Cirinya adalah mengurangi state dan mutable data

Seperti fungsi matematika biasa.

z = f (x, y) = x + yx = 1, y = 2; z = 3x = 2; z = 4

PEMROGRAMAN REAKTIF Dynamically links the program behaviour to its continuosly updating

data stream

Contoh paling jelas : Spreadsheet

FUNGSIONAL + REAKTIF = ??links functions that observe continuous and dynamic streams of data

(inputs) to the program behaviour (outputs) in real time

REACTIVECOCOAAdalah kerangka kerja untuk pemrograman reaktif fungsionalMenyediakan APA (Antarmuka Pemrograman Aplikasi) untukmengkomposisi dan mentransformasi aliran dari suatu nilai

REACTIVECOCOAMemfasilitasi FRP di Objective-C

SEQUENCEPull-Driven

SIGNALPush-Driven

SIGNALPush-Driven

STREAM TRANSFORMATION

MAP

RACSequence *squared = [numbers.rac_sequencemap: ̂id(NSNumber *number) { return @([number intValue] * [number intValue])}];

MAP VS FORRACSequence *squared = [numbers.rac_sequencemap: ̂id(NSNumber *number) { return @([number intValue] * [number intValue])}];

NSArray *numbers = @[@4, @5, @6];NSMutableArray *mutableNums = [numbers mutableCopy];for (NSNumber *number in numbers) { [mutableNums addObject:@([number intValue] * [number intValue])];}

FLATMAP

FILTER

RACSequence *evenNums = [numbers.rac_sequencefilter: ̂BOOL(NSNumber *number) { return @( [number intValue] % 2 == 0);}];

FOLD / REDUCE

RACSequence *products = [numbers.rac_sequencefoldLeftWithStart:@1reduce:̂id( id accumulator, id value) { return @([accumulator intValue] * [value intValue]);}];

COMBINELATEST / REDUCE

APPLYING TO AN APPSTUDY CASE? FORM VALIDATION

THE "USUAL" WAY- (BOOL) isFormValid { return (self.userNameField.text.length > 0 && self.emailField.text.length > 8 && self.passwordField.text.length > 8 && [self.passwordField.text isEqual:self.passwordVerifyField.text]);}............// Kode di atas berada nun jauh di sana

#pragma mark - UITextFieldDelegate- (BOOL) textField: (UITextField *) textFieldshouldChangeCharactersInRange: (NSRange) range replacementString: (NSString*) string{ self.submitButton.enabled = [self isFormValid] return YES;}

JSON Call?Activity Indicator?Button Disable selama JSON Calldst dsb dkk dll...

RAC WAYRAC(self.submitButton, enabled) = [RACSignal combineLatest: @[ self.userNameField.rac_textSignal, self.emailField.rac_textSignal, self.passwordField.rac_textSignal, self.passwordField.rac_textSignal] reduce: ̂(NSString *userName, NSString *email, NSString *password, NSString *ver) { return @(userName.length > 0 && email.length > 8 && password.length > 8 && [password isEqual:ver]); }];

Menyatakan SEPERTI APA hubungannya secara deklaratif

DEMO / PRACTISE

SELANJUTNYA... MVC?

Cek Ray Wenderlich Tutorial tentang MVVM

REACTIVECOCOAPembuatan aplikasi lebih fokus ke data + UXMengurangi kompleksitas aplikasi, karena mengurangi peran'state'Kode yang terelasi, lebih dekatKode lebih bisa ditest (dengan MVVM, cek raywenderlich)

TAPI...Paradigma Baru dalam memrogram.Modal bikin iOS app sudah mahal, ditambah Cocoa/CocoaTouch, tambah ReactiveCocoaBuatan bukan ReactiveSwift masih dalam tahap pengembangan, Oktoberdirencanakan rilis

@lynxluna | [email protected]