Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Functional Programming for Busy Object Oriented Programmers

355 views

Published on

iOSDevUK'16 talk on how to start using FP without giving up on using OOP

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Functional Programming for Busy Object Oriented Programmers

  1. 1. Functional Programming for busy OOP Now with obligatory kitten!
  2. 2. Hello, World! • Diego Freniche 1 • @dfreniche • 100% remote dev (iOS / Android) • writing new bugs @ Mobile Jazz 1 CV: git clone http://www.github.com/dfreniche/cv
  3. 3. BASIC days • What I've already learnt at iOSDevUK'16: • I'm a dinosaur • We're getting older • Nostalgia is in the air
  4. 4. GLORY days • self taught PASCAL before starting College • just to find C was the language of choice • saw several languages: Ada, C, C++ • fell in love with C++ (pre-STL times...)
  5. 5. Wait, am I an imperative programmer? • Cursed for life ! • Spoiled by BASIC, C++ • will never get a job in CS. Ever.
  6. 6. Well maybe I can call myself a REAL OOP developer • this book is really hard to read • I mean, like really hard • that's only imperative++
  7. 7. Wait, I was taught LISP in College • You know: • Lost In Stupid Parentheses • Lots of Irritating Superfluous Parentheses • ...
  8. 8. F.P.: a new thing, right? ! • invented in the late 50's (1958) • only ALGOL is older • derived from the Lambda Calculi (developed in the 30's)
  9. 9. A word (or two) on LISP • simplest syntax in ANY programming language • Code: (+ 3 2) • List of data: '("hello", "world")
  10. 10. A word (or two) on LISP • homoiconicity: "the structure of program code is represented faithfully and directly in a standard data structure" • we have direct access to the compiler's AST • Much power. So cool. Such compiler. Wow
  11. 11. • homoiconicity == less syntax to learn • turn all your fancy { } and [ ] into ( ) and you get LISP again! • because I've never used http:// goshdarnblocksyntax.com
  12. 12. Eval: treat data like code, code like data • Eval: treat data like code, code like data CL-USER> '(+ 3 4) (+ 3 4) CL-USER> (+ 3 4) 7 CL-USER> (eval '(+ 3 4)) 7 ! https://repl.it/languages/scheme
  13. 13. Ideas piooneered by LISP • tree data structures • automatic storage management • dynamic typing • conditionals • higher-order functions • recursion • the self-hosting compiler • REPL: Read Eval Print Loop interpreter
  14. 14. Greenspun's tenth rule 2 Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp. 2 maybe the NSA, Santa Claus, Zuck and your peers who hate F.P.
  15. 15. F.P. is back! • Closures & High Order Funcions in Swift. Inmutability. Optionals. • Blocks in Objective-C to mimic Closures. • Scala • C# / F# • JavaScript?
  16. 16. Being a Functional Language vs. having Functional Constructs There's no accepted definition of functional programming language. _ If you define functional language as the language that supports first class functions and lambdas, then yes, JavaScript is a functional language.3 3 http://stackoverflow.com/questions/3962604/is-javascript-a-functional-programming-language
  17. 17. Functional Programming ... functional programming is a programming paradigm ... that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data. It is a declarative programming paradigm,
  18. 18. Functional Programming ... the output value of a function depends only on the arguments that are input to the function, so calling a function f twice with the same value for an argument x will produce the same result f(x) each time eliminating side effects https://en.wikipedia.org/wiki/Functional_programming
  19. 19. All the talks I've been before • Me: "Hi, I'm Diego, need to lose some weight" • Someone at the Gym: "No problem, you can start doing this Arnold lift weigthing routines from his training to became Mister Olympia" • Me: !
  20. 20. All the talks I've been before • I know nothing about it, but want to learn! ☝ • Functors, Monads, Functional purity, etc. " • Talks like "Type Check Removal Using Lazy Interprocedural Code Versioning" #
  21. 21. Why you hate FP? • Functional programming is declarative • we were born as imperative programmers! • say what you want, not micromanage how to do it • you're already doing it! (hating) • SQL • CSS • Regular expressions
  22. 22. OK, Something practical, please?
  23. 23. Inmutability, avoiding state, don't shoot yourself in the foot • Value types and immutability • compiler can optimize your code ! • eats more memory " • also CPU (making all those copies) " • this can be optimized • optimizes programmer's time #
  24. 24. Inmutability • Diego's constants dumb rule Declare everything as a constant, let compiler warn you when you're changing something. That's a variable. // Java: final everything final String s = ""; s = "other thing"; // nope // Swift let s: String = ""
  25. 25. Inmutability: nice to avoid mistakes - (void)printAStringReallyStupidBug:(NSString *)aString { aString = nil; // stupid mistake // really clever code // trust me, I know what I'm doing // in this 300 lines method NSLog(@"Printing: %@", aString); }
  26. 26. Inmutability func removeFromString( _ s: inout String, Character c:Character) -> Int { var nRemoved = 0 while let ix = s.characters.index(of: c) { s.removeSubrange(ix...ix) nRemoved += 1 } return nRemoved }
  27. 27. Inmutability: a clear example - (void)version1 { NSString *myString = @"iOSDevUK 16"; NSLog(@"myString BEFORE: %@", myString); // BEFORE: iOSDevUK 16 [self printAStringAllGood:myString]; NSLog(@"myString AFTER: %@", myString); // AFTER: iOSDevUK 16 NSLog(@"myString BEFORE: %@", myString); // BEFORE: iOSDevUK 16 [self printAStringReallyStupidBug:myString]; NSLog(@"myString AFTER: %@", myString); // AFTER: iOSDevUK 16 NSLog(@"myString BEFORE: %@", myString); // BEFORE: iOSDevUK 16 [self printAStringEvilBug:&myString]; NSLog(@"myString AFTER: %@", myString); // AFTER: iOSDevUK 16 } - (void)printAStringAllGood:(NSString *)aString { NSLog(@"Printing: %@", aString); } - (void)printAStringReallyStupidBug:(NSString *)aString { aString = nil; // stupid mistake NSLog(@"Printing: %@", aString); } - (void)printAStringEvilBug:(NSString **)aString { *aString = @"HaHa"; NSLog(@"Printing: %@", *aString); }
  28. 28. Inmutability lessons • learn to use debug breakpoints • change your code to call that function • we can use blocks, function pointers, Swift closures... • a little tradegy in that backward language NSString const *myString = @"iOSDevUK 16"; ⚠ Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
  29. 29. Inmutability: don't use ++ var i = 0 print("( ++i )") • direct translation from assembler INC • does several things at once • hard to reason about • nice syntax !
  30. 30. Optionals are not a new thing • non-optionals are the new thing! class Person { var name: String // compiler ERROR: you can't fool me! }
  31. 31. Optionals are not a new thing class Politician: Hyena { // still compiler ERROR }
  32. 32. High order functions • Functions that take functions as parameters • Map, Filter, Reduce, Flatmap • Let's do something with these fruits
  33. 33. Map • "Do THIS to every single element in the list" • add 1 to every element in this list • takes a function (add one) & a list • returns a list • with a basket of fruit: peel every fruit in this basket • think of SQL update
  34. 34. Map example let basket = ["!", """, "#", "$", "%"] basket.map { (e: String) -> String in return "&" + e }
  35. 35. Map Benefits • map is a level of indirection • can be run in parallel (applying a function on element n doesn't depend on element n+1)
  36. 36. Filter • "I only want oranges from that basket" • SQL select WHERE clause
  37. 37. Filter example • "I only want Apples" let basket = ["!", """, "#", "$", "%", "&"] let newBasket = basket.filter { $0 == "!" || $0 == "&" }
  38. 38. Reduce • takes a function (add) & a list • returns just one element • make multi-fruit juice • think of AVG function in SQL
  39. 39. Reduce example let numbers = [1, 2, 3, 4, 5, 6] numbers.reduce(0, combine: +) --> 21
  40. 40. Flatmap • Like map, but also "flattens" the list • some of the fruits in the basket are wrapped with paper
  41. 41. Flatmap example // how do you add 2 to all the numbers in this array? let fa2 = [[1,2],[3],[4,5,6]] let fa2m = fa2.flatMap({$0}).map({$0 + 2}) fa2m
  42. 42. This is from Clean Coding... or not • Functions should be: • Small • Smaller than that • < 150 chars per line • < 20 lines
  43. 43. Inject all your parameters • even if you're using properties from your own class • makes everything inmediately testable • no side effects: everything is clear when calling • you get your own Domain Specific Language to express your problem
  44. 44. So what? • you don't need to be an athlete to run and be healthier • you don't need to be pure to benefit from some FP goodness
  45. 45. So what? • use inmutable structures where possible • in Java, for example, final everything • in Swift, prefer structs (value types) vs classes (reference types)
  46. 46. So what? • map / filter / reduce helps sometimes • think of it as having SQL at your fingertips • not everything is a for loop
  47. 47. Use the best of OOP + the best of FP. Nobody will ever know. 2 2 maybe the NSA, Santa Claus, Zuck and your peers who hate F.P.
  48. 48. Thanks! • No Trademarks were hurt during the making of this talk. • all trademarks belong to their owners, so please don't sue me.
  49. 49. Additional reading • A really good post on what F.P. is (with Swift examples!) http:// five.agency/functional-programming-in-swift/ • A parallel map implementation: http:// moreindirection.blogspot.com.es/2015/07/gcd-and-parallel- collections-in-swift.html

×