Je dirais que la caractéristique la plus importante de la programmation orientée objet est celle de la gestion de la complexité .
Le cerveau humain ne peut contenir que de nombreux concepts à la fois - la limite souvent citée de se souvenir de 7 +/- 2 éléments indépendants vient à l'esprit.
Lorsque je travaille sur un système 600kloc au travail, je ne peux pas tout garder en tête à la fois. Si je devais le faire, je serais limité à travailler sur des systèmes beaucoup plus petits.
Heureusement, je n'ai pas à le faire. Les différents modèles de conception et autres structures que nous avons utilisés sur ce projet signifient que je n'ai pas à traiter l'ensemble du système à la fois - je peux ramasser des pièces individuelles et les travailler, sachant qu'elles s'intègrent dans l'application plus large de manière bien définie.
Tous les concepts OO importants permettent de gérer la complexité.
Encapsulation - permettez-moi de traiter avec une API externe qui me fournit divers services, sans se soucier de la façon dont ces services sont mis en œuvre.
Abstraction - permettez-moi de me concentrer sur les caractéristiques essentielles et d'ignorer ce qui n'est pas pertinent.
Composition - permettez-moi de réutiliser des composants qui ont déjà été construits dans de nouvelles combinaisons
Polymorphisme - permettez-moi de demander un service sans vous soucier de la façon dont différents objets peuvent le fournir de différentes manières.
Héritage - permettez-moi de réutiliser une interface ou une implémentation, fournissant uniquement les éléments qui sont différents de ce qui était auparavant.
Principe de responsabilité unique - permet de garder l'objectif de chaque objet clair et concis, il est donc facile de raisonner
Liskov Substitution Prinicple - ne posons pas de pièges les uns aux autres en introduisant des dépendances étranges
Principe ouvert / fermé - autorisons l'extension et la modification d'une manière qui ne nous oblige pas à risquer de casser le code existant
Injection de dépendance - prenons la composition au niveau supérieur et assemblons les composants ensemble beaucoup plus tard.
Développement orienté interface - prenons l'abstraction au niveau supérieur et ne dépendons que de l'abstraction, jamais d'une implémentation concrète.