Sugeriría que la característica más importante de la programación orientada a objetos es la de la gestión de la complejidad .
El cerebro humano solo puede contener tantos conceptos a la vez: me viene a la mente el límite a menudo citado de recordar 7 +/- 2 elementos independientes.
Cuando estoy trabajando en un sistema de 600kloc en el trabajo, no puedo tener todo en mi cabeza de una vez. Si tuviera que hacer eso, estaría limitado a trabajar en sistemas mucho más pequeños.
Afortunadamente, no tengo que hacerlo. Los diversos patrones de diseño y otras estructuras que hemos utilizado en ese proyecto significan que no tengo que lidiar con todo el sistema a la vez: puedo recoger piezas individuales y trabajar en ellas, sabiendo que encajan en la aplicación más amplia de maneras bien definidas
Todos los conceptos importantes de OO proporcionan formas de gestionar la complejidad.
Encapsulación : permítame tratar con una API externa que me proporciona varios servicios, sin preocuparme de cómo se implementan esos servicios.
Abstracción : déjame concentrarme en las características esenciales e ignorar lo que no es relevante.
Composición : permítanme reutilizar componentes que ya se han construido en nuevas combinaciones.
Polimorfismo : permítame solicitar un servicio sin preocuparme de cómo los diferentes objetos podrían proporcionarlo de diferentes maneras.
Herencia : permítame reutilizar una interfaz o una implementación, proporcionando solo las piezas que son diferentes de lo que había sucedido antes.
Principio de responsabilidad única : mantengamos el propósito de cada objeto claro y conciso, por lo que es fácil razonar sobre
Prinicple de sustitución de Liskov : no dejemos trampas entre nosotros introduciendo dependencias impares
Principio abierto / cerrado : permitamos la extensión y modificación de formas que no requieran que corramos el riesgo de romper el código existente
Inyección de dependencias : llevemos la composición al siguiente nivel y ensamblemos los componentes mucho más tarde.
Desarrollo orientado a la interfaz : llevemos la abstracción al siguiente nivel y solo dependamos de la abstracción, nunca de una implementación concreta.