Proponents of functional programming tout things like pure functions making testing easier and immutability reducing side-effects and more. This is all fine and well, but it ignores the biggest reason to use Object Oriented. The world is made of objects, not linear functions (well, not exactly, but a linear function that can accept all the parameters of the world would be completely unmaintainable).
Using Object Oriented Programming (OOP) is essentially creating a system that defines what is to be done (Interfaces/Abstract Classes) and how it is done (Concrete Classes). OOP breaks down an system into contracts that define interaction, and implementations that perform the actions. Objects in both OOP and the Real World interact with each other through a definable set of conditions based on Use Cases and normal behaviors, and returning exceptional behaviors as Exceptions. Pure Functions cannot express ambiguity since ambiguity is a side-effect.
For over 100 years we have had telephones. Although technology has changed dramatically, the use cases of the telephone have remained constant.
Callers dial a number, the receiver answers the call, they talk, and one of the parties hangs up.
Such a fundamentally simple system!
Though the technology has drastically evolved, a modern smart phone can call a wall mounted operator assisted phone today, and vice versa.
So why does this work? Because the world is composed of objects that implement interfaces (inheritance) with a specific functionality (encapsulation). Some devices evolve with minor changes, such as a pulse dial phone evolving into a touch tone phone (polymorphism).
Telephones are just end points in this system. Interconnecting telephones are Telephone Networks that accept call requests, figuring out how to route…