Anche qui, le performance c'entrano molto poco.
public e private servono a separare quella che è l'interfaccia dell'oggetto (come lo vede il "mondo esterno", e quindi qual è il "contratto" con il resto del codice) e cosa è dettaglio implementativo. L'idea è che tutto ciò che è private lo posso cambiare come mi pare (a patto che la funzionalità rimanga la medesima) e nessuno al di fuori della classe se ne accorge, mentre se modifico qualcosa che è public rompo la compatibilità con il resto del codice. Analogamente, vedendo la questione "da fuori", so che posso usare ciò che è public, mentre ciò che è private non mi riguarda e lo devo lasciare stare (questo è imposto in numerosi linguaggi, mentre è solo suggerito in linguaggi come Python, dove c'è semplicemente la convenzione che i membri che iniziano con un underscore sono membri privati*).
L'idea di fondo è che è difficile scrivere codice affidabile se lo stato di un oggetto (=i valori che possono assumere i suoi campi) può cambiare in maniera completamente libera, ovvero se "dall'esterno" è possibile pasticciare i campi in qualunque maniera. Se invece la modifica dello stato della classe è ristretta ai soli metodi pubblici, è più facile scrivere una classe "a prova di bomba", ovvero che non si possa mai trovare in stati non validi, imprevisti o incoerenti. Torna anche l'idea dell'accoppiamento tra blocchi di codice "lontani": se tutto quello che può modificare i campi privati direttamente sono giusto i metodi d'istanza della classe, allora è relativamente facile prevedere cosa può succedere, capire i problemi che eventualmente si verificano e aggiungere controlli sulle modifiche che vengono fatte dall'esterno, mentre se tutti possono mettere mano a tutto si aumenta l'accoppiamento tra parti lontane di codice, che rende molto più complessa la comprensione e il debugging del programma.
Non è detto, di base la programmazione "con le funzioni" è programmazione procedurale (anche se è vero che la notazione ad oggetti in genere è in gran parte "zucchero sintattico").Originariamente inviato da American
ah allora indirettamente già programmo ad oggetti in quanto faccio sempre uso di funzioni..
---
* in realtà i nomi con due underscore sono soggetti a name mangling, che li rende "più difficili" da chiamare dall'esterno, il che in un certo senso gli dà una protezione alla "private" di altri linguaggi.