Non esiste una definizione universale di OOP. È quindi difficile formulare una dichiarazione come "OOP ha uno stato". Esistono entrambi esempi in cui OOP include stato ed esempi in cui OOP viene utilizzato senza alcuno stato. OOP tende ad essere associato con la programmazione imperativa, che certamente consente effetti collaterali e stato mutabile.
Esiste una linea di pensiero secondo cui l'OOP riguarda l'incapsulamento. OOP non è necessario per organizzare lo stato del programma in record / strutture più piccoli. Ma se trasformiamo questi record in oggetti e incapsuliamo questi dati dietro un'interfaccia di passaggio dei messaggi, possiamo districare lo stato del programma, portando a un'architettura più disaccoppiata e modulare.
In questo modo lo stato è ancora lì, ma possiamo guardare le parti dello stato (ogni oggetto) in isolamento. Non ci saranno interferenze esterne. Se gli utenti esterni vogliono accedere o modificare lo stato, dovranno chiamare un metodo che controlliamo. Ora è più facile ragionare su un oggetto. Viceversa, gli utenti esterni devono solo conoscere l'interfaccia pubblica e non tutti i dettagli interni, il che rende anche più facile la loro vita.
Quindi si potrebbe dire che OOP è una tecnica per gestire più facilmente lo stato del programma.
L'uso di OOP per l'incapsulamento come questo si presta bene a sistemi software più grandi, almeno in teoria. Questa idea non è limitata alle istanze di singoli oggetti in un linguaggio di programmazione. Si potrebbero anche visualizzare architetture più grandi come orientate agli oggetti, ad es. in un'architettura di microservizio ogni singolo microservizio può essere interpretato come un oggetto.
Nella maggior parte dei programmi OOP-ish questa gestione dello stato non viene eseguita in modo pulito. Ogni volta che si accede a una variabile globale o si richiama una funzione statica, si sfrutta il vantaggio di disaccoppiare solo comunicando tramite chiamate di metodo. Questo tornerà a morderti se scrivi test unitari per un oggetto - qualsiasi flusso di dati attraverso membri statici è flusso di dati che non puoi intercettare, deridere e verificare.
OOP non è l'unico modo per gestire lo stato all'interno di un'applicazione più grande. Molte di queste funzionalità come "incapsulamento" sono solo un esempio del paradigma di programmazione modulare, ma non esiste una linea chiara tra programmazione modulare e orientata agli oggetti. Anziché lo stato di parcelling in blocchi più piccoli che inviano messaggi l'uno all'altro, la programmazione funzionale suggerisce di rendere tutto lo stato esplicito e immutabile. Il flusso del programma può quindi essere interpretato come trasformazioni di stato piuttosto che come mutazioni di stato.