Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dysfunctional Programming (phpnw13)

Dysfunctional Programming (phpnw13)

Igor Wiedler

October 05, 2013
Tweet

More Decks by Igor Wiedler

Other Decks in Programming

Transcript

  1. Dysfunctional
    Programming

    View Slide

  2. @igorwesome

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. Immuteability: The property of functional
    programmers that prevents them from shutting up
    about pure functional programming.
    – Reg Braithwaite
    @raganwald

    View Slide

  7. dys·func·tion·al

    View Slide

  8. php λ

    View Slide

  9. Paradigms

    View Slide

  10. procedural
    Object-
    Oriented
    functional logic

    View Slide

  11. Imperative
    Declarative

    View Slide

  12. Structure
    Time & State

    View Slide

  13. Structure

    View Slide

  14. View Slide

  15. ‘sup?

    View Slide

  16. View Slide

  17. it’s not about the money

    View Slide

  18. • Message passing
    • Interfaces
    • Composition
    • (Not inheritance)

    View Slide

  19. Actor model:
    Asynchronous

    View Slide

  20. View Slide

  21. View Slide

  22. f g h

    View Slide

  23. tools and materials

    View Slide

  24. • Value semantics
    • Higher-order functions
    • Lazy evaluation

    View Slide

  25. The Garbage
    Overfloweth

    View Slide

  26. $numberCollection = new NumberCollection();
    $numberParser = new SimpleNumberStringParser();
    $firstParsedNumber = $numberParser->parse('1');
    $firstNumber = new SimpleNumber($firstParsedNumber);
    $firstNumberProxy = new CollectionItemNumberProxy($firstNumber);
    $numberCollection->add($firstNumberProxy);
    $secondParsedNumber = $numberParser->parse('1');
    $secondNumber = new SimpleNumber($secondParsedNumber);
    $secondNumberProxy = new CollectionItemNumberProxy($secondNumber);
    $numberCollection->add($secondNumberProxy);
    $addition = new AdditionOperator('SimplePHPEasyPlus\Number\SimpleNumber');
    $operation = new ArithmeticOperation($addition);
    $engine = new Engine($operation);
    $calcul = new Calcul($engine, $numberCollection);
    $runner = new CalculRunner();
    $runner->run($calcul);
    $result = $calcul->getResult();
    $numericResult = $result->getValue();

    View Slide

  27. 1 + 1

    View Slide

  28. Composition

    View Slide

  29. c
    a b
    a b

    View Slide

  30. a b c

    View Slide

  31. Higher-order functions

    View Slide

  32. Dependency Injection

    View Slide

  33. Inversion of control is really just a pretentious
    way of saying “Taking an argument”.
    – Rúnar Óli
    @runarorama

    View Slide

  34. Taking an argument

    View Slide

  35. g g’

    View Slide

  36. 0
    1
    2
    3
    4
    even?
    0
    2
    4

    View Slide

  37. 0
    1
    2
    3
    4
    #(+ 5 %)
    5
    7
    9
    6
    8

    View Slide

  38. 3
    6
    7
    9
    +
    0
    9
    25
    3
    16
    acumulator

    View Slide

  39. Datastructures

    View Slide

  40. Number 42
    String "Hello, cruel world."
    Map
    {:foo "bar",
    :baz "qux"}
    List [:a :b :c]
    Set
    #{"Arthur Dent"
    "Ford Prefect"}

    View Slide

  41. function is a means of
    abstraction

    View Slide

  42. data is a means of
    abstraction

    View Slide

  43. Structure
    Time & State

    View Slide

  44. Time & State

    View Slide

  45. Place-Oriented
    Programming

    View Slide

  46. View Slide

  47. View Slide

  48. View Slide

  49. View Slide

  50. identity

    View Slide

  51. new Foo("x") !== new Foo("x")

    View Slide

  52. defensive copy

    View Slide

  53. $users = new UserList();
    $users->add(new User("Igor"));
    notify($users);

    View Slide

  54. while (count($users)) {
    $user = $users->shift();
    notifyUser($user);
    }

    View Slide

  55. notify(clone $users)

    View Slide

  56. observation

    View Slide

  57. $user->getName()

    View Slide

  58. $user["name"]

    View Slide

  59. Value

    View Slide

  60. Primitives

    View Slide

  61. Value Object

    View Slide

  62. date address money
    response
    request

    View Slide

  63. serialization

    View Slide

  64. History

    View Slide

  65. Objects are forgetful

    View Slide

  66. $sophie->setName("Joanna")

    View Slide

  67. 2013-09-13 01:01:47 Sophie
    2013-09-13 01:02:25 Joanna
    2013-09-13 01:05:31 Caroline

    View Slide

  68. $joanna = $sophie->setName("Joanna")

    View Slide

  69. Git

    View Slide

  70. 98ca9 34ac2 f30ab
    master
    Snapshot A Snapshot B Snapshot C

    View Slide

  71. Epochal Time Model

    View Slide

  72. v1 v2 v3 v4
    f f f
    identity states
    events

    View Slide

  73. Lazy evaluation

    View Slide

  74. Iterator
    Generator
    Stream

    View Slide

  75. a
    b
    c
    d
    a’
    b’
    c’
    d’
    consume

    View Slide

  76. Order of execution
    becomes implicit

    View Slide

  77. ๏ filter
    ๏ map
    ๏ reduce

    View Slide

  78. What about I/O?

    View Slide

  79. Filesystem
    Database
    Network
    }is a place

    View Slide

  80. Separate I/O from
    computation

    View Slide

  81. View Slide

  82. What about testing?

    View Slide

  83. But I heard static
    methods are untestable
    and evil

    View Slide

  84. You cannot mock
    functions

    View Slide

  85. Why do we mock?

    View Slide

  86. Functions are fast

    View Slide

  87. Impure parts are
    mocked by passing
    functions

    View Slide

  88. my_beautiful_program(function () {
    return do_evil_shit();
    })

    View Slide

  89. Pure functions are
    inherently testable

    View Slide

  90. But functions make code
    look awkward!

    View Slide

  91. strlen(get_name(get_user($data)))

    View Slide

  92. $data |> get_user |> get_name |> strlen

    View Slide

  93. pipeline('get_user', 'get_name', 'strlen')

    View Slide

  94. But PHP does not properly
    support functions!

    View Slide

  95. use function igorw\edn\parse;
    $data = parse($edn);

    View Slide

  96. PHP 5.6 will hopefully
    get function autoloading

    View Slide

  97. Applicability of the
    functional paradigm

    View Slide

  98. f g
    h
    i
    j
    k
    l

    View Slide

  99. A
    foo
    foo
    foo
    foo
    B
    foo
    foo
    C
    foo
    foo
    D
    foo
    foo
    E
    foo
    foo

    View Slide

  100. Granularity

    View Slide

  101. View Slide

  102. Queue

    View Slide

  103. ๏ Value semantics
    ๏ Higher-order functions
    ๏ Lazy evaluation

    View Slide

  104. pure
    functions

    View Slide

  105. View Slide

  106. Questions?
    • joind.in/{ 9471, 9472 }
    • github.com/igorw/edn
    • github.com/nikic/iter
    • @igorwesome

    View Slide

  107. References
    • The Paradigms of Programming
    by Robert W. Floyd
    • Execution in the Kingdom of Nouns
    by Steve Yegge
    • The Value of Values
    by Rich Hickey
    • Are we there yet?
    by Rich Hickey

    View Slide