From Objects to Functions
Build Your Software Faster and Safer with Functional Programming and Kotlin
by Uberto Barbini
Build applications quicker and with less effort using functional
programming and Kotlin. Learn by building a complete application, from
gathering requirements to delivering a microservice architecture
following functional programming principles. Learn how to implement CQRS
and EventSourcing in a functional way to map the domain into code better
and to keep the cost of change low for the whole application life cycle.
If you’re curious about functional programming or you are struggling
with how to put it into practice, this guide will help you increase your
productivity composing small functions together instead of creating fat
objects.
Switching to the functional paradigm isn’t easy when you’re used to
object-oriented programming. You need more than just lambdas and mapping
over collections to get a declarative style and disentangle the state
from the computations. Use transformations and compositions to help you
write less code with better results. Boost your productivity and harness
the power of functional programming by creating real-world applications
rather than focusing on theoretical concepts.
Work through a series of short exercises to find and compose pure
functions, and create data structures that work like algebra. Get rid of
mutable state in your software to eliminate the main source of bugs.
Apply CQRS and EventSourcing patterns to translate stakeholder
requirements into functional design and then into code. See how Kotlin’s
easy-to-learn syntax and functional-friendly approach make it a great
option for a pragmatic language that integrates well with existing Java
code and libraries.
Leverage functional programming to build and deliver robust applications
in less time and with fewer defects.
What You Need
The code in this book is designed to allow you to build your application
from scratch on Windows, Mac and Linux. You will need a recent IDE, we
recommend IntelliJ Community Edition, and Kotlin 1.9.x or later.
Resources
Releases:
- P1.0 2023/09/12
- B7.0 2023/04/19
- B6.0 2023/01/13
- B5.0 2022/09/22
- Acknowledgments
- Preface
- Introduction: Why Functional Programming?
- Why Kotlin?
- What Functional Programming Is Really About
- Unlearning Object-Oriented Programming
- Recap
- Preparing a New Application
- Defining the Sample Application
- Zettai: An Innovative To-Do List Application
- Letting Tests Guide Development
- Setting Up the Project
- Making Unit Tests Functional
- Recap
- Exercises
- Handling HTTP Using Functions
- Kicking Off the Project
- Serving HTML Pages Functionally
- Starting Zettai
- Designing with Arrows
- Serving Lists from a Map
- Recap
- Exercises
- Defining the Domain and Testing It
- Modeling the Domain and the Adapters
- Starting a New Story to Modify a List
excerpt
- Using Functional Dependency Injection
- Debugging Functional Code
- Functional Domain Modeling
- Recap
- Exercises
- Using Events to Modify the State
- Creating and Displaying To-Do Lists
- Storing the State Changes
- Unleashing the Power of Recursion
- Folding Events
- Discovering the Monoid
- Recap
- Exercises
- Executing Commands to Generate Events
- Creating a New List
- Using Commands to Change the State
- Modeling the Domain with States and Events
- Writing Functional State Machines
- Connecting the Hub
- Understanding Commands and Events Better
- Recap
- Exercises
- Handling Errors Functionally
- Handling Errors Better
- Learning Functors and Categories
- Using Functors to Handle Errors
- Working with Outcomes
- Recap
- Exercises
- Using Functors to Project Events
- Projecting Our Events
- Running Queries on Functors
- Thinking in Terms of Functors
- Command and Query Responsibility Segregation (CQRS)
- Recap
- Exercises
- Using Monads to Persist Data Safely
- Persisting Safely
- Connecting to the Database with Kotlin
- Accessing Remote Data in a Functional Way
- Exploring the Power of Monads
- Recap
- Exercises
- Reading Context to Handle Commands
- Accessing the Database with Monads
excerpt
- Handling Commands with Context Reader
- Querying Projections from Database
- Modeling the Domain with Event Sourcing
- Recap
- Exercises
- Validating Data with Applicatives
- Renaming a List
- Transforming Functions with Two Parameters
- Validating with Validations
- Combining Applicative Functors
- Improving the User Interface
- Recap
- Exercises
- Monitoring and Functional JSON
- Monitoring Our Application
- Structured Logging
- Making JSON Functional
- Meeting Profunctors
- Logging Database Calls
- Recap
- Exercises
- Designing a Functional Architecture
- Chasing Simplicity
- Designing a Whole System
- Translating to Code
- Final Considerations
- Exercises
- What Is Functional Programming?
- The Origins
- Achieving Referential Transparency
- Think in Morphisms
- Recap
- About Functional Kotlin
- Setting Up Kotlin
- Kotlin 101
- Exploring the Kotlin Type System
- A Pinch of Theory
- Category Theory
- It’s All About Morphisms
- Types over Types
- Functors Are Mappers
- The Mysterious Monad
- Connecting Everything with Yoneda
- Conclusion
- Additional Resources
- Programming
- Category Theory
Author
Uberto is a very passionate programmer, starting when he created his
first video game on the ZxSpectrum many years ago. He worked in all
kinds of organizations, from the very big to the very small, coaching
and helping teams build software in an efficient and sustainable way to
create value for the company. He has used a range of functional
languages (Haskell, Clojure, Scala), and he is currently in love with
the simplicity of Kotlin and its productivity. He is a regular speaker
at conferences around the world on Kotlin and Java, and he enjoys
teaching courses and mentoring young programmers.