$30 off During Our Annual Pro Sale. View Details »

Fight Complexity with Functional Programming

Fight Complexity with Functional Programming

More about this talk can be found here: https://overfullstack.github.io/posts/fight-complexity-with-fp/

Gopal S Akshintala

August 21, 2019
Tweet

More Decks by Gopal S Akshintala

Other Decks in Programming

Transcript

  1. overfullstack.github.io

    View Slide

  2. @GopalAkshintala
    - Some Manager (Not Mine!)
    FP is cool , coz it’s
    complex enough to make
    devs feel like they are
    doing something smart!

    View Slide

  3. @GopalAkshintala

    View Slide

  4. Dev
    Holy
    Wars
    @GopalAkshintala

    View Slide

  5. IDE Theme
    Light
    Vs
    Dark
    @GopalAkshintala

    View Slide

  6. Eclipse
    Vs
    Intellij
    @GopalAkshintala

    View Slide

  7. OOP Vs FP ?
    @GopalAkshintala

    View Slide

  8. @GopalAkshintala
    Immutability
    Referential Transparency
    Side-effects @ Boundaries
    FP Principles
    …………………………………………………
    …………………………………………………
    OOP Principles

    View Slide

  9. Imperative
    Vs
    Declarative
    JavaDev
    @GopalAkshintala

    View Slide

  10. Imperative
    Code
    -
    -
    -
    Imperative
    @GopalAkshintala

    View Slide

  11. Let’s Concatenate
    last names in a
    team with a
    delimiter
    lastName1 lastName2 lastName2
    @GopalAkshintala
    Team Building!

    View Slide

  12. @GopalAkshintala
    What about
    Corner cases?

    View Slide

  13. @GopalAkshintala
    lastName1 lastName2 lastName2

    View Slide

  14. @GopalAkshintala

    View Slide

  15. @GopalAkshintala
    Imperative Declarative

    View Slide

  16. @GopalAkshintala

    View Slide

  17. @GopalAkshintala
    Imperative Declarative

    View Slide

  18. @GopalAkshintala
    Imperative Declarative

    View Slide

  19. @GopalAkshintala
    Imperative Declarative

    View Slide

  20. @GopalAkshintala

    View Slide

  21. @GopalAkshintala

    View Slide

  22. Declarative
    Imperative
    Code
    -
    -
    -
    Imperative
    Vs
    Declarative
    @GopalAkshintala

    View Slide

  23. The FP part
    in Java
    The
    Java
    @GopalAkshintala

    View Slide

  24. How to Concatenate
    Last names in
    Parallel?
    @GopalAkshintala

    View Slide

  25. @GopalAkshintala

    View Slide

  26. How-to-dos What-to-dos
    Looping through
    the list
    Aggregating the
    results
    Validating the
    names
    Extracting last
    names
    @GopalAkshintala

    View Slide

  27. @GopalAkshintala

    View Slide

  28. The
    Context:Core
    Philosophy
    Do
    Things differently
    without
    doing
    Different things!
    @GopalAkshintala

    View Slide

  29. Stream
    Busted
    Stream
    Monad
    @GopalAkshintala

    View Slide

  30. @GopalAkshintala
    Reading about
    Functors, Monads, Applicatives !
    Kotlin Functors,
    Applicatives, And Monads
    in Pictures (3 parts)
    @Aballano

    View Slide

  31. Source
    MayBe Monad
    Context
    Nothing
    Value
    @GopalAkshintala

    View Slide

  32. Source @GopalAkshintala

    View Slide

  33. Source @GopalAkshintala

    View Slide

  34. Source @GopalAkshintala

    View Slide

  35. Source @GopalAkshintala
    f(g(h(x)))

    View Slide

  36. Monad Composability
    @GopalAkshintala

    View Slide

  37. @GopalAkshintala
    Monad Composability

    View Slide

  38. Are Monads used in
    Enterprise
    Software?
    @GopalAkshintala

    View Slide

  39. Vader
    @GopalAkshintala

    View Slide

  40. REST
    APIs
    @GopalAkshintala

    View Slide

  41. REST
    Payload
    @GopalAkshintala

    View Slide

  42. Simple Data
    Validations
    Nested
    Validations
    Stateful
    Validations
    @GopalAkshintala

    View Slide

  43. The
    Batch
    Validation
    Framework
    @GopalAkshintala

    View Slide

  44. Valid/Invalid
    @GopalAkshintala

    View Slide

  45. • Configure the order of Validations
    • Cross-Share Common & Nested
    Validations
    • Fail-Fast or Error-Accumulation
    • Partial failures
    Framework
    Requirements
    @GopalAkshintala

    View Slide

  46. @GopalAkshintala
    Validation layer
    Service layer
    DB layer
    Aggregated Response

    View Slide

  47. • Accommodate a century validations
    • Unit testability
    • No compromise on Performance
    Framework
    Meta
    Requirements
    @GopalAkshintala

    View Slide

  48. @GopalAkshintala

    View Slide

  49. One Egg
    One Validation
    Many Eggs
    One Validation
    @GopalAkshintala

    View Slide

  50. Many Eggs
    Many Validations
    !
    @GopalAkshintala

    View Slide

  51. Chaos
    @GopalAkshintala

    View Slide

  52. Chain of Responsibility
    @GopalAkshintala
    Is FP the Best Fit?

    View Slide

  53. @GopalAkshintala
    2D Problem
    Eggs
    Validations

    View Slide

  54. Making of a
    Extensible Machine
    @GopalAkshintala
    Validations Configuration Orchestration
    (What-to-do) (How-to-do) (How-to-do)

    View Slide

  55. Immutable
    Eggs
    @GopalAkshintala

    View Slide

  56. @GopalAkshintala
    Heterogeneous
    DataTypes in pipeline

    View Slide

  57. Uniform DataTypes
    with Monad Boxes
    @GopalAkshintala

    View Slide

  58. Either Monad
    Egg
    Validation Failure
    Context
    io.vavr.control.Either
    @GopalAkshintala
    Left Right

    View Slide

  59. Standardize
    Validations
    @GopalAkshintala

    View Slide

  60. @GopalAkshintala
    static boolean validate1Simple(Map badEggFailureBucketMap, int eggIndex,

    Iterator iterator, Egg eggToBeValidated) {

    if (!simpleOperation1(eggToBeValidated)) {

    iterator.remove();

    badEggFailureBucketMap.put(eggIndex, NO_EGG_TO_VALIDATE_1);

    return false;

    }

    return true;

    }
    static final Validator validate1Simple = validatedEgg "-> validatedEgg

    .filter(Operations"::simpleOperation1)

    .getOrElse(() "-> Either.left(NO_EGG_TO_VALIDATE_1));
    validate1Simple

    View Slide

  61. @GopalAkshintala
    @FunctionalInterface

    public interface Validator

    extends Function1, Either> {

    }
    Validator

    View Slide

  62. @GopalAkshintala
    private static boolean validate2Throwable(Map badEggFailureBucketMap, int eggIndex,
    Iterator iterator, Egg eggToBeValidated) {

    try {

    if (!throwableOperation2(eggToBeValidated)) {

    iterator.remove();

    badEggFailureBucketMap.put(eggIndex, TOO_LATE_TO_HATCH_2);

    return false;

    }

    } catch (Exception e) {

    iterator.remove();

    badEggFailureBucketMap.put(eggIndex, ValidationFailure.withErrorMessage(e.getMessage()));

    return false;

    }

    return true;

    }
    static final ThrowableValidator validate2Throwable = validatedEgg "-> validatedEgg

    .filterOrElse(Operations"::throwableOperation2, ignore "-> TOO_LATE_TO_HATCH_2);
    validate2Throwable

    View Slide

  63. @GopalAkshintala
    @FunctionalInterface

    public interface ThrowableValidator

    extends CheckedFunction1, Either> {

    }
    ThrowableValidator

    View Slide

  64. Configure the order of Validations
    Cross-Share Common & Nested Validations
    Fail-Fast or Error-Accumulation
    Partial failures
    Framework
    How-to-dos
    @GopalAkshintala

    View Slide

  65. @GopalAkshintala
    Lift
    ThrowableValidator
    Validator

    View Slide

  66. Configure the order of Validations
    Cross-Share Common & Nested Validations
    Fail-Fast or Error-Accumulation
    Partial failures
    Framework
    How-to-dos
    @GopalAkshintala

    View Slide

  67. @GopalAkshintala
    Lift
    childValidation: Validator
    ParentValidation: Validator

    View Slide

  68. @GopalAkshintala
    Lift
    Validator
    Validator
    Validator
    Validator


    View Slide

  69. Configure the order of Validations
    Cross-Share Common & Nested Validations
    Fail-Fast or Error-Accumulation
    Partial failures
    Framework
    How-to-dos
    @GopalAkshintala

    View Slide

  70. Transformation
    map
    flatMap
    filter
    Aggregation
    reduce
    collect
    groupBy
    zip,unzip
    foldLeft,foldRight
    scanLeft,scanRight
    @GopalAkshintala
    Dozen FP Operations for
    Daily Programming

    View Slide

  71. Configure the order of Validations
    Cross-Share Common & Nested Validations
    Fail-Fast or Error-Accumulation
    Partial failures
    Framework
    How-to-dos
    @GopalAkshintala

    View Slide

  72. Scalability?

    View Slide

  73. What about
    Complexity?
    @GopalAkshintala

    View Slide

  74. FP is NOT Complex
    It fights
    Cognitive-Complexity
    @GopalAkshintala

    View Slide

  75. @GopalAkshintala
    Min.
    Cognitive-Complexity
    Same
    Time-Complexity

    View Slide

  76. Railway-Oriented
    Programming
    Scott Wlaschin
    @GopalAkshintala

    View Slide

  77. @GopalAkshintala
    bit.ly/imp-vs-dec
    bit.ly/ro-validation
    bit.ly/fcwfp-slides
    { }

    View Slide

  78. @GopalAkshintala

    View Slide

  79. @GopalAkshintala
    [email protected]

    View Slide

  80. @GopalAkshintala

    View Slide