Suggerirei che la caratteristica più importante della programmazione orientata agli oggetti è quella della gestione della complessità .
Il cervello umano può contenere così tanti concetti alla volta - mi viene in mente il limite spesso citato di ricordare 7 +/- 2 oggetti indipendenti.
Quando lavoro su un sistema 600kloc al lavoro, non riesco a tenere tutto in testa in una volta. Se dovessi farlo, mi limiterei a lavorare su sistemi molto più piccoli.
Fortunatamente, non devo. I vari modelli di progettazione e altre strutture che abbiamo utilizzato in quel progetto significano che non devo occuparmi di tutto il sistema in una volta - posso raccogliere singoli pezzi e lavorarci su, sapendo che si adattano all'applicazione più ampia in modi ben definiti.
Tutti i concetti OO importanti forniscono modi per gestire la complessità.
Incapsulamento : permettimi di gestire un'API esterna che mi fornisce vari servizi, senza preoccuparmi di come vengono implementati.
Astrazione : lasciami concentrare sulle caratteristiche essenziali e ignora ciò che non è rilevante.
Composizione : permettimi di riutilizzare i componenti che sono già stati creati in nuove combinazioni
Polimorfismo : lasciami chiedere un servizio senza preoccuparmi di come oggetti diversi potrebbero fornirlo in modi diversi.
Ereditarietà : consentitemi di riutilizzare un'interfaccia o un'implementazione, fornendo solo i pezzi che sono diversi da ciò che è accaduto prima.
Principio unico di responsabilità : consente di mantenere chiaro e conciso lo scopo di ciascun oggetto, quindi è facile ragionare
Principio della sostituzione di Liskov - non gettiamo trappole l'una con l'altra introducendo strane dipendenze
Principio aperto / chiuso : consentiamo l'estensione e la modifica in modi che non ci richiedono di rischiare di violare il codice esistente
Iniezione delle dipendenze : portiamo la composizione al livello successivo e assembliamo i componenti molto più tardi.
Sviluppo orientato all'interfaccia : portiamo l'astrazione al livello successivo e dipendiamo solo dall'astrazione, mai da un'implementazione concreta.