Advantages of the Object-Oriented Paradigm
Classes and objects: Classes correspond to the concepts of a problem domain and objects represent the concrete implementations of these concepts.
Encapsulation: The design can be based on interfaces and exchange objects with compatible interfaces. With encapsulation information hiding is promoted and the internals of an object remain hidden, which promotes modularity.
Inheritance: Inheritance allows us to compose and modify the characteristics of objects. It is a key mechanism for organizing hierarchical designs and achieving code reuse.
Dynamic polymorphism and dynamic binding: Using polymorphism, we can write code that works for different types. With dynamic binding, we can vary these types at runtime. These mechanisms help to achieve better reusability.
Object identity: Object identify gives us a natural way to reference objects.
Lack of analysis and design methods for reusable frameworks and class libraries.
Problems with horizontal scaling.
Problems with separation of concerns, code tangling and lack of linear modifiability. A solution to this problem is the use of AOP.
Loss of design information. Conventional programming involves the manual translation of domain concepts living in the programmer's head into a source program written in a concrete, general-purpose programming language such as C++ or Java. This translations causes important design information to be lost due to the semantic gap between the domain concepts and the language mechanisms available in the programming language.