Ci sono molti modi per vederlo. Un modo è dal punto di vista dell'astrazione dei dati. (Ho intenzione di ignorare questo aspetto dal punto di vista dei paradigmi di programmazione, dal momento che @ Robert's answer fa già un buon lavoro.) Le due forme più popolari di astrazione dei dati in uso oggi sono Tipi di dati astratti e oggetti. (In realtà, c'è una terza forma piuttosto popolare: nessuna astrazione.)
La principale differenza tra ADT e Oggetti è che le istanze ADT nascondono la loro rappresentazione da istanze di altri tipi ma non da istanze dello stesso tipo, mentre gli oggetti nascondono anche la loro rappresentazione da altri oggetti dello stesso tipo. (Se hai familiarità con Java, questa è la differenza tra le classi e le interfacce, le classi definiscono gli ADT e le interfacce definiscono gli oggetti.)
Ciò significa che a causa del più alto livello di incapsulamento, OO ha il potenziale per essere più flessibile ed estensibile. Tuttavia, gli algoritmi che richiedono l'accesso alla rappresentazione di due oggetti sono semplicemente impossibili da implementare. Ad esempio, non è possibile concatenare in modo efficiente due elenchi collegati in doppia sequenza in OO, poiché è necessario accedere sia al puntatore% ca_de% della coda della prima lista sia al puntatore next
della testa della seconda lista. Se chiami il metodo prev
della prima lista, non ha accesso agli interni della seconda lista e viceversa, l'unico modo per farlo in modo efficiente è uno degli elenchi che espongono i suoi interni all'altra, cioè l'incapsulamento OO. (È possibile naturalmente concatenare due elenchi ripetendo il secondo, cioè fallo in O (n), ma non puoi farlo in O (1).)