OO è un paradigma - una raccolta di idee / metodologie per la modellazione di soluzioni ai problemi. Puoi pensare a OO come "un approccio al problem solving", o anche a una mentalità.
Incapsulamento e modularità sono strettamente correlati tra loro. L'ereditarietà è un prerequisito per il polimorfismo. Questi concetti non si escludono a vicenda, infatti lavorano spesso insieme.
L'ereditarietà e il polimorfismo sono strumenti offerti dai linguaggi di programmazione che supportano l'OO. L'incapsulamento e la modularità riguardano il tuo design e il modo in cui strutturi il tuo codice.
Come programmatore in un linguaggio come Java o C # potresti usare l'ereditarietà e il polimorfismo per migliorare l'incapsulamento e per creare codice modulare o estendere il codice di qualcun altro senza interrompere l'incapsulamento.
L'obbiettivo di OO è aiutare gli esseri umani a gestire la complessità, e ai programmatori viene chiesto regolarmente di risolvere enormi problemi complessi che non riescono a mettere in testa tutti in una volta.
È molto più facile per gli umani risolvere i problemi quando le cose si dividono in blocchi gestibili. Quindi, quando un programma deve risolvere un enorme problema (o molti problemi enormi), è auspicabile che la soluzione sia composta da molte piccole classi o moduli autosufficienti che hanno ciascuno uno scopo chiaro e ben definito; preferendo piccole funzioni che sono molto più facili da capire rispetto a quelle con logica "gonfia".